Помогите разобраться с таймером 1 в меге32

Обсуждаем контроллеры компании Atmel.
Ответить
Василий_В2
Родился
Сообщения: 7
Зарегистрирован: Пн май 12, 2014 19:50:16

Помогите разобраться с таймером 1 в меге32

Сообщение Василий_В2 »

Не могу понять в чем загвоздка, не срабатывает прерывание и все тут. Полазал по форуму похожего не нашел. Помогите пожалуйста!!
использую AVR Studio 5
контроллер АТМЕГА32

Код: Выделить всё

#include <avr/io.h>
#include <avr/interrupt.h>

unsigned short sec=0, flag=0, min=0;

// обработчик прерывания по переполнению
ICR(TIMER1_OVF_vect) {
TCNT1H=0;
TCNT1L=0;
sec++;
flag=1;
}

void initTimer1(void)
{
cli();
TCCR1A=0; // выводы - нет,  шим -нет
TCNT1=0; // стартуем начиная с нуля
TCCR1B=2; // тактирование на 8
TIMSK|=_BV(TOIE1); // прерывание по переполнению ТС1
sei();
}

int main(void)
{
initTimer1();

while(1)  {
    if (flag==1){
      flag=0;
      if(sec>59) {
         sec=0;
         min++;
         if(min>59) min=0;
         }
      }
    }
}
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: Помогите разобраться с таймером 1 в меге32

Сообщение ИС-пытатель »

А с чего взяли, что не срабатывает? где проверяете? в железе или в эмуляторе?

Переменные sec и flag объявите volatile. И на ваши переменные вполне unsigned char хватит.
Василий_В2
Родился
Сообщения: 7
Зарегистрирован: Пн май 12, 2014 19:50:16

Re: Помогите разобраться с таймером 1 в меге32

Сообщение Василий_В2 »

Спасибо ИС-пытатель вроде разобрался )))
сделал некоторые изменения

Код: Выделить всё

