Atmel AVR blad w programie ?

Apr 14, 2006 10 Replies

Witam,



Od dwóch dni walcze z problemem w prostym programie, opisze krótko jego dzialanie - przy kazdym przerwaniu powinien zwiekszyc wartosc rejestru "num_counter" i wystawic go na port B jednak gdzies lezy blad i program wraca do etykiety start która inicjuje kontroler i dodatkowo kasuje ten rejestr, z pozoru wszystko jest OK ale uklad dziala jak opisalem, HELP !



Z góry dzieki za pomoc



;*************************************************************************** .include "2313def.inc"



.def STATUS_REG =R0



.def TEMP =R16 .def num_counter =R24



.cseg



.org $0000 rjmp start



.org INT0addr rjmp ext_int0



start: ldi TEMP,$50 out SPL,TEMP



ldi TEMP,(1<<ISC01)|(1<<ISC00) out MCUCR,TEMP



ldi TEMP,$FF out DDRB,TEMP



ldi TEMP,(1<<INT0) out GIMSK,TEMP



clr TEMP mov num_counter,TEMP



sei



MAIN_LOOP:



rjmp MAIN_LOOP



ext_int0: in STATUS_REG,SREG out PORTB,num_counter inc num_counter out SREG,STATUS_REG reti


Uzytkownik "Carlosek" napisal w wiadomosci program wraca do etykiety start która inicjuje kontroler i dodatkowo kasuje ten rejestr, z pozoru wszystko jest OK ale uklad dziala jak opisalem, HELP !

probowales wstawic nop'a w te pusta petle programu glownego? o ile pamietam, kiedy nie bardzo chciala mi dzialac taka pusta petla.

oprocz tego: ldi TEMP,$50 out SPL,TEMP

proponuje robic ldi temp, RAMEND (czy jak sie tam nazywala ta stala zapisana w pliku inc)

Nie powinno byc jeszcze jakiegos zapisu do rejestru TIMSK ? (timer interrupt mask register?)

Juz jakis czas nie pisalem nic na avra, wiec moge cos mylic, ale takie rzeczy rzucily mi sie w oczy.

U¿ytkownik "mIrO" napisa³ w wiadomo¶ci

ecch, przerwanie zewnetrzne, nie wiem skad mi sie tam wzial timer ;)

pzdr, mIrO

W jakim programie napisany jest ten kawalek kodu podany przez kolege? Czy to nie jest czasami C?

P.S. Sorki tak z ciekawosci pytam.

Mo¿na to napisaæ w ka¿dym edytorze tekstowym. I to z ca³± pewno¶ci± nie jest C.

Czy dzia³a obs³uga przerwania? Bo je¶li nie, to rejestr "num_counter" nigdy siê nie zwiêkszy. Pozatym pod³±cz do portu jakie¶ diody i korzystaj z nich :)

Uzytkownik "Carlosek" napisal w wiadomosci

start: ldi TEMP,$50 out SPL,TEMP

A ja nadal polecam zmienic ten fragment z $50 na RAMEND.

W dokumentacji (s. 17) stoi cos takiego:

The Stack Pointer must be set to point above $60. Jesli sie nie myle, to $50 < $60, wiec cos jest nie tak.

Konkretnie (s. 18, dol): ldi temp, low(RAMEND) out SPL, temp

Ramend to najprawdopodobniej wartosc $DF. Ustawiajac z palca $50, chyba ustawiasz SPL w srodek obszaru rejestrow systemowych.

Mam nadzieje, ze jak zmienisz, to zadziala :)

Polecam takze fragment taki, mowiacy jak dziala stos (s. 17) i dlaczego SPL ma byc ustawiony na koniec ramu, a nie na jego poczatek... (i do tego z bledem ;) ): The Stack Pointer is decremented by 1 when data is pushed onto the stack with the PUSH instruction, and it is decremented by 2 when an address is pushed onto the stack with subroutine calls and interrupts. The Stack Pointer is incremented by 1 when data is popped from the stack with the POP instruction, and it is incremented by 2 when an address is popped from the stack with return from subroutine RET or return from interrupt RETI.

hej,

pisze bezposrednio w asemblerze, cenie sobie jego prostote

pozdrawiam

nie wlaczalem watchdoga, tez podejrzewalem ze petla powoduje reset, chyba ze watchdog jest wlaczany domyslnie...

pozdrawiam

Dzialaa!!!! pomogla zamiana na:

ldi temp, low(RAMEND)

wielkie dzieki !!!! pozdrawiam i zycze wesolych swiat

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required