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:
|