Milan Stephan
Fotografie & IT

Zurück zur SPiC Übersicht

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);
	}

}