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