interrupt.c
#include <avr/interrupt.h> #include <avr/sleep.h> #include <led.h> #include <7seg.h> static volatile uint8_t counter = 0; // Behandlung für INT1 ISR(INT1_vect) { counter++; // Die ISR soll möglichst schnell fertig laufen. // Daher bitte keine Funktionen aufrufen etc., wenn nicht unbedingt notwendig. // Sowas z.B. NICHT machen (außer zum Debuggen, aber vor der Abgabe entfernen!): sb_led_toggle(RED0); } void main(void) { // BUTTON vorbereiten DDRD &= ~(1 << PD3); // Als Eingang definieren PORTD |= (1 << PD3); // Pull-Up aktivieren // Drücken soll Interrupt auslösen EICRA |= (1 << ISC11); EICRA &= ~(1 << ISC10); // INT1 erlauben EIMSK |= (1 << INT1); //Interrupts aktivieren sei(); // Schlafmodus vorbereiten set_sleep_mode(SLEEP_MODE_IDLE); sleep_enable(); uint8_t iterations = 0; while (1) { iterations++; // Überlauf ist auf unsigned int-Typen definiert. if (iterations == 0) { sb_led_toggle(GREEN0); } // Durch das Schlafenlegen wird die Schleife deutlich seltener durchlaufen. // Das ist an dem deutlich langsameren Blinken der LED GREEN0 zu erkennen. sleep_cpu(); // Bei dem Zugriff auf die gemeinsam genutzte Variable Interrupts sperren cli(); uint8_t counter_local = counter; sei(); sb_7seg_showNumber(counter_local); } }