Ecco un po' di appunti. Il mio caso è leggermente diverso dal tuo, io infatti campionavo 4 canali in sequenza, e ogni tanto dovevo campionare gli altri 4 canali. Comunque, a parte il cambiare l'impostazione degli ingresso ogni volta, dovrebbe essere lo stesso.
Cominciamo con le impostazioni generiche dell'adc:
;*************************** impostazioni adc ********************************************** ;impostazione ingressi analogici MOVLW b'11111111' MOVWF ANSEL0 ;ingressi A0 A1 A2 A3 A4 A5 E0 E1 analogici
;conversione single-shot, sequence 4 channel ;abilitazione modulo adc MOVLW b'00010101' MOVWF ADCON0
;+Vref=Vdd -Vref=Vss ;buffer fifo abilitato MOVLW b'00010000' MOVWF ADCON1
;right justified (qui vedi come ti serve) ;delay 6Tad (qui vedi come ti serve, comunque io lavoravo a 40 MHz) ;clock: Fosc/32 (qui vedi come ti serve, comunque io lavoravo a 40 MHz) MOVLW b'10011010' MOVWF ADCON2
;interrupt ogni valore campionato non serve per modalità single shot (io uso questa, vedi se ti va bene, con il continuos mi pare che avevo problemi di accavallamento valori nel fifo) ;trigger disabilitati MOVLW b'00000000' MOVWF ADCON3
;interrupt adc BCF PIR1,ADIF ;reset interrupt adc BSF PIE1,ADIE ;abilitazione interrupt adc
CALL IMPOSTACANALI ;selezione canali da campionare BSF ADCON0,GO_DONE ;adc on (avvio conversione)
;**************************************************************************************
E questa è la gestione dell'interrupt:
;**************************** interrupt adc ***********************************************
ADC_INT: ;interrupt gestione risultati adc BCF PIR1,ADIF ;reset interrupt adc
;ciclo gestione 4 risultati CIC_LETT_ADC: ;lettura indirizzo FIFO (mi serve per sapere quale canale sto leggendo, perchè io li gestisco a ciclo... se tu li leggi singolarmente 4 volte non ti serve leggere l'indirizzo) MOVF ADCON1,W ;prelievo indirizzo canale FIFO SUBLW 0xFF ;complemento indirizzo (11 è il canale 0) ANDLW b'00000011' ;mascheratura bit ADPNT1 ADPNT0 MOVWF ADC_PNTR ;salvataggio indirizzom FIFO
;lettura valore (va letta prima la parte alta, quando leggo la parte bassa viene incrementato il puntatore del fifo) MOVF ADRESH,W ;prelievo risultato adc MOVWF R1 ;salvo il risultato MOVF ADRESL,W ;prelievo risultato adc MOVWF R0 ;salvo il risultato
[........] ;routine di utilizzo risultato (testi il bit che ti dice quali canali hai campionato, così sai cosa fare con i valori)
;controllo buffer vuoto (controllo di aver letto tutto il FIFO, e continuo fino a quando non è vuoto) (se hai fatto 4 letture fisse, non a ciclo come me, puoi controllare di aver vuotato correttamente il FIFO) BTFSS ADCON1,BFEMT GOTO CIC_LETT_ADC ;ciclo lettura gruppo di 4 canali
(qui, prima di riattivare l'adc, puoi modificare le impostazioni dei canali da campionare) (ovviamente imposterai opportunamente il bit che ti dice che canali stai campionando, per la successiva gestione dei risultati) BSF ADCON0,GO_DONE ;riattivo manualmente l'adc GOTO FINEINT ;fine routine
;**************************************************************************************
;**************************** routine impostazioni canali ************************************** (qui tu dovrai anche cambiare tra sequenza di 4 canali diversi e sequenza di 4 campionamenti dello stesso canale)
IMPOSTACANALE: (primo gruppo) BSF rif_sample ;set bit campionamento riferimento (serve per ricordarmi cosa sto campionando) ;assegnazione ingressi - gruppi per lettura ingressi di riferimento: ;gruppo A:an4 ;gruppo B:an5 ;gruppo C:an6 ;gruppo D:an7 MOVLW b'01010101' MOVWF ADCHS RETURN
IMPOSTACANALE: (primo gruppo) BCF rif_sample ;reset bit campionamento riferimento (serve per ricordarmi cosa sto campionando) ;assegnazione ingressi - gruppi per lettura tensioni: ;gruppo A:an0 ;gruppo B:an1 ;gruppo C:an2 ;gruppo D:an3 MOVLW b'00000000' MOVWF ADCHS RETURN
;**************************************************************************************
_________________ Non accontentarti mai, scegli gli strumenti giusti, usali bene, non accettare compromessi, pretendi il successo. Poi ricomincia da capo.
Nel mondo esistono 10 tipi di persone: -chi conosce il codice binario -chi non conosce il codice binario
|