Forum: Mikrocontroller und Digitale Elektronik AVR mega 168, AVR GCC, Stackpointer initialisieren


von dude (Gast)


Lesenswert?

Hallo, ich wollte mal ebend fragen, ob mir jemand sagen kann, wie ich 
beim AVR GCC in assembler den Stackpointer initialisieren kann.
Unter AVR Studio habe ich es mit LOW(RAMEND) und HIGH(RAMEND) gemacht.
Das funktioniert hier leider nicht.


Rausgefunden habe ich bereits, dass man statt .def ; #def  schreibt.
Gleiches gilt für equ.


Kann mir vielleicht jemand helfen?
Eingefüht habe ich bisher:
#include <avr/io.h>

Sonst nichts.


Vielen Dank!

von holger (Gast)


Lesenswert?

>Hallo, ich wollte mal ebend fragen, ob mir jemand sagen kann, wie ich
>beim AVR GCC in assembler den Stackpointer initialisieren kann.

Das macht der schon für dich. Das musst du nicht in Assembler tun.

von dude (Gast)


Lesenswert?

Hallo,

ja, ich wollte allerdings mein Programm komplett in assembler schreiben!

von Florian P. (db1pf)


Lesenswert?

...dann würde ich den GCC weg lassen und im AVR-Studio bei 'Neues 
Projekt' auf Assembler klicken...

von dude (Gast)


Lesenswert?

Und weiß keiner wie man das unter AVR GCC macht?

        ldi     temp,  _SP_L_

        out     SPL, temp

        ldi     temp, _SP_H_

        out     SPH, temp





So funktionierts nicht :(

von dude (Gast)


Lesenswert?

Ja, wie gut das ich linux benutze ;)



Ich habe halt nur ein makefile und den AVR GCC auf dem pc. Ausserdem 
Ubuntu.
SONST NIX!


Der Code läuft unter AVR Studio einwandfrei!

Ich brauch halt einfach mal die info wie man den stackpointer in ASM 
Initialisiert bzw. wie die Oberste adresse des Stackpointers heisst...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

avr-gcc mach folgendes:
1
     a4e:  cf ef         ldi  r28, 0xFF  ; 255
2
     a50:  d4 e0         ldi  r29, 0x04  ; 4
3
     a52:  de bf         out  0x3e, r29  ; 62
4
     a54:  cd bf         out  0x3d, r28  ; 61

RAMEND ist für den ATmega168 0x4ff, SP liegt an 0x3d.

Die Adressen in den Makros der avr/io.h sind die RAM-Adressen der SFRs. 
Für den Zugriff per IN/OUT/SBI/CBI/SBIS/SBIC muss also ein Offset von 
0x20 brachtet werden.

von holger (Gast)


Lesenswert?

>Ich brauch halt einfach mal die info wie man den stackpointer in ASM
>Initialisiert bzw. wie die Oberste adresse des Stackpointers heisst...

Aus iom168.h

#define RAMEND      0x4FF

Also genauso wie beim Studio. Man sollte im makefile
vieleicht mal den verwendeten Prozessor mit eintragen ?

von dude (Gast)


Lesenswert?

Ok,

und was muss ich jetzt genau eintippen, damit ich den mist initialisiert 
bekomme?


Also für SPL und SPH.

Oder macht man das unter dem AVR GCC auch anders?

von Stefan E. (sternst)


Lesenswert?

dude wrote:

> Ich brauch halt einfach mal die info wie man den stackpointer in ASM
> Initialisiert bzw. wie die Oberste adresse des Stackpointers heisst...

Nein, brauchst du eigentlich nicht. Auch wenn dein Projekt nur aus 
Assembler-Sourcen besteht, wird der C-Startup-Code trotzdem dazu 
gelinkt, in dem der Stackpointer initialisiert wird. Du kannst natürlich 
mit einem eigenen Linker-Script arbeiten, aber das einfachste wäre es, 
du nennst deinen Asm-Einsprung "main" und nutzt einfach den 
C-Startup-Code.

von gast (Gast)


Lesenswert?

Den SP am oberen RAM-Ende initialisieren macht (u.a.) der 168er beim 
Reset alleine. Das braucht man nicht programmieren. Mal ganz nebenbei.

von Simon K. (simon) Benutzerseite


Lesenswert?

Und du darfst das Assembler-Gerümpel nicht in .c Dateien schreiben. 
Schon klar, oder?

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.