|
|
  |
Таймер/счетчик Т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, 10:51
|
Частый гость
 
Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764

|
Что, Вы, подразумеваете под фразой "код будет работать". Что случается с программой, когда в прерывании нет задержки: программа не компилируется, МК не входит в прерывание, виснет. Больше конкретики. Что за контроллер используете, какая тактовая частота, среда разработки?
И на будущее, хоть и утверждаете, что без задержки в прерывании "код не работает", но использование задержек в прерывании принципиально неправильно. Не стоит этого никогда делать.
Сообщение отредактировал Sergey_Aleksandrovi4 - Nov 10 2011, 10:51
|
|
|
|
|
Nov 10 2011, 11:21
|
Участник

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

|
Цитата(Sergey_Aleksandrovi4 @ Nov 10 2011, 13:51)  Что, Вы, подразумеваете под фразой "код будет работать". Что случается с программой, когда в прерывании нет задержки: программа не компилируется, МК не входит в прерывание, виснет. Больше конкретики. Что за контроллер используете, какая тактовая частота, среда разработки?
И на будущее, хоть и утверждаете, что без задержки в прерывании "код не работает", но использование задержек в прерывании принципиально неправильно. Не стоит этого никогда делать. Микроконтроллер Atmega8515. Среда WinAVR. Частота тактирования 8MHz. Если поможет, работаю со стендом EV8031. Выводил переменные (count1, count2, lcd - все unsigned char) на светодиоды. В общем, если задержка есть - все работает отлично. Переменные изменяются. Если задержки нет - мерцает только младший бит count1. Ну и логично, что на остальных переменных по нулям.
|
|
|
|
|
Nov 10 2011, 12:13
|
Участник

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

|
Цитата(Палыч @ Nov 10 2011, 14:52)  Стесьняюсь спросить: обработчик прерывания TIMER0 COMP в программе присутствует? Вы не поверите... Выставил бит в 0 и заработало. Спасибо огромное! Судя по всему, я совсем баклажан Не могли бы Вы еще объяснить, почему так произошло? Еще раз спасибо!
|
|
|
|
|
Nov 10 2011, 17:22
|
Участник

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

|
Огромное спасибо!
|
|
|
|
|
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
|
|
|