- Вложения
-
- code.asm
- (4.46 КБ) 451 скачивание
Mega16, таймер. Непонятное поведение
При создании устройства, где используются таймеры, наткнулся на непонятный отсчёт времени. При запуске таймера время отсчёта гуляло, то на 1 сек. меньше, а то на две скинет (в данном случае минимальная дискретность 1 сек). Вернулся к азам - взял макетку, смонтировал схему, удалил весь код не относящийся к данной проблеме, но к сожалению проблема осталась. В прикрепленном файле описал схему, порядок работы и код. Обойти этот случай можно уменьшив дискретность счёта, но в данном случае мне важно где я "вспоткнулся". Спасибо всем кто поможет! 
- Реклама
проблема по-моему кроется в том, что перед разрешением прерываний по "совпадению" не проверяется состояние флага запроса этого прерывания. Если кнопка не нажималась довольно долго, то этот флаг обязательно будет стоять (т.к. совпадений было много-много), а значит прерывание возникнет сразу же после его разрешения, что и исказит минимум на 1 секунду временной интервал. По-моему, надо просто сбросить флаг запроса перед тем, как разрешить прерывания.
Сейчас так:
Надо так:
Сейчас так:
Код: Выделить всё
ldi Temp0,0
out TCNT1L,Temp0 ;обнуление таймера перед запуском
out TCNT1H,Temp0
ldi Temp0,timer_on ;разрешить прерывание таймера_1A по совпадению
out TIMSK,Temp0
Код: Выделить всё
ldi Temp0,0
out TCNT1L,Temp0 ;обнуление таймера перед запуском
out TCNT1H,Temp0
ldi Temp0,timer_on
out TIFR, Temp0 ; сбросим флаг запроса прерывания
out TIMSK,Temp0 ;разрешить прерывание таймера_1A по совпадению
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
proton, попробуй таймер запускать тогда, когда надо, а не заранее, т.е. после нажатия кнопки своей, а после отработки задержки - останавливай его.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Реклама
Код (как должно быть):
ldi Temp0,0
out TCNT1H,Temp0 ;обнуление таймера перед запуском
out TCNT1L,Temp0
ldi Temp0,timer_on
out TIFR, Temp0 ; сбросим флаг запроса прерывания
out TIMSK,Temp0 ;разрешить прерывание таймера_1A по совпадению
Все оказалось как всегда не очень сложно. А всеошибки в первую очередь от невнимательности. В исходном файле первую ошибку помог найти AVR за что ему большое спасибо. А вторая ошибка - это очерёдность обнуления 16 разрядного регистра таймара_1. Спасибо всем кто помог или попытался помочь.
tych: По поводу перейти на язык СИ. Я и на СИ могу написать эту программу. На СИ обращение к 16разрядному регистру идёт как к единому целому регистру. Меня зацепило вроде правильно написанная програмка, а не работает. Не разберёшься сразу в проблемме, значит в последствии сложности могут возникнуть.
ldi Temp0,0
out TCNT1H,Temp0 ;обнуление таймера перед запуском
out TCNT1L,Temp0
ldi Temp0,timer_on
out TIFR, Temp0 ; сбросим флаг запроса прерывания
out TIMSK,Temp0 ;разрешить прерывание таймера_1A по совпадению
Все оказалось как всегда не очень сложно. А всеошибки в первую очередь от невнимательности. В исходном файле первую ошибку помог найти AVR за что ему большое спасибо. А вторая ошибка - это очерёдность обнуления 16 разрядного регистра таймара_1. Спасибо всем кто помог или попытался помочь.
tych: По поводу перейти на язык СИ. Я и на СИ могу написать эту программу. На СИ обращение к 16разрядному регистру идёт как к единому целому регистру. Меня зацепило вроде правильно написанная програмка, а не работает. Не разберёшься сразу в проблемме, значит в последствии сложности могут возникнуть.
И тебе спасибо, что не перепутал мой ник...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Это от компилятора зависит - к некоторым можно обратится как к одному а обычно обращаются к L и H раздельно.proton писал(а):На СИ обращение к 16разрядному регистру идёт как к единому целому регистру.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
Все нормально, просто были у меня неприятности от подобных ошибок, потому так и реагирую.proton писал(а):ARV: в жизни всякое бывает, в том числе и ошибки в никах.Извини.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!


