Пробелма с Таймером AtMega16

Обсуждаем контроллеры компании Atmel.
Ответить
orkus
Родился
Сообщения: 16
Зарегистрирован: Вт июн 14, 2011 16:06:50

Пробелма с Таймером AtMega16

Сообщение orkus »

Мяу!

Atmega16 16 Mhz
Делаю таймер с коэффициентом деления 1024 16 000 000 / 1024 = 15625
Далее делаю прерывания по совпадению и сраниваюс 312. 15625 / 312 =50 Это 50 раз в секунду получается
Но sec не увеличиваться =(

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

void init_cnt2(void)
{
   cnt2step=0;
   TIMSK=(1<<OCIE1A);
   TCNT1=0;
   OCR1A=312;
   TCCR1A=(1<<WGM12);
   TCCR1B=(1<<CS12)|(1<<CS10);
}

ISR(TIMER1_COMPA_vect){
   cnt2step++;
   if (cnt2step>50)
   {
                cnt2step=0;
                sec++;       
   }
}


в
int main(void)
{
...
      init_cnt2();
      sei();
...


Что делаю не так??? или что то забыл ?
Реклама
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Re: Пробелма с Таймером AtMega16

Сообщение coredumped »

Как и где объявлены sec и cnt2step? Компилятор может запросто посчитать ее (переменную) ненужной и выкосить нафиг, включая и этот кусок кода.

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

 if (cnt2step>50)
   {
                cnt2step=0;
                sec++;       
   }

Чтоб этого не произошло, нужно объявить ее как volatile.
Последний раз редактировалось coredumped Пт июл 26, 2013 09:15:21, всего редактировалось 1 раз.
Все будет только лучше, в крайнем случае - хуже.
Реклама
orkus
Родился
Сообщения: 16
Зарегистрирован: Вт июн 14, 2011 16:06:50

Re: Пробелма с Таймером AtMega16

Сообщение orkus »

Глобальная

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

static volatile uint8_t sec=0;



Используется в main

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

if (sec>60 && start_web_client==2)



Я думаю что напутал с таймерами и прерываниями =(
Последний раз редактировалось orkus Пт июл 26, 2013 09:18:01, всего редактировалось 1 раз.
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Re: Пробелма с Таймером AtMega16

Сообщение coredumped »

я предыдущее сообщение подправил...
cnt2step как объявлена?
Все будет только лучше, в крайнем случае - хуже.
Реклама
Эиком - электронные компоненты и радиодетали
orkus
Родился
Сообщения: 16
Зарегистрирован: Вт июн 14, 2011 16:06:50

Re: Пробелма с Таймером AtMega16

Сообщение orkus »

глобально

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

static volatile uint8_t cnt2step=0;
Реклама
Аватара пользователя
coredumped
Опытный кот
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Re: Пробелма с Таймером AtMega16

Сообщение coredumped »

попробуйте убрать "static". глобальные переменные и так статические, а ключевое слово static применяемое к глобальным переменным, ограничевает ее область видимости модулем, в котором она объявлена.
Все будет только лучше, в крайнем случае - хуже.
Реклама
orkus
Родился
Сообщения: 16
Зарегистрирован: Вт июн 14, 2011 16:06:50

Re: Пробелма с Таймером AtMega16

Сообщение orkus »

Без результата =(
Я думаю все же что то с таймером

Вообще программа не входит
ISR(TIMER1_COMPA_vect)
{
....
}

не срабатывает прерывание =(
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: Пробелма с Таймером AtMega16

Сообщение zero648 »

Может быть нужно сделать какую нибудь петлю типа while

или прерывания включать так: #asm("sei");
orkus
Родился
Сообщения: 16
Зарегистрирован: Вт июн 14, 2011 16:06:50

Re: Пробелма с Таймером AtMega16

Сообщение orkus »

петля в майне есть

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

.........
init_cnt2();
sei();
......

while(1)
{
......
if (sec>60 && start_web_client==2)
.......
}
Аватара пользователя
eess9
Вымогатель припоя
Сообщения: 672
Зарегистрирован: Ср фев 29, 2012 01:58:32
Откуда: Харьков, Украина

Re: Пробелма с Таймером AtMega16

Сообщение eess9 »

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

TCCR1A=(1<<WGM12); 


Уважаемый orkus datasheet мне подсказывает, что бит WGM12 находится в регистре TCCR1B. А своей записью вы принудительно изменили состояние пина OC1A (если, конечно, порт у вас настроен на выход). Компилятор тупой, он подставил в место WGM12 3 (три) и скушал. А в каком регистре ему вообще до лампочки. :)
orkus
Родился
Сообщения: 16
Зарегистрирован: Вт июн 14, 2011 16:06:50

Re: Пробелма с Таймером AtMega16

Сообщение orkus »

Спасибо всем кто откликнулся!

Уважаемый eess9 зрит в корень!

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

TCCR1B=(1<<CS12)|(1<<CS10)|(1<<WGM12);
Ответить

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