Страница 1 из 1

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

Добавлено: Пт июл 26, 2013 09:02:53
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();
...


Что делаю не так??? или что то забыл ?

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

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

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

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

Чтоб этого не произошло, нужно объявить ее как volatile.

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

Добавлено: Пт июл 26, 2013 09:15:16
orkus
Глобальная

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

static volatile uint8_t sec=0;



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

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

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



Я думаю что напутал с таймерами и прерываниями =(

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

Добавлено: Пт июл 26, 2013 09:17:45
coredumped
я предыдущее сообщение подправил...
cnt2step как объявлена?

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

Добавлено: Пт июл 26, 2013 09:18:41
orkus
глобально

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

static volatile uint8_t cnt2step=0;

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

Добавлено: Пт июл 26, 2013 09:23:43
coredumped
попробуйте убрать "static". глобальные переменные и так статические, а ключевое слово static применяемое к глобальным переменным, ограничевает ее область видимости модулем, в котором она объявлена.

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

Добавлено: Пт июл 26, 2013 09:36:44
orkus
Без результата =(
Я думаю все же что то с таймером

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

не срабатывает прерывание =(

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

Добавлено: Пт июл 26, 2013 10:24:49
zero648
Может быть нужно сделать какую нибудь петлю типа while

или прерывания включать так: #asm("sei");

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

Добавлено: Пт июл 26, 2013 10:30:56
orkus
петля в майне есть

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

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

while(1)
{
......
if (sec>60 && start_web_client==2)
.......
}

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

Добавлено: Пт июл 26, 2013 11:27:14
eess9

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

TCCR1A=(1<<WGM12); 


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

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

Добавлено: Пт июл 26, 2013 12:02:06
orkus
Спасибо всем кто откликнулся!

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

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

TCCR1B=(1<<CS12)|(1<<CS10)|(1<<WGM12);