Например TDA7294

Форум РадиоКот :: Просмотр темы - Timer0 и Atmel Studio 7 Atmega88a
Форум РадиоКот
https://radiokot.ru/forum/

Timer0 и Atmel Studio 7 Atmega88a
https://radiokot.ru/forum/viewtopic.php?f=57&t=181953
Страница 1 из 1

Автор:  Land [ Сб мар 26, 2022 12:04:04 ]
Заголовок сообщения:  Timer0 и Atmel Studio 7 Atmega88a

Приветствую всех. В очередной раз подниму тему с таймерами. Ибо либо лыжи не едут, либо я ни фига не понимаю.
TIMER0 код инициализации:
Код:
//   Таймер 0
   // TIMER 0 for interrupt frequency undefined Hz:
   cli(); // stop interrupts
   TCCR0A = 0; // set entire TCCR0A register to 0
   TCCR0B = 0; // same for TCCR0B
   TCNT0  = 0x83; // 0x83 to 16 mS B, 9C to 100 uS A
   // set compare match register for undefined Hz increments
   //OCR0A = 0x63; // to 100 uS A
   OCR0B = 0x53;   // 16 mS B
   TCCR0A |= (1 << WGM01);   // turn on CTC mode   
   TIMSK0 |= (1<<OCIE0B);   // enable timer compare interrupt OCIE0B to 16 mS (1 << OCIE0A)|(1<<OCIE0B)
   // Set CS02, CS01 and CS00 bits for 1 prescaler
   TCCR0B |= (1 << CS02) | (0 << CS01) | (1 << CS00); // CS02|CS00 1024 /16mS/, CS01 8 /100 uS

Выбран режим CTC, прерывание по совпадению OCIE0B (канал В), начальное значение TCNTO= 0x83, счетчик OCR0B = 0x53.
Прерывания:
Код:
ISR(TIMER0_COMPA_vect)
   {
      flag_SEND_BIT = _ON;
         //   100 uS      
   }

   ISR(TIMER0_COMPB_vect)
   {
      flag_BUTTON = _ON;
      TCNT0  = 0x83; // было ошибочно TCNT2, после исправления ничего не поменялось
   }

Прерывание не генерится и в симуляторе не идет счет TCNT0. В симуляторе постоянно висит флаг OCF0A и TOV0
Изображение
Если тот же таймер перестраиваю на прерывания по совпадению OCIE0A,
Код:
//   Таймер 0
   // TIMER 0 for interrupt frequency undefined Hz:
   cli(); // stop interrupts
   TCCR0A = 0; // set entire TCCR0A register to 0
   TCCR0B = 0; // same for TCCR0B
   TCNT0  = 0x83; // 0x83 to 16 mS B, 9C to 100 uS A
   // set compare match register for undefined Hz increments
   OCR0A = 0x63; // to 100 uS A
   //OCR0B = 0x53;   // 16 mS B
   TCCR0A |= (1 << WGM01);   // turn on CTC mode   
   TIMSK0 |= (1<<OCIE0A);   // enable timer compare interrupt OCIE0B to 16 mS (1 << OCIE0A)|(1<<OCIE0B)
   // Set CS02, CS01 and CS00 bits for 1 prescaler
   TCCR0B |= (1 << CS02) | (0 << CS01) | (1 << CS00); // CS02|CS00 1024 /16mS/, CS01 8 /100 uS

т.е. меняю две строчки кода, то прерывание есть и счет TCNT0 идет :shock:
Изображение При этом висит флаг OCF0B и TOV0.
глобальное разрешение прерываний sei в коде есть само-собой.
Ткните пальцем, где туплю :beer:

Автор:  Карбофос [ Сб мар 26, 2022 12:12:27 ]
Заголовок сообщения:  Re: Timer0 и Atmel Studio 7 Atmega88a

Изображение

Вложения:
1.png [26.83 KiB]
Скачиваний: 364

Автор:  Land [ Сб мар 26, 2022 13:02:45 ]
Заголовок сообщения:  Re: Timer0 и Atmel Studio 7 Atmega88a

И как это объясняет отсутствие прерывания по каналу В?

Автор:  Карбофос [ Сб мар 26, 2022 13:54:32 ]
Заголовок сообщения:  Re: Timer0 и Atmel Studio 7 Atmega88a

А чему у вас равно значение регистра OCR0A в случае, когда прерывание по TIMER0_COMPB не вызывается?
Кроме того, TCNT0 считает от 0 до TOP, присваивание TCNT0 = 0x83 выглядит непонятно.
Здесь есть тема по таймерам AVR; можете поискать документацию на AVR на русском.

Автор:  Land [ Сб мар 26, 2022 15:00:32 ]
Заголовок сообщения:  Re: Timer0 и Atmel Studio 7 Atmega88a

Спасибо, дошло. Было достаточно ответа в стиле: у вас TCNT0 сбрасывается по достижении FF и не может досчитать до OCR0B.

Автор:  Карбофос [ Сб мар 26, 2022 15:02:30 ]
Заголовок сообщения:  Re: Timer0 и Atmel Studio 7 Atmega88a

TCNT0 сбрасывается по достижении FF

По достижению TOP.

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/