Unterprogramm hat Fehler aber wo?

#4007716
Lesenswert?

Hi zusammen.. mein Unterprogramm Tastenabfrage hat irgendwo einen 
Fehler.
Wenn er beim Befehl ret angelangt springt er nicht an die Stelle zurück 
wo er aufgerufen wurde sondern zuem Anfang des Programmes also Adresse 
0X00

Vileicht enteckt ihr den Fehler ich verzweifle:
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;;;;;;;;;;   Tastenabfrage
3
;;;;;;;;;;;  reagiert auf 0-1 Flanke
4

5
taste:
6
    push temp3
7
    push temp4
8
    push keynow
9
    push keyold
10
    in keynow, pinb   ; tastenabfrage
11
    mov temp3, keynow
12
    eor keynow, keyold
13
    mov  keyold, temp3
14
    breq taste
15
    and temp3, keynow
16
    brne taste
17

18
          ldi  temp4, $ff    ; ff ein bisschen warten zum entprellen
19
bwait1:
20
                ldi  temp3, $ff
21
bwait2:
22
                dec  temp3
23
                brne bwait2
24
                dec  temp4
25
                brne bwait1
26
                                  ; ... und nachsehen, ob die Taste immer 
27
                                  ; noch gedrückt ist
28
          in   temp4, pinb
29
                and  temp4, keynow
30
                brne taste
31
    pop keyold
32
    pop keynow
33
    pop temp4
34
    pop temp3
35
    ret
Gast #4007795
Lesenswert?

Versuche erstmal zu verstehen was der Stack ist und wie man mit Ihm 
arbeitet. Vorallem wäre es auch ratsam sich danach mit Funktionsaufrufen 
zu beschäftigen. Dein geposteter Code sieht schwer nach Anfänger 
aus...Lass Dir Zeit, arbeite z.B. das Tutorial hier im Forum durch. 
Zudem gibt es hier eiige Threads zum Thema Tastenabfrage/Entprellung.

mfg xerox
Gast #4008003
Lesenswert?

Hallo Luigi,

mir fehlt ein bisschen die Nennung des Mikrocontrollers, damit ich mal 
die ASM-Befehle nachschauen könnte.

Vielleicht gehts aber auch ohne, denn wie die Vorredner schon bemerkt 
haben ist wohl dein Stack durcheinander.

Da kommen die deshalb drauf weil die Return-Adresse in vielen 
Architekturen direkt auf dem Stack gespeichert wird.
Vereinfacht gesagt heißt dass das der Prozessor an genau die Stelle 
springt auf die momentan das Stackpointer-Register drauf zeigt.
Das heißt, exakt da sollte auch die richtige Rücksprungadresse stehen.
PUSH und POP verändern das Stackpointer-Register.

Passt hier also was nicht zusammen springt der Prozessor irgendwo hin 
und das wird gerne mit so einer Art Reset beantwortet.

Das ist jetzt recht grob und ungenau, an deiner Stelle würde ich das 
Programm im Simulator/Debugger laufen lassen, und genau sehen was 
passiert, wie schon rufus schrieb.

Thomas
#4008917
Lesenswert?

alles klar Leute Danke euch!
jetzt hab ich den Fehler auch gesehen.

> taste:
>     push temp3
>     push temp4
>     push keynow
>     push keyold
>     in keynow, pinb   ; tastenabfrage
>     mov temp3, keynow
>     eor keynow, keyold
>     mov  keyold, temp3
>     breq taste

beim Rücksprung zum Punkt taste: push ich immer wieder die Register in 
den Stack bis der überläuft und natürlich wird auch die 
Rücksprungadresse überschrieben.

muss noch viel lernen :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren