/* ampel_01.c ATmega88 @ 1MHz */ #include <avr/io.h> #include <util/delay.h> enum ampel {rot=1, rot_gelb, gelb, gruen}; // rot=1, rot_gelb=2, gelb=3, gruen=4 char zustand = 1; // Zustand beim Start definieren (globale Variable) void ampel1(ampel) // Funktion ampel 1 { switch (ampel) { case rot: PORTB = (1<<PB0); break; case rot_gelb: PORTB = (1<<PB0)+(1<<PB1); break; case gelb: PORTB = (1<<PB1); break; case gruen: PORTB = (1<<PB2); break; } } void ampel2(ampel) // Funktion ampel 2 { switch (ampel) { case rot: PORTD = (1<<PD0); break; case rot_gelb: PORTD = (1<<PD0)+(1<<PD1); break; case gelb: PORTD = (1<<PD1); break; case gruen: PORTD = (1<<PD2); break; } } void state_machine(void) // Funktion state_machine { enum ampel ampel_1, ampel_2; // Deklaration ampel_1 und ampel_2 vom Typ enum ampel switch (zustand) { case 1: ampel1 (ampel_1 = rot); ampel2 (ampel_2 = gruen); zustand = 2; // Neuer Zustand = 2 break; case 2: ampel1 (ampel_1 = rot); ampel2 (ampel_2 = gelb); zustand = 3; // Neuer Zustand = 3 break; case 3: ampel1 (ampel_1 = rot); ampel2 (ampel_2 = rot); zustand = 4; // Neuer Zustand = 4 break; case 4: ampel1 (ampel_1 = rot_gelb); ampel2 (ampel_2 = rot); zustand = 5; // Neuer Zustand = 5 break; case 5: ampel1 (ampel_1 = gruen); ampel2 (ampel_2 = rot); zustand = 6; // Neuer Zustand = 6 break; case 6: ampel1 (ampel_1 = gelb); ampel2 (ampel_2 = rot); zustand = 7; // Neuer Zustand = 7 break; case 7: ampel1 (ampel_1 = rot); ampel2 (ampel_2 = rot); zustand = 8; // Neuer Zustand = 8 break; case 8: ampel1 (ampel_1 = rot); ampel2 (ampel_2 = rot_gelb); zustand = 1; // Neuer Zustand = 1 break; } } int main(void) { DDRB = 0x07; // PB0, PB1, PB2 = Ausgang DDRD = 0x07; // PD0, PD1, PD2 = Ausgang while(1) { state_machine(); // Funktion state_machine aufrufen _delay_ms(3000); // 3 Sekunden warten } }