|
Таймер/счетчик Т0, Не работает Т0. Среда WinAVR. Atmega8515 |
|
|
|
Nov 9 2011, 23:10
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 25-04-10
Из: г. Одесса
Пользователь №: 56 889

|
Всем добрый вечер! Казалось бы нубский вопрос, но не понимаю. Скажем, инициализирую таймер. Код TIMSK |= (1 << TOIE0) | (1 << OCIE0); TCCR0 |= (1 << CS02) | (0 << CS01) | (0 << CS00); sei(); Далее, пытаюсь что-то делать по переполнению. Например, "произвольный" код: Код ISR(TIMER0_OVF_vect) { count1++; if(count1 == 10){ count1 = 0; count2++; if(count2 == 12){ count2 = 0; lcd = lcd + 1; } } //_delay_ms(10); } Так вот, в чем, собственно проблема. Данный код будет работать только если раскомментировать Код _delay_ms(10); В чем подвох, не могу понять.
|
|
|
|
|
 |
Ответов
|
Nov 10 2011, 12:13
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 25-04-10
Из: г. Одесса
Пользователь №: 56 889

|
Цитата(Палыч @ Nov 10 2011, 14:52)  Стесьняюсь спросить: обработчик прерывания TIMER0 COMP в программе присутствует? Вы не поверите... Выставил бит в 0 и заработало. Спасибо огромное! Судя по всему, я совсем баклажан Не могли бы Вы еще объяснить, почему так произошло? Еще раз спасибо!
|
|
|
|
|
Nov 11 2011, 07:08
|
Местный
  
Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023

|
Цитата(Палыч @ Nov 10 2011, 19:38)  Мне труднее объяснить: почему работало при вызове _delay_ms(10) ?... С этой функцией я не знаком - сам я задержки таким образом не осуществляю... Вероятно, эта функция для своей работы как раз использует таймер 0, и в результате своей работы благополучно сбрасывает OCIE0. _delay_ms реализована в виде пустого цикла и таймер 0 не использует. Это inline функция, её можно найти в .h файле. Поскольку её вызов находился в обработчике прерывания, на всё это время прерывания были запрещены. Но почему работало - всё равно не знаю.
|
|
|
|
|
Nov 11 2011, 09:24
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(maksimp @ Nov 11 2011, 11:08)  Но почему работало - всё равно не знаю. В голову пришло такое объяснение: 1. Прерывание TIMERx OVF имеет бОльший приоритет чем TIMER COMP. 2. Задержка (функция delay), вставленная в обработчик TIMERx OVF приводила к тому, что к окончанию работы этого обработчика вырабатывался новый флаг для прерывания TIMERx OVF. 3. По выходу из обработчика прерывания TIMERx OVF имели место два флага: по переполнению и по сравнению, но, поскольку прерывание TIMERx OVF имеет больший приоритет, то вызывается его обработчик (с этого места - переход на п.2). 4. До обработки прерывания TIMER COMP дело, банально, не доходило...
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|