Режим AVR CTC: выход сравнения B Match Interrupt не работает - PullRequest
0 голосов
/ 24 ноября 2018

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

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

// initialize timer, interrupt and variable
void timer1_init()
{
    // set up timer with prescaler = 64 and CTC mode
    TCCR1B |= (1 << WGM12)|(1 << CS11)|(1 << CS10);

    TIMSK1 |= (1 << OCIE1B);        // Output Compare B Match Interrupt Enable
    // initialize counter
    TCNT1 = 0;

    // initialize compare value
    OCR1B = 7812;
    sei();
}


ISR(TIMER1_COMPB_vect) { 
    PORTC ^= (1 << 0);
}

int main(void)
{
    // connect led to pin PC0
    DDRC = 0XFF;

    // initialize timer
    timer1_init();

    // loop forever
    while(1)
    {

    }
}

Но это не переключение контакта, почему?

1 Ответ

0 голосов
/ 28 ноября 2018

Какой микроконтроллер вы используете?

Одна проблема, которую я могу заметить, - это отсутствующая инициализация OCR1A, которая устанавливает верхнюю часть счетчика, поэтому ваш счетчик никогда не подсчитывает значение сравнения, поскольку по умолчанию OCR1A равно нулю.

Так что, возможно, вам следует написать в OCR1A вместо OCR1B.

один совет:
более новые avr-ядра поддерживают переключение выводов посредством простой записи в регистр выводов (смотритев паспортах раздел I / O-Ports).это экономит некоторые циклы для чтения и xor.Так что PORTC ^= (1 << 0); эквивалентно PINC = (1<<0);

...