99 lines
1.9 KiB
C++
99 lines
1.9 KiB
C++
#include <stdint.h>
|
|
#include <avr/io.h>
|
|
#include <util/delay.h>
|
|
#include <avr/interrupt.h>
|
|
#include <avr/sleep.h>
|
|
#include "writepin.h"
|
|
#include "decoder.h"
|
|
|
|
static constexpr uint8_t T0_A = PB0;
|
|
static constexpr uint8_t T0_B = PB1;
|
|
static constexpr uint8_t T1_A = PB3;
|
|
static constexpr uint8_t T1_B = PB4;
|
|
|
|
static volatile bool turnout0Flag = false;
|
|
static volatile bool turnout1Flag = false;
|
|
|
|
void handler(uint16_t data, void *user_data)
|
|
{
|
|
(void)user_data;
|
|
|
|
if(((bool)(data & (1 << 9))) != ((bool)(data & (1 << 8))) ||
|
|
((bool)(data & (1 << 7))) != ((bool)(data & (1 << 6))) ||
|
|
((bool)(data & (1 << 5))) != ((bool)(data & (1 << 4))))
|
|
return;
|
|
bool set = data & (1 << 9);
|
|
if(data & (1 << 7))
|
|
turnout0Flag = set;
|
|
if(data & (1 << 5))
|
|
turnout1Flag = set;
|
|
}
|
|
|
|
static void setTurnout0(bool in)
|
|
{
|
|
writePin(&PORTB, T0_A, in);
|
|
writePin(&PORTB, T0_B, !in);
|
|
_delay_ms(50);
|
|
|
|
writePin(&PORTB, T0_A, false);
|
|
writePin(&PORTB, T0_B, false);
|
|
|
|
}
|
|
|
|
static void setTurnout1(bool in)
|
|
{
|
|
writePin(&PORTB, T1_A, in);
|
|
writePin(&PORTB, T1_B, !in);
|
|
_delay_ms(50);
|
|
|
|
writePin(&PORTB, T1_A, false);
|
|
writePin(&PORTB, T1_B, false);
|
|
}
|
|
|
|
Decoder decoder(&PINB, PB2, &TCNT1, &handler);
|
|
|
|
ISR(TIMER1_OVF_vect)
|
|
{
|
|
decoder.overflowInterrupt();
|
|
}
|
|
|
|
ISR(INT0_vect)
|
|
{
|
|
decoder.interrupt();
|
|
}
|
|
|
|
int main()
|
|
{
|
|
DDRB = (1 << PB0) | (1 << PB1) | (1 << PB3) | (1 << PB4);
|
|
|
|
bool turnout0 = false;
|
|
bool turnout1 = false;
|
|
_delay_ms(100);
|
|
setTurnout0(true);
|
|
setTurnout1(true);
|
|
_delay_ms(500);
|
|
setTurnout0(false);
|
|
setTurnout1(false);
|
|
|
|
MCUCR = (1 << ISC00); //enable rising and falling irq on INT0
|
|
GIMSK = (1 << INT0); //unmask INT0
|
|
TIMSK = (1 << TOIE1); //enable timer 1 overflow irq
|
|
TCCR1 = (1 << CS12) | (1 << CS10); //enable timer 1 with /16 timer
|
|
|
|
sei();
|
|
while(true)
|
|
{
|
|
if(turnout0 != turnout0Flag)
|
|
{
|
|
turnout0 = turnout0Flag;
|
|
setTurnout0(turnout0);
|
|
}
|
|
if(turnout1 != turnout1Flag)
|
|
{
|
|
turnout1 = turnout1Flag;
|
|
setTurnout1(turnout1);
|
|
}
|
|
}
|
|
}
|
|
|