Таймер стоит на месте!

Обсуждаем контроллеры компании Atmel.
Ответить
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт ноя 01, 2013 14:52:41

Сообщение tourniquet »

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

.include        "tn2313adef.inc"
.list
 
.def    temp = R16

.equ	kdel = 780

; ***************

rjmp Init

; ***************

Init:
	ser		temp				
	out		DDRB, temp			 
	out		DDRD, temp			 
	out		PortB, temp			
	out		PortD, temp			

; ***************

	ldi		temp, 0x05
	out		TCCR1B, temp

; ***************

main:
	sbic	PinB, 0
	rjmp	turnON
	
	sbis	PinB, 0
	rjmp	turnOFF


; ***************

turnON:
	sbic	PinB, 0
	cbi		PortB, 0

	rjmp 	setVar


; ***************

turnOFF:
	sbis	PinB, 0
	sbi		PortB, 0
	
	rjmp	setVar
	
; ***************

setVar:
	ldi		temp, 0
	out		TCNT1H, temp
	out		TCNT1L, temp

wt1:
	in		temp, TCNT1L
	cpi		temp, low(kdel)
	brlo	wt1
	in		temp, TCNT1H
	cpi		temp, high(kdel)
	brlo	wt1

	rjmp	main
День добрый! Не могу понять где ошибся, и в Студии (6 версия) и на реальном контролере таймер не крутится. Где и что напортачил - понять не могу уже второй день! :(
Реклама
Это не хвост, это антенна
Аватара пользователя
Сообщения: 1438
Зарегистрирован: Вт окт 28, 2008 09:00:18
Откуда: Украина, Харьков

Сообщение Dr. Alex »

Так настройте таймер!!!! И прерывания нет от него!!!
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением...
Контактная информация:
Реклама
Встал на лапы
Сообщения: 97
Зарегистрирован: Пн ноя 27, 2006 20:58:02

Сообщение dem-vr »

посмотри на такие команды (разрешить и запретить прерывания) SEI CLI
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

tourniquet писал(а):Где и что напортачил - понять не могу уже второй день! :(
Вот в этой теме для начала посмотрите, как нужно оформлять таблицу векторов прерываний. Не поленитесь сделать так, как там написано.
Вот список Ваших ошибок:
1. Вы не инициализируете указатель вершины стека
2. В программе отсутствует таблица векторов прерываний и, как следствие, вектор прерывания по переполнению таймера
3. Вы не разрешаете глобально прерывания командой sei
4. Вы не устанавливаете в регистре TIMSK флаг разрешения прерывания по переполнению нужного таймера
5. Вы не запускаете таймер

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

Дальше. Вы пишете:

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

	ser		temp				
	out		DDRB, temp			 
	out		DDRD, temp			 
	out		PortB, temp			
	out		PortD, temp			
, тем самым, настраивая порт B на вывод, а затем пытаетесь читать из этого порта

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

	sbic	PinB, 0
Это некорректно. Вы уж определитесь, ввод Вам нужен, или вывод на линиях порта B.
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

И что вы до прерываний докопались? Ну не используются они тут по задумке автора, правда таймер как обычный программный счетчик странно использовать, но раз так задумано...
Да и стек тогда не обязателен, вы тут хоть один RCALL-RET-PUSH-POP видите? Хотя для порядка конечно не мешало бы его проинициализировать.
Alkul писал(а): 1. Вы не инициализируете указатель вершины стека
2. В программе отсутствует таблица векторов прерываний и, как следствие, вектор прерывания по переполнению таймера
3. Вы не разрешаете глобально прерывания командой sei
4. Вы не устанавливаете в регистре TIMSK флаг разрешения прерывания по переполнению нужного таймера
5. Вы не запускаете таймер
Достаточно перечислено ошибок, "мешающих" работе таймера? :))
А ведь ни одно из вышеперечисленного работе таймера не мешает... Ну разве что п.5, но он таки выполнен (ldi temp, 0x05; out TCCR1B, temp). И кстати, таймер работает, а вот с входами-выходами действительно надо разбираться...
Alkul писал(а):

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

	sbic	PinB, 0
Это некорректно. Вы уж определитесь, ввод Вам нужен, или вывод на линиях порта B.
Скорее бесполезно, если порт жив и нет никаких КЗ, то PINB=PORTB.

Автор бы сказал чего конкретно программа должна делать, тогда может и помощь более эффективная будет.
Реклама
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт ноя 01, 2013 14:52:41

Сообщение tourniquet »

Engineer_Keen писал(а): Автор бы сказал чего конкретно программа должна делать
- мигать светодиодом от таймера, читаем книжки дальше, пока непонятно, сложно, но надеемся на чудо ))
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Сообщение Engineer_Keen »

Тогда я вас обрадую. Ваш код, хоть он весьма нестандартен и далек от того как такую задачу решить более грамотно, работает. На ноге PB0 присутствует меандр с частотой ~3Гц (при стандартных фьюзах контроллера - RC8МГц+CLKDIV8). По крайней мере такой результат выдает симулятор. На будущее подскажу, вашу задачу можно решить полностью железно, безо всяких прерываний и участия ядра контроллера вообще (кроме инициализации). Обратите внимание на режим CTC таймера и настройки выходов COMxx, все это биты в регистрах TCCR1A-B.
Первый раз сказал Мяу!
Сообщения: 31
Зарегистрирован: Пт ноя 01, 2013 14:52:41

Сообщение tourniquet »

Я решил прочитать заново книжку Белова, и снова дошёл до этого примера с таймерами. Добавил таймер в другую прогу, без каких либо изменении (таймера), и он работает. Читаю дальше, надо разобратся до конца! )
Ответить

Вернуться в «AVR»