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'?
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.
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 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...
...