COMPARATORI & MICROCONTROLLORI - 2



Come rilevare i cambiamenti della uscita dei comparatori

Quando si usa un comparatore per monitorare un sensore e' spesso importante conoscere quando si verifica un cambiamento nel comparatore e come cambia. Per rilevare il cambiamento dell'uscita di un comparatore, il metodo tradizionale è di conservare una copia dell'uscita e confrontarla periodicamente con il valore attuale dell'uscita per determinarne eventuali cambiamenti. Un esempio di questo tipo di routine ASM  per un micro PIC e' riportata di seguito.

Test1

MOVF hold,w                                           ; carica su W il valore passato di Cout

XORWF CMCON,w                                ; confronta W e il nuovo Cout

ANDLW COUTMASK                              ; rimuove tutti i bit tranne Cout

BTFSC STATUS,Z                                  ; testa il bit Z del registro di stato

RETLW 0                                                   ; Se Z=1 allora esce forzando W=0

MOVF CMCON,w                                     ; Se Z =0 allora mette su W il valore di CMCON

ANDLW COUTMASK                               ; rimuove tutti i bit tranne Cout

MOVWF hold                                             ; salva nella variabile hold il nuovo valore.

RETURN

 

Questa routine richiede 5 istruzioni per ogni test, 9 istruzioni se un cambiamento si verifica, e una locazione di memoria in RAM per salvare il valore passato dell'uscita del comparatore.

Un metodo veloce per i microcontrollori con un singolo comparatore e' di usare il flag relativo all'interrupt generato dal comparatore. Di seguito una routine che implementa tale metodo:

Test2

BTFSS PIR1,CMIF ; testa se il flag del comparatore e' settato

RETLW 0 ; se e' vero esce mettendo W=0

BTFSS CMCON,COUT ;se e' falso allora testa se COUT e' settato

RETLW CHNGBIT ; se e' falso allora esce con W=CHNGFLAG

RETLW COUTMASK + CHNGBIT ; se e' vero esce con W=COUTMASK + CHNGBIT

 

Questa routine richiede 2 istruzioni per ogni test, e solo 3 istruzioni se si verifica un cambiamento e nessuna locazione nella RAM. Se il flag dell' interrupt non può essere usato o due comparatori condividono il flag dell'interrupt, si può usare un metodo alternativo che usa il bit della polarità dell'uscita del comparatore.

 

Test

BTFSS CMCON,COUT ;test Cout

RETLW 0 ;if clear, return 0

MOVLW CINVBIT ;if set, invert Cout

XORWF CMCON,f ;forces Cout to 0

BTFSS CMCON,CINV ;test Cout polarity

RETLW CHNGFLAG ;if clear, return ;CHNGFLAG

RETLW COUTMASK + CHNGFLAG ;if set, ;return both

 

Questa routine richiede 2 istruzioni per ogni test, e 5 istruzioni se un cambiamento si verifica e nessuna GPR (general purpose register).