Czasy wykonywania programu na AT90S2343 z przerwaniem INT0 w AVR - co jest nie tak?

Dziwny problem z AVR i ASM =/





Poprzedni Następny
Wiadomość
Spis treści
From: "Konop" <konop13_at_nospam_gazeta.pl>
Subject: Dziwny problem z AVR i ASM =/
Date: Thu, 7 Jul 2005 23:29:16 +0200


Witam!!

Mam cholerny problem z AVRem, konkretnie AT90S2343, ale problemy
występują nawet w czasie programowej symulacji, więc nie wiem. Jest sobie
program (na końcu wiadomości, celowo pominąłem deklaracje oczywistych
symboli takich jak DDRB, PORTB, SPL, StackStart oraz zmiennych, które są po
prostu rejestrami podręcznymi Rxx). Działa on tak, że na początku
rozładowuje kondensator podpięty do jego wyjścia, przez ustawienie tego pinu
jako wyjście. Gdy zmienna krokf (flaga) przyjmie wartośc 255 program główny
przestawia ten pin na wejście i C ładuje się przez zewnętrzny rezystor.
Jednocześnie zostaje zapalony LED. Jak C się naładuje, zgłoszone jest
przerwanie, LED gaszony, rozpoczyna się rozładowywanie. Ale to nie jest
najważniejsze!! Najgorsze jest to - widzicie tą zdublowaną linię w
procedurze INT0 ( //*//*//)?? Odpaliłem symulator. Jeśli nie zgłaszam
przerwania INT0, to program trafia na miejsce ** co 768,432ms (dla 4MHz),
z kolei jeśli po każdym zatrzymaniu programu w miejscu *** zgłoszę INT0 i
pójdę dalej program wraca do *** po 524,281ms.... . Dziwne, nie?? A teraz
dziwniejsze - wykreślenie jednej z dwóch identycznych linii ( //*//*//)
powoduje, że program wykonuje się odpowiednio: 768,432ms (tyle samo) i
262,144ms (2x mniej). Oświeci mnie ktoś, co jest grane?? Czasy mówią same za
siebie, jak się zaprogramuje proca, to też LED miga 2 razy
wolniej/szybciej... . Serio, nie mam pojęcia, co jest grane, jakby ktoś mógł
pomóc, będę wdzięczny!! Dodam, że pracuję na AVRStudio 4.09.

Pozdrawiam
Konop

rjmp reset
rjmp int0
rjmp timer0

RESET:
ldi temp , StackStart
out SPL , temp ;ustawienie stosu
ldi temp , 2
out TCCR0 , temp ;ustawienie timera0, prescale = 8
ldi temp , 2
out TIMSK , temp ;ustawienie przerwan z timera0
ldi temp , 3
out MCUCR , temp ;ustawienie przerwan int0
ldi temp , 64
out GIMSK , temp ;zezwolenie na int0
ldi temp , 23
out DDRB , temp ;ustawienie portu B
ldi temp , 1
out PORTB , temp

ldi speed , 2 ;zmienna SPEED ma wartość STAŁĄ póki co...
wait_:
inc temp
cpi temp , 0
brne wait_ ; opóźnienie służace rozładowaniu C na wstępie... .
ldi temp , 21
out DDRB , temp ;ustawienie portu B
sei ;zezwolenie na przerwania

ldi temp , 0
mov krokf , temp

loop:
cpi krokf , 255
brne loop
neg krokf
ldi temp , 21
out DDRB , temp ;LADOWANIE C
ldi temp , 29
out PORTB , temp ;ZAPALENIE LEDa ***
rjmp loop

timer0: ;TIMER0
inc krok
cpi krok , 0
brne timer0_end
inc krok2
cp krok2 , speed
brne timer0_end
ldi krok2 , 0
neg krokf
timer0_end:
reti

int0: ;INT0
ldi temp2 , 23 ; //*//*//
ldi temp2 , 23
out DDRB, temp2 ;ROZLADOWYWANIE C
ldi temp2 , 8
out PORTB , temp2 ;ZGAS LEDa
reti