/****************************************************************************** PIC16F877A Zwei Komparatoren mit interner Referenzspannung Komparator 1: Eingang = RA3 / AN3 / Pin 5 Ausgang = RD2 / PSP2 / Pin 21 Komparator 2: Eingang = RA2 / AN2 / Pin 4 Ausgang = RD3 / PSP3 / Pin 22 Referenz: nominal 0,625 V bei VDD = 5,000 V ******************************************************************************/ #include /* PIC-Konfiguration */ #pragma DATA _CONFIG, _XT_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_ON & _LVP_OFF /* Taktfrequenz des Boards */ #pragma CLOCK_FREQ 4000000 void main(void) { /* PORTA: RA3 = Eingang Komparator 1 RA2 = Eingang Komparator 2 */ trisa = 0b00111111; /* PORTD: RD2 = Ausgang Komparator 1 RD3 = Ausgang Komparator 2 RD0, RD1, RD4...RD7 bleiben Eingänge */ trisd = 0b11110011; /* Ausgänge zunächst LOW */ portd.2 = 0; portd.3 = 0; /* A/D-Wandler ausschalten. */ adcon0 = 0x00; adcon1 = 0x00; /* Comparator Voltage Reference einschalten. CVREN = 1 CVROE = 0 CVRR = 1 CVR3:CVR0 = 0011 Bei VDD = 5,000 V: VREF = (3 / 24) * 5 V = 0,625 V */ cvrcon = 0b10100011; /* Komparator-Konfiguration: CM2:CM0 = 110 -> interne Referenz an VIN+ beider Komparatoren CIS = 1 -> C1 VIN- = RA3 -> C2 VIN- = RA2 C1INV = 1 C2INV = 1 -> Ausgang wird HIGH, wenn Eingang > Referenz */ cmcon = 0b00111110; /* Endlosschleife C1OUT = CMCON Bit 6 C2OUT = CMCON Bit 7 C1 -> RD2 (Pin 21) C2 -> RD3 (Pin 22) */ while(1) { portd.2 = cmcon.6; portd.3 = cmcon.7; } }