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

несоответствие времени в avr studio и реале

Добавлено: Пт фев 18, 2011 15:05:27
Razor
Постараюсь покороче:
ATMega16 + код (без таблицы прерываний). Кварц 10Мгц
По идее (что и показывает студия) портС должен моргать в режиме SOS с периодом точки - 1 сек,
тире - 2 сек, пауза между ними - 2 сек что задается в массиве и умножением значения задержки на 98. В реале же порт моргает гораздо чаще. Переключения порта еле заметны глазом. Подскажите пожалуйста в чем я ошибся.

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

.include "m16def.inc"

.def temp=R16
.def time=R20
.def stage=R21
.def sign=R17

.DSEG
.CSEG

         .ORG $000        ; (RESET) 
         RJMP   Reset
   
Reset:
;èíèöèàëèçèðóåì ñòåê
LDI R16, low(RAMEND)
out SPL, R16
LDI R16, high(RAMEND)
out SPH, R16

;nastroyka portov
ldi R16, 0b11111111
out DDRC, R16
;out DDRA, R16
;out DDRB, R16

;ïåðâè÷íûé íàñòðîéêà è çàïóñê òàéìåðà

ldi ZH, high(array*2)
ldi ZL, low(array*2)

lpm

out OCR1AL, R0

ldi temp, 0
out TCNT1H, temp
out TCNT1L, temp

ldi temp, 1<<2|1<<0
;ldi temp, 1<<0
out TCCR1B, temp
ldi temp, 1<<4
out TIMSK, temp

sei

ldi temp, 1
add ZL, temp
ldi temp, 0
adc ZH, temp
lpm
mov sign, R0

;îáíóëÿåì âðåìÿ ÷òîáû ïðîãðàììà çàãðóçèëà ñëåäóþùåå çíà÷åíèå âðåìåíè
ldi time, 0

ldi stage, 2



ldi R16, 0b11111111
out PORTA, R16
ldi R16, 0b00000000
out PORTB, R16


Main:
rcall tststage
cpi sign, 1
brne offsignal
ldi R16, 0b11111111
out PORTC, R16
rjmp oute

offsignal:
ldi R16, 0b00000000
out PORTC, R16

oute:

rjmp Main

array:
.db 100, 1, 200, 0
.db 100, 1, 200, 0
.db 100, 1, 200, 0
.db 200, 1, 200, 0
.db 200, 1, 200, 0
.db 200, 1, 200, 0
.db 100, 1, 200, 0
.db 100, 1, 200, 0
.db 100, 1, 200, 0



;*********************************************************************
;ïîäïðîãðàììû
tststage:
push temp
cpi time, 0
brne out1
cpi stage, 36
brne okstage
ldi stage, 0
okstage:
ldi ZH, high(array*2)
ldi ZL, low(array*2)
mov temp, stage
add ZL, temp
ldi temp, 0
adc ZH, temp
lpm

mov time, R0
ldi temp, 1
add ZL, temp
ldi temp, 0
adc ZH, temp
lpm
mov sign, R0

ldi temp, 2
add stage, temp
out1:
pop temp
ret

;********************************************************************
;ïðåðûâàíèÿ

tim1a:
push temp
push R1
push R0
ldi temp, 0
out TCNT1H, temp
out TCNT1L, temp
ldi temp, 98
mul time, temp
out OCR1AL, R0
out OCR1AH, R1
ldi time, 0
pop R0
pop R1
pop temp
reti

Re: несоответствие времени в avr studio и реале

Добавлено: Пт фев 18, 2011 18:56:13
ChipKiller
Razor писал(а):Подскажите пожалуйста в чем я ошибся.
.. либо в коде, либо в настройках симулятора Аvr Studio - все должно работать нормально.

Re: несоответствие времени в avr studio и реале

Добавлено: Пт фев 18, 2011 21:51:35
s64
студия достаточно точно симулирует временные интервалы, скорее всего проблема в настройках.

Re: несоответствие времени в avr studio и реале

Добавлено: Сб фев 19, 2011 06:55:40
Razor
А по коду что скажете? Я правильно настроил таймер? По идее при максимальном значении в регистре сравнения таймера пауза должна быть около 6 секунд. На деле светодиод мигает на частоте 10-20 герц.

Re: несоответствие времени в avr studio и реале

Добавлено: Сб фев 19, 2011 08:10:15
ChipKiller
Razor писал(а):По идее (что и показывает студия) портС должен моргать в режиме SOS...
... не знаю, что там "показывает студия", но программа будет делать именно то, что написано Вами. В чем могут быть ошибки - уже писал. Не обладая возможностью телепата - не могу знать, правильно ли заданы параметры симулятора. Что касается кода - то
Razor писал(а):

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

;

;********************************************************************
;ïðåðûâàíèÿ

tim1a:
push temp
push R1
push R0
ldi temp, 0
out TCNT1H, temp
out TCNT1L, temp
ldi temp, 98
mul time, temp
out OCR1AL, R0
out OCR1AH, R1
ldi time, 0
pop R0
pop R1
pop temp
reti
... никогда не получит управления, потому что
Razor писал(а):

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

.CSEG

         .ORG $000        ; (RESET)
         RJMP   Reset
   
Reset:
... нет RJMP tim1a

Re: несоответствие времени в avr studio и реале

Добавлено: Сб фев 19, 2011 08:59:31
Razor
... никогда не получит управления, потому что

Как я сказал выше таблица прерываний убрана для краткости.

Re: несоответствие времени в avr studio и реале

Добавлено: Сб фев 19, 2011 11:19:23
akl
Может быть из-за этого? Ну и, естественно, JTAG должен быть отключен.

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

;*************************************************
	OUT OCR1AH, R1
	OUT OCR1AL, R0
;out OCR1AL, R0
;out OCR1AH, R1
;*************************************************

Re: несоответствие времени в avr studio и реале

Добавлено: Сб фев 19, 2011 11:55:36
Razor
akl :-))))
Только что сам нашел это и хотел написать что проблема решена.

Проблема была именно из за этого. Так как протеус показывал результаты схожие с реалом начал отслеживать различия между протеусом и студией пошагово. Оказалось что если сначала загружать данные в OCR1AL то число в OCR1AH почему то не загружается.

В связи с этим вопрос : это баг или фича и почему студия этого не учитывает?

Re: несоответствие времени в avr studio и реале

Добавлено: Сб фев 19, 2011 12:30:27
akl
Razor писал(а):это баг или фича и почему студия этого не учитывает?
Порядок записи и чтения 16-разрядных регистров объявлен DS на AVR
To do a 16-bit write, the High byte must be written before the Low byte. For a 16-bit read, the Low byte must be read before the High byte.
Почему студия не учитывает этот факт. Фиг его знает.