Page 1 of 1

TINY2313-T1

Posted: 06 Jun 2009 00:56
by _Ruslan_
Очень нужна помощь на счет программы под Attiny2313.
Проблема заключается в том, что в подпрограмме обработки прерывания, одной процедурой запускается таймер, а второй останавливается и после одного запуска и остановки, таймер больше не запускается (теми же процедурами). Разрешений на обработку прерываний по таймеру в программе нет. Пробовал на двух контролерах - ситуация та же...

код запуска:

STARTTIME:
LDI Bufer,0b00000001
OUT Tccr1b,bufer
RET

код остановки:
(BUFER - промежуточный регистр)
STOPTIME:
CLR BUFER
OUT Tccr1b,bufer
OUT Tcnt1h,bufer
OUT Tcnt1l,bufer
OUT Tifr,bufer
RET

после выполнения такого кода таймер не запускается:

RCALL STARTTIME
RCALL STOPTIME
RCALL STARTTIME

Фрагмент программы в которой замечен баг:
( LDI BUFER,0b110010
OUT OCR1BH,BUFER
LDI BUFER,0b11001000 \ЗАПИСАЛИ В РЕГИСТР КОМПАРАТОРА
OUT OCR1BL,BUFER
)
RCALL STOPTIME
RCALL STARTTIME
WT: IN BUFER,TIFR
SBRS BUFER,5 //Досчитал ли таймер до 13000? (тестируется бит прерывания OCF1B)
RJMP WT
RCALL STOPTIME

После ее выполнения на момент вызова "STOPTIME" счетчик досчитывает до 7, хотя в регистре компаратора Ocr1b записано число 13000.
Знаю, как впадляк разбираться в чужом коде, да еще и на словах, но если кому-то не очень трудно...

-----------------
Кажется нашел... Регистр TIFR не принимает значения. После записи в него данных он не изменяет состояние своих битов. В чем причина?

Добавлено спустя 10 часов 58 минут 57 секунд:
Баг, заключался в том, что для сброса (обнуление) регистра флагов прерываний TIFR нужно в него записывать "1", а не "0". А AVR Studio 4.16 "не знает" этого и потому когда в TIFR, записываете нули и отлаживаете програму, то TIFR обнулюеться, а в реальном контролере этого не будет.

Правильно:
SER R26
OUT TIFR,R26

Не правильно:
CLR R26
OUT TIFR,R26

Re: TINY2313-T1

Posted: 06 Jun 2009 15:09
by hardlock
_Ruslan_, ну вот видите, сами разобрались. А в АСМе я вообще не силён.