...
int main(void)
{

//проверка на пробу правильно ли собрана цепь светодиода   
DDRD|=_BV(PIN_LED); // pin D6 - output LED
PORTD&=~_BV(PIN_LED);   // v 0 - светодиод горит
_delay_ms(500);
PORTD|=_BV(PIN_LED); // v 1 - светодиод не горит

initTimer1();
while(1)
    {
    if (flag==1){
      flag=0;
      PORTD&=~_BV(PIN_LED);   //  - светодиод горит (меняет 0->1, 1->0 )
      if(sec>59) {
                      ...

Проверяю в протеусе, поставил volatile, все равно переменная sec не увеличивается ! и переменная flag тоже не меняется видимо какая то трабла с выводом переменных в протеусе, потому что светодиод висящий на ноге мигает при эмуляции.
Буду проверять на железе
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: Помогите разобраться с таймером 1 в меге32

Сообщение ИС-пытатель »

Протеус частенько тупит с отображением значений переменных, хотя эмулирует в большинстве случаев более-менее правильно.
Аватара пользователя
oldmaelstrom
Открыл глаза
Сообщения: 66
Зарегистрирован: Ср май 02, 2012 11:09:24
Откуда: Житомир
Контактная информация:

Re: Помогите разобраться с таймером 1 в меге32

Сообщение oldmaelstrom »

чего-то я не заметил глобального разрешения прерываний :)
ONtOSbox
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: Помогите разобраться с таймером 1 в меге32

Сообщение ИС-пытатель »

В InitTimer1. Я тоже сначала подумал, что это к прерыванию относится.
Аватара пользователя
oldmaelstrom
Открыл глаза
Сообщения: 66
Зарегистрирован: Ср май 02, 2012 11:09:24
Откуда: Житомир
Контактная информация:

Re: Помогите разобраться с таймером 1 в меге32

Сообщение oldmaelstrom »

я конечно не профи, но мне думается что мало разрешить прерывания в initTimer1(), в главной функции их тоже надо разрешить
ONtOSbox
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: Помогите разобраться с таймером 1 в меге32

Сообщение ИС-пытатель »

Кстати! Тема! Если, не ошибаюсь, СИ сохраняет и восстанавливает флаги при вызове подпрограмм (хотя, может, только при вызове прерываний). Василий ,попробуйте SEI перенести в main.

Проверил. Флаги только при вызове прерываний сохраняются. При вызове подпрограмм они не трогаются. Но лучше все равно перенести.
Василий_В2
Родился
Сообщения: 7
Зарегистрирован: Пн май 12, 2014 19:50:16

Re: Помогите разобраться с таймером 1 в меге32

Сообщение Василий_В2 »

sei() перенес ничего не изменилось, но вот беда, не разобрался я еще с этим таймером - оказывается после срабатывания прерывания таймера программа начинает работать с самого начала т.е. с самой первой строчки функции main() - поэтому переменные и не плюсовались у меня. понял это когда эту строчку

Код: Выделить всё

 PORTD&=~_BV(PIN_LED);  
удалил из While(1), и при этом светодиод все равно продолжал мигать.
Беда какая-то что делать не знаю, подскажите плиз !!!!
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: Помогите разобраться с таймером 1 в меге32

Сообщение ИС-пытатель »

Василий_В2 писал(а): оказывается после срабатывания прерывания таймера программа начинает работать с самого начала т.е. с самой первой строчки функции main()

Такое бывает если разрешили какое-то прерывание, а обработчик для него написать забыли (или написали, но не для того). Но в Вашем коде вроде бы все норм. Василий, выложите весь код, пожалуйста.
Василий_В2
Родился
Сообщения: 7
Зарегистрирован: Пн май 12, 2014 19:50:16

Re: Помогите разобраться с таймером 1 в меге32

Сообщение Василий_В2 »

вот мой код
Вложения
AVRGCC2.c
(1.51 КБ) 166 скачиваний
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: Помогите разобраться с таймером 1 в меге32

Сообщение ИС-пытатель »

Несущественно подправил. Так что должен делать Ваш код? Вы вначале зажигаете светодиоды, потом через полсекунды гасите, а потом, когда таймер срабатывает - снова зажигаете. И.. как бы все..
Вложения
AVRGCC2.c
(1.94 КБ) 364 скачивания
Василий_В2
Родился
Сообщения: 7
Зарегистрирован: Пн май 12, 2014 19:50:16

Re: Помогите разобраться с таймером 1 в меге32

Сообщение Василий_В2 »

Программа должна была при включении зажеч светодиод потом через пол секунды погасить и дальше ничего не делать со светодиодом (при том что закоментированы две строки в main()) и считать счетчики sec и min - по факту получается что она (при закоментированных строках) продолчает мигает светодиодами как ни в чем не бывало!
Аватара пользователя
ИС-пытатель
Вымогатель припоя
Сообщения: 577
Зарегистрирован: Ср июн 19, 2013 08:10:48
Откуда: Москва, СПб, Липецк, Рязань

Re: Помогите разобраться с таймером 1 в меге32

Сообщение ИС-пытатель »

Сторожевой таймер (watch dog) отключите.
Василий_В2
Родился
Сообщения: 7
Зарегистрирован: Пн май 12, 2014 19:50:16

Re: Помогите разобраться с таймером 1 в меге32

Сообщение Василий_В2 »

Таймер не отключал, но вставлял в программу сбросы watch dog, также удлинял время срабатывания таймера1 до максимального (более чем срабатывает таймер watch dog) - все равно падает ровно на возникновении прерывания(наблюдал по регистрам в протеусе). Какая еще может быть причина?
ЗЫ: железка на которой все проверяется после протеуса такая http://microsin.net/programming/AVR/avr-usb-mega16.html (у меня вариант ATMEGA32) может быть это как-нибудь прояснит ситуацию.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Помогите разобраться с таймером 1 в меге32

Сообщение ARV »

я вообще не понимаю, как ваш код скомпилировался без ошибок! макрос для прерываний в WinAVR называется ISR, а не ICR, как у вас.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Василий_В2
Родился
Сообщения: 7
Зарегистрирован: Пн май 12, 2014 19:50:16

Re: Помогите разобраться с таймером 1 в меге32

Сообщение Василий_В2 »

Спасибо огромное ARV переправил название макроса и все зааработало, уж незнаю как это получалось скомпилировать, видимо такая AVR Studio которая такое пропускает х.з. )))
Ответить

Вернуться в «AVR»