Страница 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);