Lösung: Arduino UNO Ampel

C-Quelltext:

#define F_CPU 16000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

void Sekunde(int n){
	for (int i=0 ; i<n ; i++) {
		TCNT1 = 0;
		while (TCNT1<15625) {}
	}
}

void Fussgaenger(void){
	PORTB &= ~0b00000100;
	PORTB |= 0b00010000;
	Sekunde(1);
	PORTB &= ~0b00010000;
	PORTB |= 0b00100000;
	Sekunde(1);
	PORTC &= ~0b00000100;
	PORTC |= 0b00000010;
	Sekunde(2);
	PORTC &= ~0b00000010;
	PORTC |= 0b00000100;
	Sekunde(1);
	PORTB |= 0b00110000;
	Sekunde(1);
	PORTB &= ~0b00110000;
	PORTB |= 0b00000100;
}

ISR(INT0_vect) {
	if (PORTB & 0b00000100)
	{
		Sekunde(1);
		Fussgaenger();	
	}
}

int main(void)
{
	DDRC |= 0b00000110;
	PORTC |= 0b00000100;
	
	DDRB |= 0b00110100;
	PORTB |= 0b00000100;
	
	PORTD |= 0b00000100;
	
	TCCR1B |= 0b00000101;
	
	EICRA = 0b00000010;
	EIMSK = 0b00000001;
	
	sei();
	
    while (1) 
    {
		Sekunde(10);
		Fussgaenger();
    }
}

Ablaufplan:

Eine Hilfestellung für die Programmierung der Ampelsteuerung liefert das unten abgebildete Zustandsdiagramm:

Zustandsdiagramm

Zustandsdiagramm: Ampelsteuerung