Scaricare la presentazione
1
Acquisizione dati con ADC 0831 e PIC 16F84
Esempio di uso di un convertitore analogico digitale con uscita seriale controllato da un PIC 16F84 e visualizzazione della conversione su 8 led Schema elettrico Temporizzazione del convertitore Software di controllo del convertitore Simulazione e collaudo
3
Per usare il ADC 0831 occorre generare un segnale di clock ed abilitare la conversione con un segnale CS attivo basso. ADC 0831, dopo CS basso, fornisce un bit 0 (start) seguito dagli 8 bit che rappresentano la codifica digitale del segnale analogico in ingresso, seguito dal bit di stop. Questi segnali possono essere prodotti da dispositivi integrati, dal PIC o software (mediante le linee output seriale o parallela).
4
Controllo dell’ADC 0831 tramite PIC (assembler)
out Ck RA1 CS RA2 inp D0 RA3 RS232 PORTB 8 led Codice assembler RA1 basso : il primo clock a vuoto per perdere il bit di start 8 cicli di clock 8 bit del dato da acquisire RA1 alto: fine conversione
5
Controllo dell’ADC 0831 tramite PIC (C)
#include "0831_c.h" void main() { char indice; short bbit; char dato; dato=0; setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); while(1) delay_ms(1000); output_bit(PIN_A1,1); //CS alto delay_us(100); output_bit(PIN_A0,1); output_bit(PIN_A1,0); //CS basso output_bit(PIN_A0,0); //CK basso, butta primo bit for(indice=8;indice>0;--indice) { output_bit(PIN_A0,1); output_bit(PIN_A0,0); delay_us(10); bbit=input(PIN_A2); if (bbit==1) bit_set(dato,indice); else bit_clear(dato,indice); //delay_us(4); } output_b(dato); putc(dato); RA0 out Ck RA1 CS RA2 inp D0 RA3 RS232 PORTB Out 8 led #include <16F84A.h> #FUSES NOWDT //No Watch Dog Timer #FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD #FUSES NOPUT //No Power Up Timer #FUSES NOPROTECT //Code not protected from reading #use delay(clock= ) #use rs232(baud=9600,parity=N,xmit=PIN_A3,rcv=PIN_A4,bits=8) Il programma scritto in C permette di acquisire il dato seriale sul pin RA2, bit a bit, memorizzarlo in una variabile (dato),scrivere il dato sulla porta B e trasmetterlo via RS232 al PC che lo acquisisce tramite un programma in Visual Basic
6
Software di acquisizione RS232
Private Sub cmdesci_Click() Dim uscita As String uscita = MsgBox("sei sicuro?", vbInformation + vbOKCancel, "Stai uscendo") If uscita = vbOK Then MSComm1.PortOpen = False End End If End Sub Private Sub Form_Load() MSComm1.CommPort = 1 'Porta com1 MSComm1.Settings = "9600,n,8,1" On Error Resume Next MSComm1.PortOpen = True If Err Then MsgBox "Impossibile aprire la porta n " & MSComm1.CommPort & vbCrLf & Error$, vbCritical, "Attenzione" MSComm1.RThreshold = 1 Private Static Sub MSComm1_OnComm() Select Case MSComm1.CommEvent ' Event messages. Case comEvReceive Dim Buffer As Variant MSComm1.InputMode = comInputModeBinary Buffer = MSComm1.Input List2.AddItem StrConv(Buffer, vbUnicode) List3.AddItem Asc(StrConv(Buffer, vbUnicode)) List1.AddItem Format(5 * Asc(StrConv(Buffer, vbUnicode)) / 256, "0.##") End Select
7
Controllo dell’ADC 0831 da LPT (Visual Basic)
pin Bit REGISTRO INDIRIZZO 2 D0 => b0 DR=>data register 0x378 3 D1 => b1 4 D2 => b2 5 D3 => b3 6 D4 => b4 7 D5 => b5 8 D6 => b6 9 D7 => b7 1 STROBE b0 CR=>control register 0x37A 14 LFEED b1 11 BUSY b7 SR=>status register 0x379 10 ACK b6 12 PAPER b5 13 SELECT b4
8
Controllo dell’ADC 0831 da LPT (Visual Basic)
Option Explicit Dim IO As NINOUT32.CNINOUT32 Dim ind_porta As Long Dim scala As Single Dim vref As Single Dim errore As Single Private Sub cmd_enable_Click() Call IO.BitSet(ind_porta, 3) 'fissa CS=1 cmd_enable.Enabled = False cmd_acquisisci.Enabled = True End Sub Private Sub cmd_acquisisci_Click() Dim j As Integer Dim appoggio As Byte Dim bit(0 To 7) As Byte Dim vmis As Single Call IO.BitReset(ind_porta, 3) 'fissa CS=0 inizio conversione Call IO.BitSet(ind_porta, 1) 'Ck=1 Call IO.BitReset(ind_porta, 1) 'Ck=0 perde il bit di start For j = 7 To 0 Step -1 Call IO.BitReset(ind_porta, 1) 'Ck=0 bit(j) = IO.Inp(ind_porta + 1) \ 128 Next j bit(j) = bit(j) Xor 1 lblbit(j).Caption = bit(j) vmis = Round((bit(j) * 2 ^ j) * scala + vmis, 2) Call IO.BitSet(ind_porta, 3) 'fissa CS=0 inizio conversione Label1.Visible = True lblv.Caption = Format(vmis, "0.00") & " V" Private Sub Form_Load() ind_porta = 888 Set IO = New NINOUT32.CNINOUT32 spegni vref = 5 scala = vref / 256 End Sub Private Sub Form_Unload(Cancel As Integer) Set IO = Nothing Private Sub spegni() Call IO.Out(ind_porta, 0) 'chip spento
9
Torna ;Ricezione Seriale 16F84A ADC0831 PROCESSOR 16F84A RADIX DEC
INCLUDE "P16F84A.INC" ORG x00 BitCount EQU x0D BITCONV EQU X0E start: bsf STATUS,RP0 ;Seleziona Banco 1 movlw b' ' movwf TRISA ;RA2 Ingresso D0,RA1 Uscita CS, RA0 Uscita CLK. movlw b' ' movwf TRISB ;Porta B Tutti di Uscita bcf STATUS,RP0 ;Seleziona Banco 0 clrf BitCount clrf BITCONV clrw disable: movlw b' ' ;Sposta 7 in Accumulatore movwf BitCount ;Memorizza il valore 7 nel registro BitCount movlw b' ' ;Conversione Disabilitata CS=1 CK=0 movwf PORTA call visualizza enable: bcf PORTA, ;CLK basso bcf PORTA, ;Conversione Abilitata.CS=0 bsf PORTA,0 ;CLK ALTO call ritardo bcf PORTA, ;CLK BASSO Primo clk a vuoto. clk: call ritardo bcf PORTA,0 ;CLK BASSO call getbit ;Va a prendere il bit di conversione goto controllo getbit: btfsc PORTA, ;Vai a leggere D0. Salta se 0 goto set1 rlf BITCONV,f ;RUOTA A SX IL CONTENUTO DEL REGISTRO return set1: rlf BITCONV,f movlw 1 addwf BITCONV,f controllo: decfsz BitCount,F ;DECREMENTA BITCOUNT E SALTA SE ZERO goto clk goto disable ritardo: nop visualizza clrw movfw BITCONV movwf PORTB END Torna
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.