mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Strack Pointer initialisieren


Autor: Kike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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'?

Autor: Andrew (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist eine "Function". Das steht alles im "AVR Assembler User Guide".

Autor: Andrew (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jens (Gast)
Datum:

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

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst die passenden Include Files.

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

MFG
Falk

Autor: nop(); (Gast)
Datum:

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

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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?

...

Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?!

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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...

...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.