Forum: Mikrocontroller und Digitale Elektronik Unterprogramm hat Fehler aber wo?


von Luigi A. (spok)


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

: Bearbeitet durch User
von Leo C. (rapid)


Lesenswert?

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

So wird das nichts.

von spontan (Gast)


Lesenswert?

> brne taste

... und dann aufs neue Daten auf den Stack legen? Das geht mit 
Sicherheit schief.

von xerox (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Lass Dein Programm in einem Debugger oder Simulator laufen und sieh 
Dir nach jedem Programmschritt u.a. den Stackpointer an.

von Thomas (Gast)


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

von Luigi A. (spok)


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 :-)

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.