Измерение периода прямоугольной волны с помощью микроконтроллера

Я новичок в микроконтроллере. Следующий код измеряет период прямоугольной волны. Я отметил несколько строк, которые я не понял. Код выглядит следующим образом:

#include <avr/io.h>
#include <avr/interrupt.h>

ISR(TIMER1_CAPT_vect)
{
    int counter_value = ICR1; //16 bit value
    PORTB = (counter_value >> 7); // What has been done here?
    TCNT1 = 0; // why this line?

}

int main(void)
{
DDRB = 0xFF;
TCCR1A = 0x00;
TCCR1B = 0b11000010;
TIMSK = 0b00100000;
sei();
while(1);
cli();
}

Что на самом деле было сделано в этих строках?

1 ответ

Решение
ISR(TIMER1_CAPT_vect)
{
    int counter_value = ICR1; //16 bit value
    PORTB = (counter_value >> 7); // What has been done here?

PORTB это набор из 8 выходных линий. Предположительно, они подключены шиной к какому-то устройству, о котором вы не упомянули. Может быть, даже набор светодиодов для отображения двоичного числа.

Результат от счетчика 16 бит. Чтобы получить наиболее значимые биты, сдвиньте результат вправо, чтобы отбросить менее значимые биты. (Эта операция теряет точность, но у вас есть только 8 битов вывода, а не 16). Что касается того, почему сдвиг составляет только 7 вместо 8, или почему значение без знака счетчика сначала сохраняется как int со знаком, я не я знаю Я подозреваю, что это ошибка. Я бы сделал PORTB = (ICR1 >> 8); вместо.

    TCNT1 = 0; // why this line?

Так как мы записали время захвата и отправили его PORTBТеперь мы хотим сбросить таймер для следующего захвата.

}
Другие вопросы по тегам