Страница 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? Компилятор может запросто посчитать ее (переменную) ненужной и выкосить нафиг, включая и этот кусок кода.
Чтоб этого не произошло, нужно объявить ее как volatile.
Re: Пробелма с Таймером AtMega16
Добавлено: Пт июл 26, 2013 09:15:16
orkus
Глобальная
Используется в main
Я думаю что напутал с таймерами и прерываниями =(
Re: Пробелма с Таймером AtMega16
Добавлено: Пт июл 26, 2013 09:17:45
coredumped
я предыдущее сообщение подправил...
cnt2step как объявлена?
Re: Пробелма с Таймером AtMega16
Добавлено: Пт июл 26, 2013 09:18:41
orkus
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
Уважаемый
orkus datasheet мне подсказывает, что бит WGM12 находится в регистре TCCR1B. А своей записью вы принудительно изменили состояние пина OC1A (если, конечно, порт у вас настроен на выход). Компилятор тупой, он подставил в место WGM12 3 (три) и скушал. А в каком регистре ему вообще до лампочки.

Re: Пробелма с Таймером AtMega16
Добавлено: Пт июл 26, 2013 12:02:06
orkus
Спасибо всем кто откликнулся!
Уважаемый
eess9 зрит в корень!