AVR -- nie rozumiem !!

Aug 08, 2004 9 Replies

Zaczynam przesiadkê z '51 na AVR i piszê swój pierwszy program w assemblerze: .org 0x000 rjmp start



.org 0x100



start:



ldi r16,0x060 sts 0x3d,r16 - ustawiam stos



ldi r16,0x0ff - ustawiam portr B jako wyj¶cia out 0x17,r16



ldi r16,0x055 - wystawiam przeplatankê out 0x18,r16



loop2: jmp loop2 - zapêtlam abym widzia³ co jest



Watchdog jest wy³±czony. Spodziewam siê na porcie B przeplatanki zapalonych bitów. Ale nie ma. Program nie dzia³a:



Ten sam program w C i skompilowany pod AVR-GCC dzia³a poprawnie



My¶la³em , ¿e taka prosta sprawa pójdzie mie od razu, a tu kicha. Pomó¿cie ¶lepemu !! Pozdr.


U¿ytkownik "Adam" snipped-for-privacy@o2.pl napisa³ w wiadomo¶ci news:cf5rqc$r13$ snipped-for-privacy@nemesis.news.tpi.pl...

OK, tylko na jaki konkretny AVR piszesz? Wrzuci³em to do symulatora, ustawi³em ATmega16 i dzia³a.

Czemu nie u¿ywasz bibliotek z definicjami symbolicznych nazw rejestrów? Czemu bajty ³adujesz jakby by³y s³owami (0x0FF zamiast 0xFF) - mo¿e z tym co¶ mu nie pasuje?

Nie u¿ywam bibliotek bo jeszcze siê tak nie znam. £adowa³em raz tak, raz tak, bo kombinowa³em. Procek to AT90S8515.

A.

Jest jeszcze co¶. W programie uzywa³em skoków call i jmp, które potem okaza³o siê, ¿e nie dzia³aj±. Gdy wpisa³em rjmp lub rcall to program zachowywa³ siê inaczej. Nie wiem czy to ju¿ tak bêdzie, ale mam STK500 z AVR Studia i sobie pomy¶la³em, ¿ê bêdzie tak ³atwo siê nauczyæ, a tu okazuje sie, ¿e debuger pokazuje co¶ innego ni¿ robi procesor w rzeczywisto¶ci. Ju¿ widze te problemy z wieloznaczno¶ciami w przypadku usuwania b³êdów. A poza tym, sk±d mam wiedzieæ czy instrukcje które uzy³em s± dobre ? Skoro raz dzia³aj± a innym raze mnie ? Czy mo¿esz odnie¶c siê do tego ?

U¿ytkownik "Adam" snipped-for-privacy@o2.pl napisa³ w wiadomo¶ci news:cf60v7$o3c$ snipped-for-privacy@atlantis.news.tpi.pl...

Z tym jest pro¶ciej. :)

Aha. Czy tak czy siak, mia³e¶ ustawi³e¶ ¼le stos, bo ³adowa³e¶ jego wska¼nik adresem z pamiêci SRAM zaraz za przestrzeni± I/O. Normalnie wska¼nik stosu umieszcza siê na koniec SRAM-u - odk³adanie danych na stos powoduje zmniejszanie wska¼nika (stos jest "do góry nogami" ;) ).

Spróbuj tak (nie u¿ywasz ¿adnych przerwañ, wiêc mo¿e byæ bez skoku z wektora reset-u): .include "8515def.inc"

ldi R16, high(RAMEND) out SPH, R16 ldi R16, low(RAMEND) out SPL, R16

ldi R16,0xFF out DDRB, R16

ldi R16,0x55 out PORTB, R16

loop: rjmp loop

Je¶li teraz nie dzia³a, to nie jest to wina programu. Nie wiem tylko czego mia³aby byæ. :-)

U¿ytkownik "Adam" snipped-for-privacy@o2.pl napisa³ w wiadomo¶ci news:cf61e4$r6v$ snipped-for-privacy@nemesis.news.tpi.pl...

Ano... w³a¶nie widzê, ¿e S8515 nie obs³uguje tych rozkazów i program szed³ Ci w maliny. W po¶cie powy¿ej zmieni³em to na rjmp - sprawd¼ to. Do adresowania d³u¿szych skoków musisz u¿ywaæ ijmp i icall z rejestrem indeksowym Z.

Hm, trzeba przegl±daæ zbiór obs³ugiwanych rozkazów. :-) Szkoda, ¿e symulator nie sygnalizuje b³êdu niepoprawnej instrukcji.

Pzdr, Raf.

Programy wysypywa³y mi siê z tego w³a¶nie powodu. Gdy zamieni³em te skoki na inne od razu jest ok.

A co do stosu masz racjê ustawi³em go na 0x60 oczywi¶cie instrukcj± "out" bo pomyli³y mi siê te adresy.

Atmel pewnie ola³ ten debuger i dlatego mimo fajnego kitu uruchomieniowego mam syf. Poprzednio pisa³em programy pod '51 intuicyjnie i bez debugera. Teraz po tej przesiadce nie mogê siê pozbieraæ. Pewnie czeka mnie jeszcze wpadka w jêzyk C dla AVR. Ale to po æwiczeniach z ass.

Dzieki za sugestie. Pomog³o.

ja bym to napisał tak:

org 0x0 rjmp start

org 0x100

start: ldi r16,0x80 out 0x3d,r16 (zamiast sts 0x3d,r16:)

ldi r16,0xff - ustawiam portr B jako wyjścia out 0x17,r16

ldi r16,0x55 - wystawiam przeplatankę out 0x18,r16

loop2: jmp loop2

ps. nie ustawiaj stosu na samym początku ramu tylko gdzieś na końcu

pzdr,

Witam Ja równie¿ czego¶ nie wie o avr. W³asnie zrobi³em swoj± piersz± p³ytkê z at90s8515 ale nie wiem czy jest potrzebny reset na pin 9. Jeszcze jedno b.proste pytanie jak pod³±czy np diody swiêc±ce do tego scalaka do jakiego¶ portu :) trzeba co¶ dodatkowo? jestem pocz±tkuj±cy . nie chcia³em robiæ nowego w±tku na grupie :) Arek

diode zapinasz na nóżke portu przez rezysta (np.220om) z tym że dioda świeci przy niskim stanie na wyjściu portu . Czyli plusa dajesz na anode a katode przez rezyst do porta :)

miedzy plus proca a reset daj rezyst 10K pzdr,

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required