Hi
Ich habe ein Problem, mein Programm soll nach dem letzten aufruf eines
Unterprogramms in einer Endlosschlaufe enden. Doch es springt an den
Anfang des Programms und die Endlosschlaufe umfasst das ganze
Programm!!!!
Mein Programm sieht etwa so aus wie unten eingefügt:
das letzte Unterprogramm (LCD_HEX) habe ich mit dem Befehl RET
abgeschlossen doch er springt ans rjmp main ganz am Anfang!!!!
weiss jemand was ich da falsch gemacht habe????
Vielen Dank
Izoards
.include "8515def.inc"
rjmp main
.include "definition.inc" ;
.include "port_init.inc" ;
.include "lcd_ini.inc" ;verschiedene Include-
Dateien
.include "delay.inc" ;einbinden.
.include "control_daten_send.inc" ;
.include "code wandler.inc"
main: ldi mpr, low (RAMEND) ;Stackpointer
out spl, mpr ;ans Ende des Internaly
ldi mpr, high (RAMEND) ;SRAM Speichers
out sph, mpr ;setzen
rcall port_init ;Port initialisierung aufrufen
rcall lcd_ini ;LCD intialisierung aufrufen
ldi daten, 0xFC
rcall LCD_HEX
loop: rjmp loop
haste das mal im simulator durchgespielt? vielleicht ein fehler im stack? voll? vom programm modifiziert (liegt ja im ram)? oder die rücksprungadresse mit push überschrieben oder mit pop rausgeholt??? Jonas
Oh ja, ich habe mit Push und Pop gearbeitet, und wenn ich diese weglasse funktioniert es auch!!! Vielen Dank!!! Doch wieso kann ich ein Register nicht mit Push speichern, ohne dass es die rücksprungadresse überschreibt??? das müsste doch funktionieren¨!!!???? izoard
Wow ja, es liegt am Pushen und Popen!!! ohne diese Befehle funktioniert
es nämlich!!!
Aber ich müsste doch ein Register mit dem Befehl sichern können??? Was
habe ich da falsch gemacht??? Vielleicht sieht das jemand??? Ich poste
hier noch mein Unterprogramm lcd_hex!!!!
LCD_HEX: push daten
ldi zaehler, 0x02
swap daten
HEX_loop: andi daten, 0x0F
mov mpr, daten
subi mpr, 0x0A
brsh highsm
ori daten, 0x30
rjmp go
highsm: subi daten, 0x09
ori daten, 0x40
go: rcall zeichen
dec zaehler
pop daten
cpi zaehler, 0x00
brne HEX_loop
;loop2: rjmp loop2
ret
Ich hab's jetzt nur mal überflogen, aber du PUSHst EINMAL ganz am Anfang (LCD_HEX). Du POPst aber unter umständen mehrfach, da der POP-Befehl in einer Schleife steht. Das geht so nicht. Das was auf den Stack geht, muss auch wieder runter. Und zwar genau so oft, wie es rauf ging.
Ah ja suuper, vielen Dank... Ich pushe nun das Register am Anfang einfach mehrmals!!! ist wahrscheinlich nicht die beste Lösung, oder schon????
nee, nicht wirklich. wenn du kein register mehr frei hast, also sachen für mehrfachen zugriff auf dem stack ablegen musst, dann solltest du es nach dem poppen gleich wieder pushen. den stack musst du dir als stapel vorstellen. du hast immer nur zugriff auf das oberste element. auf dem stack werden auch rücksprungadressen gespeichert. wieso popst du die daten eigentlich da unten vor dem sprung? wäre nach dem sprung nicht gescheiter?
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.