Forum: Mikrocontroller und Digitale Elektronik AVR-Tutorial


von Martin (Gast)


Lesenswert?

Ich wollte mit Hilfe des AVR-Tutorial den Einstieg in die AVR ASM 
programierung finden.
Nun bin ich auf ein Problem gestossen welches ich mir nicht erklären 
kann.
Ich habe mir von Atmel das AVR Studio 3.52 gesaugt. Damit habe ich wie 
in dem Tutorial beschriebn den code assembliert und durchgestept. Bei 
der 4433 cpu hat dies auch soweit geklappt und man sieht in der 
Simulation sehr schön wie der stack sich ändert.
Nun habe ich das gleiche für die 8515 gemacht und soweit kann man da 
auch durchsteppen. Nur zeigt das AVR Studio den Rambereich nicht an wo 
der Stack liegt demzufolge sieht man da auch nix. Ist das ein 
Softwarebug des Studios oder eine falsche Einstellung ? Ich habe aber 
nix gefunden um den Rambereich unter 60h anzuzeigen wo laut CPU Fenster 
der Stackpointer der CPU hinzeigt.
Mein zeites Problemchen war das ich mir den STK200+ geholt habe der aber 
anscheinen nicht oder nicht mehr von dem AVR-Studio unterstützt wird ist 
das so richtig oder gab es mal versionen die damit auch liefen ?

Vielen Dank schon im Vorraus für die Antwort.

Gruss Martin

von Andreas H (Gast)


Lesenswert?

Hallo!

Poste doch mal den Code den Du für das initialisieren des Pointers 
nimmst. Der 8515 hat 512 Byte Ram, daß heißt, Du hast 2 Bytes für den 
Stackpointer: High und Low. (Im Highbyte findet allerdings nur das LSB 
verwendung) um ihn zu initialisieren mußst Du folgende Zeilen nehmen:

    ldi temp,HIGH(Ramend)  ; Stack Pointer Setup
    out SPH,temp      ; Stack Pointer High Byte
    ldi temp,LOW(Ramend)  ; Stack Pointer Setup
    out SPL,temp      ; Stack Pointer Low Byte

der Befehl "HIGH" nimmt von der folgenden 16-Bit-Konstante (Ramend) nur 
das hochwertige Byte und "LOW" demnach nur das niederwertige. Ramend ist 
eine Konstante welche der Interpreter automatisch auf den Wert der 
letzten RamAdresse setzt.

Diese Zeilen brauchst Du immer, wenn Du einen uC mit mehr als 256 Byte 
Ram nimmst.

ciao,
   Andi

von Andreas H (Gast)


Lesenswert?

Hallo nochmal!

Sorry, das mit LSB oben stimmt nicht, da die Adresse ja nicht bei 0 
anfängt sondern bei $60. Also finden im 8515 für die SRam-Adresse im 
HighByte die BEIDEN niederwertigsten Bits Verwendung. Die Höchstmögliche 
SRAM-Adresse beim 8515 ist $25F, auf diese muß der Stackpointer 
eingestellt werden. Und genau das wird mit den obigen 4 Zeilen Code 
erreicht

Jetzt stimmts. :)

ciao,
   Andi

von Markus (Gast)


Lesenswert?

Zun Deiner zweiten Frage: das AVR Studio hat das STK200 noch nie direkt 
unterstützt. Dazu gibt es ein zusätzliches Programm das beim STK200 
dabei ist. Das ist aber eigentlich kein Beinbruch, Du must lediglich 
damit leben das man zwei Programme, Studio und ISP Software, 
gleichzeitig starten muß. Irgendwelche Debugfunktionen oder sonstige 
Sachen die man mit dem STK500 machen könnte gibt es bei 200 eh nicht.

Gruß
Markus

von Martin (Gast)


Lesenswert?

Danke Andreas und Markus,
das mit dem AVR Studio ist dann soweit klar. Ich bin nur auf die Idee 
gekommen das das Studio den STK200 unterstütz hätte weil die Software 
welche dabei ist von KANDA dies macht. Nur haut mich der Kanda Asembler 
nicht um weil ich mit dem ASM befehl ramend gleich mal auf die NAse 
gefallen bin und sich damit nix assembleiren leiss weil der den befehl 
nicht kennt die def dateinen von Atmel auch leider inkompatibel sind u 
nd mir das AVR Studio soweit nun auch besser gefällt.
Nun zu dem Stack Problem .
Bei dem 4433 wurden im stack auch gleich immer zwei bytes gesprungen 
also dachte ich das ich einfach die def datei im asm code austausche mit 
der von dem 8515 und damit dann neu überstzte. Das hat auch ohne 
fehlermeldung geklappt und das steppen geht ja auch nur angezeigt wird 
nix. Komischer weise zeigt das ramfenster immer ab 60h an und der 
stackpointer im cpu fenster steht ja unterhalb.
Den code den ich genommen habe ist der unveränderte aus dem tutorial.
.include "8515def.inc"     ;bzw. 2333def.inc

.def temp = r16

         ldi temp, RAMEND  ;Stackpointer initialisieren
         out SPL, temp

         rcall sub1        ;sub1 aufrufen

loop:    rjmp loop


sub1:
                           ;hier könnten ein paar Befehle stehen
         rcall sub2        ;sub2 aufrufen
                           ;hier könnten auch ein paar Befehle stehen
         ret               ;wieder zurück

sub2:
                           ;hier stehen normalerweise die Befehle,
                           ;die in sub2 ausgeführt werden sollen
ret                        ;wieder zurück

der unterscheid wegen 1 byte und 2 byte ist mir im prinzip schon klar 
aber warum macht die 4433 cpu dann im stack auch eine 2 byte 
reservierung wenn die nur ein byte benötigt. deshalb kam ich ja auf den 
trichter einfach nur die def datei auszutauschen.

Danke Martin

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.