62 lines
1.1 KiB
C
62 lines
1.1 KiB
C
#include "input.h"
|
|
|
|
enum Edge {
|
|
RISING = 0,
|
|
FALLING = 1,
|
|
};
|
|
|
|
uint16_t volatile last_count;
|
|
enum Edge volatile next_edge;
|
|
|
|
volatile uint8_t signal_ok;
|
|
|
|
void input_init() {
|
|
PORTD |= (1 << PD3);
|
|
MCUCR |= (1 << ISC10) | (1 << ISC11);
|
|
GIMSK |= (1 << INT1);
|
|
|
|
TIMSK |= (1 << TOIE1);
|
|
TCNT1 = 0;
|
|
TCCR1B |= (1 << CS11); //Prescaler 8, enable Timer
|
|
|
|
next_edge = RISING;
|
|
last_count = 0;
|
|
signal_ok = 0;
|
|
}
|
|
|
|
|
|
ISR(TIMER1_OVF_vect) {
|
|
signal_ok = 0;
|
|
PIND |= (1 << PD1);
|
|
}
|
|
|
|
ISR(INT1_vect) {
|
|
signal_ok = 1;
|
|
|
|
if(next_edge == RISING) {
|
|
TCNT1 = 0;
|
|
MCUCR &= ~(1 << ISC10); //Trigger on falling edge next
|
|
next_edge = FALLING;
|
|
} else if(next_edge == FALLING) {
|
|
last_count = TCNT1;
|
|
TCNT1 = 0;
|
|
MCUCR |= (1 << ISC10); //Trigger on falling edge next
|
|
next_edge = RISING;
|
|
}
|
|
}
|
|
|
|
int16_t input_get_result() {
|
|
int16_t tmp = last_count - 1500;
|
|
if(tmp < -500) {
|
|
tmp = -500;
|
|
}
|
|
if(tmp > 500) {
|
|
tmp = 500;
|
|
}
|
|
return tmp;
|
|
}
|
|
|
|
uint8_t input_signal_ok() {
|
|
return signal_ok;
|
|
}
|