17-02-2024, 01:00
Kod:
#include <avr/interrupt.h>
#include <stdbool.h>
uint16_t rising_capture = 0;
uint16_t falling_capture = 0;
uint16_t pulse_width = 0;
bool rising_edge = true;
ISR(TIMER1_CAPT_vect)
{
switch(rising_edge){
case true:
TCNT1 = 0;
rising_capture = ICR1;
TCCR1B &= ~(1 << ICES1);
rising_edge = false;
break;
case false:
falling_capture = ICR1;
TCCR1B |= (1 << ICES1);
rising_edge = true;
break;
}
}
void setup()
{
TCCR1B |= (1 << ICES1);
TCCR1B |= (1 << CS10);
TIMSK1 |= (1 << ICIE1);
}
void loop()
{
pulse_width = falling_capture - rising_capture;
}
Nie wiem czy dobrze napisałem, bo dawno nie robiłem nic na AVR'ach.
Problem polega na tym, że bez normalnej obsługi przerwań, funkcja Serial.print zajmuje czas procesora, kiedy powinien wykrywać zbocza. Dla tego framework Arduino jest kiepski dal bardziej wymagających projektów.
Jeśli masz problem z kodem lub sprzętem, zadaj pytanie na forum. Nie odpowiadam na PW, jeśli nie dotyczą one spraw forum lub innych tematów prywatnych.