mate-driver/firmware/input.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;
}