Komparatoren

(z.B. PIC16F627/628630/676,  PIC12F629/675, PIC16F87xA)

zurück zu Input/Output , PIC-Grundlagen , PIC-Prozessoren , Elektronik , Homepage

Allgemeines zur Komparatoren
Programmierung der Komparatoren
Interrupts
Beispiel


Allgemeines zur Komparatoren

Viele neuere PICs sind mit analogen Komparatoren ausgestattet. Das sind z.B. die Typen

(Dagegen haben z.B. die Typen PIC16F84(a) und PIC16F87x keine Komparatoren. Für diese Typen trifft dieser Abschnitt also nicht zu!)

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.:

nach oben

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.

C1INV (Comparator 1 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 1 invers. CIS (Comparator input switch)
In einigen Komparatormodes sind die negativen Komparatoreingänge nicht direkt mit Pins verbunden, sondern über Umschalter, die die Spannung zweier verschiedener Pins zum Komparator zuschalten können. Die Position dieses Schalters ist dann durch CIS gesteuert.

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.

nach oben

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.

nach oben

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:

  1. Welcher Eingangsspannungsbereich sind für die Comperatoreingänge zulässig? Welche Schäden sind zu erwarten, wenn man diesen Bereich verlässt? Wie könnte der Schaden verhindert werden?
  2. Wierum muss die LED angeschlossen werden, und liegt ihr anderes Ende über einen Widerstand an Vss oder Vdd?
  3. Wie lässt sich der Stromverbrauch des PICs weiter vemindern? (Es gibt mindestens 2 Möglichkeiten.)
  4. Kann man auf den Quarz/Resonator verzichten? Wenn ja, wie macht man das?
Um die Antworten zu erhalten, markiert man einfach die folgenden grauen Felder:

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.
nach oben

zurück zu Input/Output , PIC-Grundlagen , PIC-Prozessoren , Elektronik , Homepage
Autor: sprut
erstellt: 25.01.2003
letzte Änderung: 21.01.2010
Quelle: Dokumentation der Fa. Microchip