www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Subroutine Return


Autor: Izaords (Gast)
Datum:

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

Autor: Jonas Diemer (Gast)
Datum:

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

Autor: Izoards (Gast)
Datum:

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

Autor: Izoards (Gast)
Datum:

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

Autor: Steffen (Gast)
Datum:

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

Autor: Izoards (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah ja suuper, vielen Dank...
Ich pushe nun das Register am Anfang einfach mehrmals!!! ist 
wahrscheinlich nicht die beste Lösung, oder schon????

Autor: Jonas Diemer (Gast)
Datum:

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

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.