Hallo, bin blutiger Anfänger in Assembler und versuche einen ATMega 162 zu programmieren. Jetzt wird in meinem Programm der rcall Befehl nicht ausgeführt, ich finde den Fehler nicht. Wenn ich erst den Stack einrichte und dann rjmp reset, wird der rcall warte nicht ausgeführt, wird erst der rjmp reset ausgeführt, wird der Stack nicht eingerichtet und es gibt einen "AVR Simulator: Uninitialized stack pointer used at 0x001b" Fehler. Ich blick da nicht durch. Danke schon mal im voraus. .include "m162def.inc" .def a = r16 ; definition r16 = a .def b = r17 ; definition r17 = b .def c = r18 ; definition r18 = c .def d = r19 ; definition r19 = d .def temp = r20 ; definition r20 = temp .def wart = r21 ; definition r21 = warte .cseg ; code in flash-speicher .org 0x000 ; setzt den folgenden code ab adresse 0x000 ;rjmp reset ; sprung nach reset ldi temp,HIGH(RAMEND) ; stack einrichten für sprungbefehle out SPh,temp ldi temp,low(RAMEND) out SPl,temp rjmp reset ; sprung nach reset warte: ; warteschleife nop ; 250 takte ==> jeder befehl 1 takt dec wart ; 250 takte ==> jeder befehl 1 takt brne warte ; 499 takte ==> bei sprung 2 takte, sonst 1er ret reset: ; reset-sprungmarke = Programmstart ldi temp,0xff ; schreibt 255 in temp (r20) ldi a,0b11111111 ; Bitmuster für a (alle lampen an) ldi b,0b01010101 ; Bitmuster für b (1 = an) ldi c,0b00000000 ; Bitmuster für c (alle aus) ldi d,0b10101010 ; Bitmuster für d (1 = an) out ddra,temp ; schreibt temp (255) in DatenRichtungRegister a, (alles Ausgänge) out ddrb,temp ; b auch Ausgänge out ddrc,temp ; c auch Ausgänge out ddrd,temp ; d auch Ausgänge loop: ; sprungmarke out porta,a ; schreibt alles nach Port a out portb,b ; ebenso out portc,c ; ebenso out portd,d ; ebenso dec a ; decrement a dec b ; decrement b dec c ; decrement c dec d ; decrement d ldi wart,0x05 ; warteschleife 5 x rcall warte ; unterprogramm warteschleife rjmp loop ; relativer sprung nach loop rjmp reset
Hallo Peter, einen richtigen Fehler kann ich nicht ausmachen, jedoch solltest Du das Programm geringfügig umstellen: RESET: ldi temp,HIGH(RAMEND) ; stack einrichten für sprungbefehle out SPh,temp ldi temp,low(RAMEND) out SPl,temp ... ... ... LOOP: ... ... ldi r21,4 rcall WARTE rjmp LOOP WARTE: nop ; 250 takte ==> jeder befehl 1 takt dec r21 ; 250 takte ==> jeder befehl 1 takt brne WARTE ; 499 takte ==> bei sprung 2 takte, sonst 1er ret Versuche mal, die Variable "wart" durch das Register "r21" zu ersetzen. Evtl. kommt der Assembler durcheinander....
Erst mal danke für die Antwort, hat aber nichts geändert. Ich habe das Unterprogramm auch mal in test umbenannt, das Register mit r21 angesprochen, aber der rcall wird nicht ausgeführt. Ist das ev. ein Fehler in AVRStudio 4.13 ?? Wenn ich den Stack rausnehme, dann gibt es wieder die Fehlermeldung: AVR Simulator: Uninitialized stack pointer used at 0x000f AVR Simulator: Invalid opcode 0xffff at address 0x0000ff Das heißt doch, das der rcall ausgeführt wird, aber kein Stack eingerichtet ist, oder sehe ich das falsch ?
fehlt da vor dem brne nicht ein cp / cpi? z.b.: dec r21 cpi r21, 0x(irgendwas) brne warte
Habs grad mal bei mir durchlaufen lassen (auch AVRStudio 4.13). Läuft problemlos, auch der rcall wird ausgeführt.
aber woran kann es dann liegen, das es bei mir nicht läuft ??
Danke noch mal an alle, hab den Fehler grade gefunden Es gibt da einen unterschied zwischen f10 und f11. sorry
Peter Volkmer wrote:
> Es gibt da einen unterschied zwischen f10 und f11.
Right. Das sind zwei verschiedene Tasten...;-)
Johannes M. wrote: > Peter Volkmer wrote: >> Es gibt da einen unterschied zwischen f10 und f11. > Right. Das sind zwei verschiedene Tasten...;-) Und die haben auch unterschiedliche Funktion. Und zusätzlich gibt es noch ein paar Funktionen mehr, erreichbar mit diversen Umschalttasten. Interessant mit der F9-Taste wird dann auch die F5-Taste. Einfach mal im Menü rumblättern und die Tastenkombinationen lesen. ...
die Wartefunktion hat 25 Takte. Soll das so sein? Da kann man natürlich nichts mehr sehen. Versuch mal das Programm AVRDelayloop zu finden. Da wird der Code für bestimmte Wartezeiten angegeben. mfg
Wer solche Programme nutzt, der lernt nix dabei. Der vernünftige Umgang mit dem Simulator (oder Debugger, wenn die entsprechende Hardware angeschlossen ist) des AVR-Studios bringt da bedeutend mehr. Volkers Fehler war die Bedienung des Simulators. Er hat statt wirklichem Einzelschritt (F11) den Einzelschritt gewählt, der Unterprogramme zwar ausführt, aber in der Anzeige überspringt (F10). Der Simulator/Debugger hat recht viele Möglichkeiten, also auch viel Potential zur Fehlbedienung. ...
ja so ist es, wenn nicht alles gesagt wird. Oben steht nichts von Simulation. Aber dann wird er ja jetzt gemerkt haben, daß das nur 25 Takte sind. Bei dem angegebenen Programm kann man genauso gut lernen. Sind doch nur Programmbeispiele, wie man sie hier zuhauf findet und auch im Tutorial. Wenn man natürlich nur die Befehle abschreibt, ohne lernen zu wollen, dann kann er das genauso gut auch im Tutorial finden. Nur mit diesem Programm hat er gleich die richtigen Werte und wenn er die Anweisungen in der Liste der Anweisungen nachsieht, dann weiß er auch, was die machen. mfg
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.