Hallo Leute! Ich versuche grad mein erstes AVR assembler program zu "schreiben", besser gesagt ein kopiertes bisschen umzuschreiben und bekomme natürlich ein paar Fehler vom Compiler: Das abgeguckte Program war für einen Mega8 und ich will es für einen Tiny26. Die ersten Zeilen sind: ldi temp1, LOW(RAMEND) ; LOW-Byte der obersten RAM-Adresse out SPL, temp1 ldi temp1, HIGH(RAMEND) ; HIGH-Byte der obersten RAM-Adresse out SPH, temp1 Nach etwas Datenblätter schnüffeln habe ich entdeckt dass SPL un SPH die register vom Stack Pointer sind, und auch, dass beim tiny26 nur ein SP Register gibt. Also nehme ich mal an dass ich das so machen muss: ldi temp1, RAMEND out SP, temp1 Oder? (Ob ich direkt "out SP, RAMEND" machen könnte ist mir nicht ganz klar, würde mich nicht wundern wenn nicht. Müsste ich nochmal "addressing modes" nachschauen) Was ich nicht gefunden habe ist diese Schreibweise "LOW(RAMEND)". Es ist zwar klar was es bedeutet, aber das LOW() ist ja keine Assembleroperation, oder? Wo findet man solche 'Tricks'?
Das ist eine "Function". Das steht alles im "AVR Assembler User Guide".
zu finden hier: http://www.atmel.com/dyn/products/other_docs.asp?family_id=607 http://www.atmel.com/dyn/resources/prod_documents/DOC1022.PDF
Kike wrote: > Ich versuche grad mein erstes AVR assembler program zu "schreiben", > besser gesagt ein kopiertes bisschen umzuschreiben und bekomme natürlich > ein paar Fehler vom Compiler: Wohl eher vom Assembler... > ... > Nach etwas Datenblätter schnüffeln habe ich entdeckt dass SPL un SPH die > register vom Stack Pointer sind, und auch, dass beim tiny26 nur ein SP > Register gibt. Also nehme ich mal an dass ich das so machen muss: > > ldi temp1, RAMEND > out SP, temp1 Richtig. > (Ob ich direkt "out SP, RAMEND" machen könnte ist mir nicht ganz klar, > würde mich nicht wundern wenn nicht. Müsste ich nochmal "addressing > modes" nachschauen) Nein, einen konstanten Wert (also in diesem Fall das Makro "RAMEND") kann man nicht direkt einem I/O-Register zuweisen. Um das ldi... kommst Du nicht rum. > Was ich nicht gefunden habe ist diese Schreibweise "LOW(RAMEND)". Es ist > zwar klar was es bedeutet, aber das LOW() ist ja keine > Assembleroperation, oder? Wo findet man solche 'Tricks'? low() ist eine Funktion (des Präprozessors), die das Low-Byte eines konstanten Wertes zurückgibt. Da RAMEND beim Tiny26 nur ein Byte groß ist, wird es da nicht benötigt.
Bei neueren AVRs lohnt ein Blick ins Datenblatt, ob der Stackpointer nicht vielleicht beim Start schon automatisch auf RAMEND gesetzt wird.
Du brauchst die passenden Include Files. http://www.mikrocontroller.net/articles/AVR-Tutorial:_Stack MFG Falk
Eine kleine Nebenfrage : Der Mega169P hat kein von Mega169 verschiedenes Includefile ? Es ist keins da.
Hallo, @Jens: wo gibt's denn sowas??? Ist ja wie Windows! Selber machen, ohne den User zu fragen... ;) Ich würde vermutlich auch weiterhin selber machen, spätestens, wenn ich den Kram auf einen anderen AVR pappe, falle ich auf die Schnauze, weil keiner mault und der Stack im weißen Sand liegt. Na gut, wenn mir genau dieser der Platz im Flash fehlt... Gruß aus Berlin Michael
@Michael: ich liebe eben die maximale Effizienz :) in der Regel ist doch "ein anderer AVR" neueren Datums als der,für den man das Programm entwickelt hat und der unterstützt dieses an und für sich doch sehr sinnvolle Feature ebenso. Jens
Hi @Jens: Würde mich mal interessieren, welche AVRs den Stack selber initialisieren(ausser AT90..1200 und Konsorten ohne Ram)? MfG Spess
Hi Spess, hab momentan keine Daten zur Hand, rein aus dem Gedächtnis mal die neueren Megas 48/88/168, 128x,256x sowie Tiny2313. Damit hab ich meist zu tun.
jens wrote: > Hi Spess, hab momentan keine Daten zur Hand, rein aus dem Gedächtnis mal > die neueren Megas 48/88/168, 128x,256x sowie Tiny2313. Damit hab ich > meist zu tun. Wo konkret steht das geschrieben? Und weshalb zeigen die Datenblätter der Mega48/88/168 (ab Seite 52) und Tiny2313 (auf Seite 44), dass man beim Reset den Stackpointer von Hand zu setzen hat? ...
Hallo Hannes, also beim Tiny2313 hat mich mein Gedächtnis tatsächlich im Stich gelassen. Ansonsten lohnt stets ein Blick auf den Initial Value bei der Beschreibung des Stackpointers :-) Warum zuweilen dieser in den Beispielen dennoch initialisiert wird ist vermutlich fehlendem Fleiß der Atmel-Leute beim Individualisieren der oft ziemlich allgemein gehaltenen Datenblätter zuzuschreiben ?!
Jens wrote: > Hallo Hannes, > > also beim Tiny2313 hat mich mein Gedächtnis tatsächlich im Stich > gelassen. Ansonsten lohnt stets ein Blick auf den Initial Value bei der > Beschreibung des Stackpointers :-) Danke, da schaut man eben nicht mehr richtig hin ("kenne ich schon..."). Beim Mega644 gibt's sogat einen Text dazu. Bei den "nur-SMDs" habe ich nicht nachgesehen, die interessieren mich nicht wirklich. Etwas inkonsequent ist ATMEL dabei aber trotzdem: Der Tiny24/44/84 ist neuer als der Mega48/88/168 und der Tiny25/45/86, unterstützt dieses (längst überfällige) Feature aber (lt. Datasheet) noch nicht... > Warum zuweilen dieser in den > Beispielen dennoch initialisiert wird ist vermutlich fehlendem Fleiß der > Atmel-Leute beim Individualisieren der oft ziemlich allgemein gehaltenen > Datenblätter zuzuschreiben ?! Ja, da macht sich Faulheit breit. In den neueren Datasheets findet man immer mehr allgemein verfasste Textbausteine, auch dort regiert inzwischen Copy&Paste. Nagut, wieder was gelernt... ...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.