Страница 1 из 1

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

Добавлено: Пн янв 27, 2014 17:20:13
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 версия) и на реальном контролере таймер не крутится. Где и что напортачил - понять не могу уже второй день! :(

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

Добавлено: Пн янв 27, 2014 17:37:04
Dr. Alex
Так настройте таймер!!!! И прерывания нет от него!!!

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

Добавлено: Пн янв 27, 2014 17:41:57
dem-vr
посмотри на такие команды (разрешить и запретить прерывания) SEI CLI

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

Добавлено: Пн янв 27, 2014 19:44:26
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.

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

Добавлено: Вт янв 28, 2014 09:40:49
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.

Автор бы сказал чего конкретно программа должна делать, тогда может и помощь более эффективная будет.

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

Добавлено: Вт янв 28, 2014 12:17:31
tourniquet
Engineer_Keen писал(а): Автор бы сказал чего конкретно программа должна делать
- мигать светодиодом от таймера, читаем книжки дальше, пока непонятно, сложно, но надеемся на чудо ))

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

Добавлено: Вт янв 28, 2014 13:06:50
Engineer_Keen
Тогда я вас обрадую. Ваш код, хоть он весьма нестандартен и далек от того как такую задачу решить более грамотно, работает. На ноге PB0 присутствует меандр с частотой ~3Гц (при стандартных фьюзах контроллера - RC8МГц+CLKDIV8). По крайней мере такой результат выдает симулятор. На будущее подскажу, вашу задачу можно решить полностью железно, безо всяких прерываний и участия ядра контроллера вообще (кроме инициализации). Обратите внимание на режим CTC таймера и настройки выходов COMxx, все это биты в регистрах TCCR1A-B.

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

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