mate-driver/firmware/input.c

62 lines
1.1 KiB
C
Raw Normal View History

2020-07-17 00:50:32 +02:00
#include "input.h"
2020-07-29 19:07:03 +02:00
enum Edge {
RISING = 0,
FALLING = 1,
};
2020-07-17 00:50:32 +02:00
uint16_t volatile last_count;
2020-07-29 19:07:03 +02:00
enum Edge volatile next_edge;
2020-07-29 19:48:58 +02:00
volatile uint8_t signal_ok;
2020-07-17 00:50:32 +02:00
void input_init() {
2020-07-29 19:48:58 +02:00
PORTD |= (1 << PD3);
2020-07-29 19:07:03 +02:00
MCUCR |= (1 << ISC10) | (1 << ISC11);
GIMSK |= (1 << INT1);
2020-07-17 00:50:32 +02:00
2020-07-29 19:48:58 +02:00
TIMSK |= (1 << TOIE1);
TCNT1 = 0;
TCCR1B |= (1 << CS11); //Prescaler 8, enable Timer
2020-07-29 19:07:03 +02:00
next_edge = RISING;
2020-07-17 00:50:32 +02:00
last_count = 0;
2020-07-29 19:48:58 +02:00
signal_ok = 0;
2020-07-17 00:50:32 +02:00
}
2020-07-29 19:07:03 +02:00
2020-07-29 19:48:58 +02:00
ISR(TIMER1_OVF_vect) {
signal_ok = 0;
PIND |= (1 << PD1);
}
2020-07-29 19:07:03 +02:00
2020-07-17 00:50:32 +02:00
ISR(INT1_vect) {
2020-07-29 19:48:58 +02:00
signal_ok = 1;
2020-07-29 19:07:03 +02:00
if(next_edge == RISING) {
2020-07-17 00:50:32 +02:00
TCNT1 = 0;
2020-07-29 19:07:03 +02:00
MCUCR &= ~(1 << ISC10); //Trigger on falling edge next
next_edge = FALLING;
} else if(next_edge == FALLING) {
2020-07-17 00:50:32 +02:00
last_count = TCNT1;
2020-07-29 19:48:58 +02:00
TCNT1 = 0;
2020-07-29 19:07:03 +02:00
MCUCR |= (1 << ISC10); //Trigger on falling edge next
next_edge = RISING;
2020-07-17 00:50:32 +02:00
}
}
int16_t input_get_result() {
2020-07-29 19:07:03 +02:00
int16_t tmp = last_count - 1500;
if(tmp < -500) {
tmp = -500;
2020-07-17 00:50:32 +02:00
}
2020-07-29 19:07:03 +02:00
if(tmp > 500) {
tmp = 500;
2020-07-17 00:50:32 +02:00
}
2020-07-29 19:07:03 +02:00
return tmp;
2020-07-17 00:50:32 +02:00
}
2020-07-29 19:48:58 +02:00
uint8_t input_signal_ok() {
return signal_ok;
}