/* * Fensterkomparator mit AVR * Anzeige des Zustands über 3 LEDs * Schaltung eines Relais * * PB0: Schaltausgang, UL < ADC-Wert < UH * PB1: unbenutzt * PB2: ADC1-Eingang, 2:1 Spannungsteiler (2x10k) * PB3: LED, gelb, ADC-Wert > UH + Hysterese * PB4: LED, rot, ADC-Wert < UL - Hysterese * PB5: Reset, unbenutzt * */ #include #include #include #define F_CPU 1200000 // /Hz #define VCC 5000 // /mV, Spannungsversorgung = ADC-Referenz #define UH 2500 // /mV, obere Referenzspannung #define UL 500 // /mV, untere Referenzspannung #define HYSTERESE 100 // /mV #define FENSTER_OK PORTB = (1< max) *state = 1; } } int main(void) { uint16_t tmp; uint8_t cmp_UL=0, cmp_UH=0; DDRB = (1<> 10; // Uin / mV // Schmitt-Trigger für UH & UL schmitt_trigger(&cmp_UH, UH, UH+HYSTERESE, tmp); schmitt_trigger(&cmp_UL, UL-HYSTERESE, UL, tmp); // Fensterkomparator if (!cmp_UH & cmp_UL) { FENSTER_OK; } else if (cmp_UH) { EINGANG_UEBER_UH; } else { EINGANG_UNTER_UL; } }; } // timer 0 overflow, ~4,5Hz // nur zum Aufwachen ISR(TIM0_OVF_vect) { }