#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
typedef enum
{
green_state,
red_state,
yellow_state,
pedstrian_walk,
pedstrian_dont_walk
}currentstate;
volatile currentstate state = green_state;
volatile uint8_t pedostrian_request = 0;
void updatelights(void)
{
switch(state)
{
case green_state:
PORTD = (1 << PD0);
PORTC = (1 << PC0);
break;
case red_state:
PORTD = (1 << PD1);
PORTB = (1 << PB0);
PORTC &= ~(1 << PC0);
break;
case yellow_state:
PORTD = (1 << PD2);
PORTC = (1 << PC0);
PORTB &= ~(1 << PB0);
break;
case pedstrian_walk:
PORTB = (1 << PB0);
PORTD &= ~(1 << PD2);
PORTC &= ~(1 << PC0);
break;
case pedstrian_dont_walk:
PORTC = (1 << PC0);
PORTB &= ~(1 << PB0);
break;
}
}
void init(void)
{
DDRD |= (1 << PD0) | (1 << PD1) | (1 << PD2);
DDRB |= (1 << PB0);
DDRC |= (1 << PC0);
TCCR1A |= (1 << COM1A1);
TCCR1B |= (1 << WGM12) | (1 << CS12) | (1 << CS10);
OCR1A = 15624;
TIMSK1 |= (1 << OCIE1A);
DDRD &= ~(1 << PD3);
PORTD |= (1 << PD3);
EICRA |= (1 << ISC11);
EIMSK |= (1 << INT1);
sei();
}
ISR(TIMER1_COMPA_vect)
{
static uint8_t timeinstate = 0;
timeinstate++;
switch(state)
{
case green_state:
if(timeinstate >= 7 || pedostrian_request)
{
state = red_state;
timeinstate = 0;
pedostrian_request = 0;
}
break;
case red_state:
if(timeinstate >= 5)
{
state = yellow_state;
timeinstate = 0;
}
break;
case yellow_state:
if(timeinstate >= 3)
{
state = pedstrian_walk;
timeinstate = 0;
}
break;
case pedstrian_walk:
if(timeinstate >= 5)
{
state = pedstrian_dont_walk;
timeinstate = 0;
}
break;
case pedstrian_dont_walk:
if(timeinstate >= 4)
{
state = green_state;
timeinstate = 0;
}
break;
}
updatelights();
}
ISR(INT1_vect)
{
if(state == green_state)
{
pedostrian_request = 1;
}
}
int main(void)
{
init();
updatelights();
while(1)
{
}
return 0;
}