Forum: Mikrocontroller und Digitale Elektronik Strack Pointer initialisieren


von Kike (Gast)


Lesenswert?

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

von Andrew (Gast)


Lesenswert?

Das ist eine "Function". Das steht alles im "AVR Assembler User Guide".

von Andrew (Gast)


Lesenswert?


von Johannes M. (johnny-m)


Lesenswert?

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.

von Jens (Gast)


Lesenswert?

Bei neueren AVRs lohnt ein Blick ins Datenblatt, ob der Stackpointer 
nicht vielleicht beim Start schon automatisch auf RAMEND gesetzt wird.

von Falk (Gast)


Lesenswert?

Du brauchst die passenden Include Files.

http://www.mikrocontroller.net/articles/AVR-Tutorial:_Stack

MFG
Falk

von nop(); (Gast)


Lesenswert?

Eine kleine Nebenfrage : Der Mega169P hat kein von Mega169 verschiedenes 
Includefile ? Es ist keins da.

von Michael U. (Gast)


Lesenswert?

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

von jens (Gast)


Lesenswert?

@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

von Spess53 (Gast)


Lesenswert?

Hi

@Jens: Würde mich mal interessieren, welche AVRs den Stack selber 
initialisieren(ausser AT90..1200 und Konsorten ohne Ram)?

MfG Spess

von jens (Gast)


Lesenswert?

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.

von Hannes L. (hannes)


Lesenswert?

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?

...

von Jens (Gast)


Lesenswert?

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 ?!

von Hannes L. (hannes)


Lesenswert?

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
Noch kein Account? Hier anmelden.