Mega16, таймер. Непонятное поведение

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
proton
Родился
Сообщения: 6
Зарегистрирован: Вс июн 17, 2007 19:16:52
Откуда: Дубна МО

Mega16, таймер. Непонятное поведение

Сообщение proton »

При создании устройства, где используются таймеры, наткнулся на непонятный отсчёт времени. При запуске таймера время отсчёта гуляло, то на 1 сек. меньше, а то на две скинет (в данном случае минимальная дискретность 1 сек). Вернулся к азам - взял макетку, смонтировал схему, удалил весь код не относящийся к данной проблеме, но к сожалению проблема осталась. В прикрепленном файле описал схему, порядок работы и код. Обойти этот случай можно уменьшив дискретность счёта, но в данном случае мне важно где я "вспоткнулся". Спасибо всем кто поможет! 8)
Вложения
code.asm
(4.46 КБ) 451 скачивание
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

проблема по-моему кроется в том, что перед разрешением прерываний по "совпадению" не проверяется состояние флага запроса этого прерывания. Если кнопка не нажималась довольно долго, то этот флаг обязательно будет стоять (т.к. совпадений было много-много), а значит прерывание возникнет сразу же после его разрешения, что и исказит минимум на 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
Родился
Сообщения: 6
Зарегистрирован: Вс июн 17, 2007 19:16:52
Откуда: Дубна МО

Сообщение proton »

Всё естественно, а прописную истину забыл. Спасибо. Как говорится "решая забачи по высшей математике, ошибка будет в использовании таблицы умножения"
proton
Родился
Сообщения: 6
Зарегистрирован: Вс июн 17, 2007 19:16:52
Откуда: Дубна МО

Сообщение proton »

Вечером всё проверил в "железе" - часть проблеммы снялось(считает правильно 3-2-1-стоп) кроме первого раза. После включения питания или после сброса (ресет) первый раз считает на 1 сек меньше, т.е. 2-1-стоп. Себе мозги этой простой программой уже настолько замылил, что не вижу никаких ошибок.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

proton, попробуй таймер запускать тогда, когда надо, а не заранее, т.е. после нажатия кнопки своей, а после отработки задержки - останавливай его.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
proton
Родился
Сообщения: 6
Зарегистрирован: Вс июн 17, 2007 19:16:52
Откуда: Дубна МО

Сообщение 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разрядному регистру идёт как к единому целому регистру. Меня зацепило вроде правильно написанная програмка, а не работает. Не разберёшься сразу в проблемме, значит в последствии сложности могут возникнуть.
Реклама
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

И тебе спасибо, что не перепутал мой ник...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
tych
Э...
Сообщения: 2792
Зарегистрирован: Ср апр 04, 2007 08:39:14
Откуда: Москва
Контактная информация:

Сообщение tych »

proton писал(а):На СИ обращение к 16разрядному регистру идёт как к единому целому регистру.
Это от компилятора зависит - к некоторым можно обратится как к одному а обычно обращаются к L и H раздельно.
Думайте сами, решайте сами ... а вот он-лайн перевод на корявый русский http://translate.ru
proton
Родился
Сообщения: 6
Зарегистрирован: Вс июн 17, 2007 19:16:52
Откуда: Дубна МО

Сообщение proton »

ARV: в жизни всякое бывает, в том числе и ошибки в никах. :? Извини. [/b]
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18675
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

proton писал(а):ARV: в жизни всякое бывает, в том числе и ошибки в никах. :? Извини.
Все нормально, просто были у меня неприятности от подобных ошибок, потому так и реагирую.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»