#include <Arduino.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
// Um die Funktionen wie set_bit clear_bit und toggle_bit zu verwenden,
// muss man diese zuerst definieren.
#define set_bit(var,bit) ((var))|=(1<<(bit))
#define clear_bit(var,bit)((var)&=(unsigned)~(1<<(bit)))
#define toggle_bit(var,bit)((var)^=(1<<(bit)))
void setup() {
DDRD=0B00000110; // man setzt die Pins 1 und 2 auf HIGH, um diese als Ausgang zu definieren
}
void Normalbetrieb(void) {
set_bit(PORTD,1);
clear_bit(PORTD,2);
}
// Der Void Normalbetrieb sorgt wie in der Angabe beschrieben
// dafür, dass die erste LED eingeschaltet wird und die zweite ausgeschaltet wird.
void Interrupt(void) {
toggle_bit(PORTD,1); // erste LED wird ausgeschaltet
toggle_bit(PORTD,2); // zweite LED fängt an zweimal zu blinken
_delay_ms(1000); // -||-
toggle_bit(PORTD,2); // -||-
_delay_ms(1000); // -||-
toggle_bit(PORTD,2); // -||-
_delay_ms(1000); // -||-
toggle_bit(PORTD,2); // -||-
_delay_ms(1000); // -||-
toggle_bit(PORTD,1); // erste LED wird wieder eingeschaltet
}
// Im Void Interrupt wird wie in der Angabe beschrieben die erste LED ausgeschaltet
// Sind beide Arbeitsmodi definiert kann man mit der Interrupt Service Routine beginnen.
// Hier wird die Service Routine für Interrupt 0 definiert
ISR (INT0_vect){ //
cli(); // Routine deaktiviert
Interrupt(); // Void für den Interrupt ausgewählt
sei(); // Service Routine wieder aktiviert
}
void loop(){
set_bit(PORTD,0); // Ist im DDR PortD Pin0 als Ausgang definiert, kann man mit diesem Befehl den Pull-Up Widerstand eingeschaltet
set_bit(EIMSK, INT0); // Interrupt 0 wird als Interrupt erkannt.
clear_bit(EICRA,0); // wann der Interrupt auslöst.
clear_bit(EICRA,1); // wann der Interrupt auslöst.
sei(); // Interrupts werden aktiviert
Normalbetrieb(); // Normalbetrieb wird aktiviert
}