|
Форум РадиоКот :: Просмотр темы - Timer0 и Atmel Studio 7 Atmega88a
| Автор: |
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 идет
При этом висит флаг OCF0B и TOV0. глобальное разрешение прерываний sei в коде есть само-собой. Ткните пальцем, где туплю
|
| Автор: |
Карбофос [ Сб мар 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/ |
|
|