реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Таймер/счетчик Т0, Не работает Т0. Среда WinAVR. Atmega8515
Dante Krieger
сообщение Nov 9 2011, 23:10
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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);

В чем подвох, не могу понять.
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Nov 10 2011, 10:51
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Что, Вы, подразумеваете под фразой "код будет работать". Что случается с программой, когда в прерывании нет задержки: программа не компилируется, МК не входит в прерывание, виснет. Больше конкретики. Что за контроллер используете, какая тактовая частота, среда разработки?

И на будущее, хоть и утверждаете, что без задержки в прерывании "код не работает", но использование задержек в прерывании принципиально неправильно. Не стоит этого никогда делать.

Сообщение отредактировал Sergey_Aleksandrovi4 - Nov 10 2011, 10:51
Go to the top of the page
 
+Quote Post
Dante Krieger
сообщение Nov 10 2011, 11:21
Сообщение #3


Участник
*

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



Цитата(Sergey_Aleksandrovi4 @ Nov 10 2011, 13:51) *
Что, Вы, подразумеваете под фразой "код будет работать". Что случается с программой, когда в прерывании нет задержки: программа не компилируется, МК не входит в прерывание, виснет. Больше конкретики. Что за контроллер используете, какая тактовая частота, среда разработки?

И на будущее, хоть и утверждаете, что без задержки в прерывании "код не работает", но использование задержек в прерывании принципиально неправильно. Не стоит этого никогда делать.


Микроконтроллер Atmega8515. Среда WinAVR. Частота тактирования 8MHz. Если поможет, работаю со стендом EV8031.
Выводил переменные (count1, count2, lcd - все unsigned char) на светодиоды. В общем, если задержка есть - все работает отлично. Переменные изменяются. Если задержки нет - мерцает только младший бит count1. Ну и логично, что на остальных переменных по нулям.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 10 2011, 11:52
Сообщение #4


Гуру
******

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



Цитата(Dante Krieger @ Nov 10 2011, 03:10) *
Скажем, инициализирую таймер.
Код
TIMSK |= (1 << TOIE0) | (1 << OCIE0);
TCCR0 |= (1 << CS02) | (0 << CS01) | (0 << CS00);
sei();

Стесьняюсь спросить: обработчик прерывания TIMER0 COMP в программе присутствует?
Go to the top of the page
 
+Quote Post
Dante Krieger
сообщение Nov 10 2011, 12:13
Сообщение #5


Участник
*

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



Цитата(Палыч @ Nov 10 2011, 14:52) *
Стесьняюсь спросить: обработчик прерывания TIMER0 COMP в программе присутствует?

Вы не поверите... wacko.gif
Выставил бит в 0 и заработало. Спасибо огромное!
Судя по всему, я совсем баклажан biggrin.gif
Не могли бы Вы еще объяснить, почему так произошло?
Еще раз спасибо!
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 10 2011, 15:38
Сообщение #6


Гуру
******

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



Цитата(Dante Krieger @ Nov 10 2011, 16:13) *
Не могли бы Вы еще объяснить, почему так произошло?

Объяснить почему не работало - легко. Многие компиляторы "забивают" неиспользуемые в программе вектора командами перехода на адрес 0. Если Вы по ошибке разрешили некое прерывание, но обработчика прерывания в программе нет, то программа нормально работает до того момента, как наступает условие того самого ошибочно разрешенного прерывания... По прерыванию программа уходит на начало (адрес 0) и все повторяется...

Мне труднее объяснить: почему работало при вызове _delay_ms(10) ?... С этой функцией я не знаком - сам я задержки таким образом не осуществляю... Вероятно, эта функция для своей работы как раз использует таймер 0, и в результате своей работы благополучно сбрасывает OCIE0.
Go to the top of the page
 
+Quote Post
Dante Krieger
сообщение Nov 10 2011, 17:22
Сообщение #7


Участник
*

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



Огромное спасибо!
Go to the top of the page
 
+Quote Post
maksimp
сообщение Nov 11 2011, 07:08
Сообщение #8


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



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

_delay_ms реализована в виде пустого цикла и таймер 0 не использует. Это inline функция, её можно найти в .h файле.
Поскольку её вызов находился в обработчике прерывания, на всё это время прерывания были запрещены. Но почему работало - всё равно не знаю.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 11 2011, 09:24
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 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 дело, банально, не доходило...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 07:07
Рейтинг@Mail.ru


Страница сгенерированна за 0.01452 секунд с 7
ELECTRONIX ©2004-2016