TINY2313-T1
Posted: 06 Jun 2009 00:56
Очень нужна помощь на счет программы под 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
Проблема заключается в том, что в подпрограмме обработки прерывания, одной процедурой запускается таймер, а второй останавливается и после одного запуска и остановки, таймер больше не запускается (теми же процедурами). Разрешений на обработку прерываний по таймеру в программе нет. Пробовал на двух контролерах - ситуация та же...
код запуска:
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