Allgemeines zur
Komparatoren
Programmierung
der Komparatoren
Interrupts
Beispiel
Viele neuere PICs sind mit analogen Komparatoren ausgestattet. Das sind z.B. die Typen
Ein Komparator ist eine
Spannungsvergleicherschaltung
mit 2 analogen Eingängen und einem digitalen Ausgang.
Die beiden analogen
Eingänge heißen
'+' (positiver Eingang) und '-' (negativer Eingang). Solange die
Spannung
an '+' größer ist als die Spannung an '-', hat der Ausgang
'CxOUT'
des Komparators digitalen High-Pegel (also logisch '1' bzw. Vdd=5V).
Ist
dagegen die Spannung an '+' kleiner als an '-', dann führt Ausgang
'CxOUT' des Komparators digitalen Low-Pegel (also
logisch '0' bzw. Vss=0V).
Als analoge Eingangsspannungen
können
Spannungen von den Pins RA0..RA3 zu den Komparatoreingängen
geschaltet
werden. Außerdem ist es möglich, die interne
Referenzspannungsquelle des PIC zum '+'-Eingang der Komparatoren
zuzuschalten. |
Das digitale Ausgangssignal kann auch auf ein Port-Pin wieder ausgegeben werden, üblicherweise wird aber dieser Ausgang vom PIC intern digital abgefragt. Der Ausgangspegel des Komparators ist im PIC nämlich einfach ein Bit in einem Register. Fragt man im Programm dieses Bit ab, dann weiß man, welche der beiden Spannungen momentan größer ist.
Letztendlich ist ein Komparator für einen digitalen Microcontroller die denkbar primitivste Schnittstelle zur analogen Welt. Es lassen sich damit aber viele Probleme lösen, wie z.B.:
Programmierung der Komparatoren
Ich beziehe mich hier exemplarisch auf den PIC16F628, da er preiswert und leistungsstark ist. Für den 16F627 gilt das gleiche unverändert. Die Komparatoren der 16F87xA unterscheiden sich nicht allzusehr von denen der 16F628. Die 12F6xx weisen schon größere Unterschiede zum 16F628 auf. Wer also nicht den 16F628 benutzen möcht, lese bitte sorgfältig die Datenblätter.
Die Programmierung der Komparatoren erfolgt im Register CMCON, das z.B. beim 16F62x auf Adresse 1Fh liegt.
CMCON REGISTER (ADDRESS 1Fh):
bit 7 | bit 6 | bit 5 | bit 4 | bit 3 | bit 2 | bit 1 | bit 0 | |
Name: | C2OUT | C1OUT | C2INV | C1INV | CIS | CM2 | CM1 | CM0 |
Wert: | 0 oder 1 | 0 oder 1 | 0 oder 1 | 0 oder 1 | 0 oder 1 | 0 oder 1 | 0 oder 1 | 0 oder 1 |
C2OUT (Comparator 2 output)
Dieses Bit kann man nur lesen, aber nicht
beschreiben. Es handelt sich um das Ausgangssignal des Komparators 2.
Durch
lesen dieses Bits kann man also herausfinden, welche Eingangsspannung
des
Komparators 2 momentan größer ist.
C1OUT
(Comparator 1 output)
Dieses Bit kann man nur lesen, aber nicht
beschreiben. Es handelt sich um das Ausgangssignal des Komparators 1.
Durch
lesen dieses Bits kann man also herausfinden, welche Eingangsspannung
des
Komparators 1 momentan größer ist.
C2INV (Comparator 2 output
inversion)
Oben habe ich beschrieben, das eine
Komparator
genau dann High am Ausgang liefert, wenn die Spannung an '+'
größer
ist als an '-'.
Durch setzen dieses Bits kann das
umgekehrt
werden. Dann verhält sich der Ausgang des Komparators 2 invers.
CM2, CM1, CM0 (Comparator mode)
Es gibt 8 unterschiedliche
Möglichkeiten,
die Komparatoren mit den Pins des PortA zu verbinden. Mit den 3 CM-Bits
wählt man eine der Möglichkeiten aus.
Wie diese 8 Modes aussehen sollte jeder
selber im Datenblatt nachlesen. Dort finden sich für alle 8 Modes
'Anschlusspläne' der Komparatoren.
Eingangspins, die in einem Mode
einem Komparatoreingang zugewiesen sind, können nicht gleichzeitig
als digitale Eingangspins (z.B. des PortA) benutzt werden. Ein Lesen
der
entsprechenden Bits des PortA ergibt immer den Wert 0.
Ausgangspins, die in einem Mode
einem Komparatoreingang zugewiesen sind, können nicht gleichzeitig
als digitale Portausgänge (z.B. des PortA) benutzt werden. Ein
Schreiben
der entsprechenden Bits des PortA hat keinen Einfluss auf den
Ausgangspegel
am Pin. Damit ein Ausgangspin auch als Ausgangspin funktioniert,
muss
das zugehörige Bit im TRIS-Register des Ports auf 0 gesetzt werden.
Interrupts
Jede Änderung des Augangspegels eines
Komparators kann (wenn gewünscht) einen Interrupt auslösen.
Wenn sich der Ausgangspegel eines
Komparators
(und damit eines der Bits C1OUT oder C2OUT im Register CMCON)
ändert,
dann wird im Register PIR1 (0Ch) das Bit CMIF (Bit 6)
gesetzt.
Dieses Bit ist das sogenannte Interrupt-Flag der Komparatoren. Dieses
Flag
kann einen Interrupt auslösen, wenn vom Programm das Bit CMIE
(comparator interrupt enable) gesetzt wurde (Bit 6 im Register PIE1
auf Adresse 8Ch) und das Bit PEIE gesetzt wurde (Bit 6 im
Register
INTCON)
PEIE ist der Hauptschalter für Peripherie-Interrupts, und Komparatoren gelten im PIC16F628 als Peripherie. CMIE ist dagegen der Schalter, der speziell die Komparator-Interrupts erlaubt. Nur wenn beide Schalter eingeschaltet sind, kann das setzen von CMIF auch einen Interrupt auslösen.
Während es Interrupts muss das Bit CMIF vom Programm 'manuell' zurückgesetzt werden. Ansonsten würde das immer noch gesetzte Bit nach Interrupt-Ende sofort wieder einen Interrupt auslösen.
Beispiel
für die Komparatoren
Wer will kann sich den ADC
mit Komparator anschauen. Für den Anfang wäre das aber
etwas
zu hoch gegriffen.
Nachfolgend ein kleines Beispiel, das
mit Viktor zugesandt hat. Es verwendet einen PIC16F628, der mit einem
externen 4-MHz Quartz oder Resonator getaktet wird. Es wird
ständig die Spannung an RA0 (Vin-) und RA3 (Vin+) verglichen .
Eine an RB0 angeschlossenen LED leuchtet, wenn die Spannung an RA3
größer als die Spannung an RA0 ist.
;============================================================ ;Filename: Comparator ;Date: 19.01.2010 ;Author: ;Processor: PIC16F628A ;Referencecircuit: ;============================================================ ;Copyrightnotice: ;============================================================ ;ProgramDescription: Eine LED,die an den PORTB,0 angeschlossen ist, ; leuchtet auf, wenn Vin+ größer als Vin- ist. ; ;********************************************************************************* ;********************************************************************************* ; _____ _____ ** ; RA2 |1 U 18| RA1 ** ; Vin+ RA3 |2 17| RA0 Vin- ** ; RA4 |3 16| osc 4 MHz ** ; RA5 |4 15| osc 4 MHz ** ; GND Vss |5 14| Vdd 5V ** ; LED RB0 |6 13| RB7 ** ; RB1 |7 12| RB6 ** ; RB2 |8 11| RB5 ** ; RB3 |9__________10| RB4 ** ; ** ; PIC16F628A ** ; ** ;********************************************************************************* ;********************************************************************************* list p=16f628a #include <P16F628A.INC> ;==Config Bits setzen============================================= __CONFIG _HS_OSC & _WDT_OFF & _BODEN_OFF & _LVP_OFF & _PWRTE_OFF & _MCLRE_OFF ;==Start========================================================== org 0 goto init ;==Interrupt========================================================== org 4 bcf INTCON, GIE ; Interrupt deaktivieren movwf w_copy ; W retten swapf STATUS, w ; STATUS retten movwf s_copy ; ; hier folgt die eigentliche Interrupt-Routine ; Interrupt-Ursache feststellen btfss PIR1,CMIF goto weiter_interrupt btfsc CMCON,C1OUT goto comp_set goto comp_null weiter_interrupt: bsf INTCON,PEIE swapf s_copy, w ; STATUS zurück movwf STATUS swapf w_copy, f ; w zurück mit flags swapf w_copy, w retfie ;============================================================ init: w_copy equ 25h ; Backup für Akkuregister s_copy equ 26h ; Backup für Statusregister ; Komparatoren konfigurieren bcf CMCON,0 bcf CMCON,1 bsf CMCON,2 ; => Two independent comparators bsf CMCON,C1OUT ; 1 = C1 VIN+ > C1 VIN- bsf STATUS,RP0 ; Bank1 bsf PIE1,CMIE ; Comparator-Interrupt enable bit bcf STATUS,RP0 ; Bank0 bsf STATUS,RP0 ; Bank1 movlw B'11111111' movwf TRISA ; PortA - Eingang movlw B'00000000' movwf TRISB ; PortB - Ausgang bcf STATUS,RP0 ; Bank0 clrf PORTA clrf PORTB ; Interrupts erlauben bsf INTCON,PEIE bsf INTCON,GIE main: goto main comp_set: bsf PORTB,0 bcf PIR1,CMIF goto weiter_interrupt comp_null: bcf PORTB,0 bcf PIR1,CMIF goto weiter_interrupt end ;============================================================ |
Kleine Denkübungen für dieses Beispiel:
zu 1 |
Vss bis Vdd Die Schutzdioden der Eingänge werden überlastet, das kann bei > 20mA den PIC beschädigen. Ein Vorwiderstand in den Eingangsleitungen muss den Strom auf < 20mA begrenzen |
zu 2 |
Anode zu RB0, Kathode über
einen Widerstand (200 Ohm .. 1kOhm) nach Vss. |
zu 3 |
Oszillatoreinstellung auf
_XT_OSC ändern. In die Main-Schleife ein sleep einbauen. |
zu
4 |
Ja.
Man verwendet den internen 4-MHz-Oszillator. |