/* 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
	}
}