Forum: Mikrocontroller und Digitale Elektronik Schleifenproblem in Assembler


von Stephan L. (Gast)


Lesenswert?

Hallo, ich habe folgendes Problem:

Gegeben sind 5 Taster mit LED, horizontal nebeneinander angeordnet.

Mit den linken beiden kann man 2 Geschwindigkeitsstufen für Rückwärts,
mit den rechten für Vorwärts wählen und mit dem Mittleren stoppen.
Dabei leuchtet immer die LED im Schalter auf und signalisiert, was
gerade läuft.

Hier mein Code in Assembler, der aber nicht funktionieren will (Ist ein
AT89S8252):


; P1.0=Taster 1  P1.1=LED1
; P1.2=Taster 2  P1.3=LED2
; P1.4=Taster 3  P1.5=LED3
; P1.6=Taster 4  P1.7=LED4
; P3.0=Taster 5  P3.1=LED5
; P3.2=Phase 1   P3.3=Phase 2
; P3.4=Inhibit

#include 8051.H
         .org 0000H

start:         setb P1.1 ;LED1 aus
               setb P1.3 ;LED2 aus
               clr  P1.5 ;LED3 (Mitte) an
               setb P1.7 ;LED4 aus
               setb P3.1 ;LED5 aus
main:          jb   P1.0,fbon ;Prüfen ob Taster gedrückt. (FastBack)
               jb   P1.2,sbon ;SlowBack
               jb   P1.6,sfon ;SlowForward
               jb   P3.0,ffon ;FastForward
               sjmp main
fbon:          setb P1.5 ;LED3 aus, LED 1 an.
               clr  P1.1
fbchk:         jb   P1.4,fboff ;Wenn Mitte (Stop) gedrückt,
               sjmp fbchk
fboff:         setb P1.1 ;LED1 aus und LED 3 (Mitte an)
               clr  P1.5
               sjmp main
               .end

Wer kann helfen??

Gruß,
Stephan L.

von Dirk (Gast)


Lesenswert?

Hi,

kenne dein AVR nicht , aber wie ist es mit Tastenentprellung?

Mfg
Dirk

von Rahul (Gast)


Lesenswert?

Moin!
Irgendwie hast du überhaupt nicht geschrieben, was nun nicht
funktioniert.
Ich gehe davon aus, dass du die LED-Leucht-Nichtfunktion meinst.
Bis zum Label "main" sollte es ja eigentlich funktionieren.
Dann kommt eine Abfrage für verschiedene Tasten ausser der Stopp-Taste
(Warum die denn nicht abfragen?)
Sobald eine Taste gedrückt wird, solltest Du an deinen Port eine
Byte-Maske schicken, wo nur noch die eine LED gesetzt ist.
Dann fehlen dir in den "Unterprogrammen" neben Sachen wie Entprellung
(siehe "Peter Danneggers Bulletproofed Tastenentprellung") auch
Rücksprünge in die Main-Funktion.

Gruß Rahul

von Markus_8051 (Gast)


Lesenswert?

Hallo Stephan,

die Kommentare von Rahul sind soweit richtig.

Mit der Tastenentprellung ist das so ´ne Sache, kann man natürlich
machen, ist in dieser Applikation aber nicht erforderlich: Wenn einmal
schnell vorwärts gewählt ist, macht es ja nichts, wenn das nochmal
gewählt wird.

Aber es gibt noch einen groben Fehler: Um die Ports beim 89S8252 als
Eingänge zu nutzen, müssen sie auf high programmiert sein (das ist nach
dem Reset automatisch so) und müssen dann extern auf Masse gezogen
werden. Sprich, die Taster sollten gegen GND liegen. Ich hoffe, das
hast Du auch so gemacht. Natürlich müssen im Programm die Logikpegel
dann auch low-aktiv abgefragt werden. Also jnb statt jb-Befehle, Du
mußt in die UPros verzweigen, wenn das entsprechende Bit NICHT gesetzt
ist. Dann sollte es klappen.

Mit den Anmerkungen von Rahul sollte es etwa so aussehen:

#include 8051.H
         .org 0000H

start:         call LEDs_aus
               clr  P1.5 ;LED3 (Mitte) an
main:          jnb  P1.0,fbon ;Prüfen ob Taster gedrückt. (FastBack)
               jnb  P1.2,sbon ;SlowBack
               jnb  P1.4,fboff;aus (Mitte)
               jnb  P1.6,sfon ;SlowForward
               jnb  P3.0,ffon ;FastForward
               sjmp main
fbon:          call LEDs_aus
               clr  P1.1
               sjmp main
fboff:         call LEDs_aus
               clr  P1.5
               sjmp main
sbon:.....
sfon:.....
ffon:.....
LEDs_aus:      setb P1.1 ;LED1 aus
               setb P1.3 ;LED2 aus
               setb P1.5 ;LED3 aus
               setb P1.7 ;LED4 aus
               setb P3.1 ;LED5 aus
               ret
               .end

von Stephan L. (Gast)


Lesenswert?

Hallo Markus,

Vielen Dank für dein Listing.

ICh habe es mal eben auf den µC übertragen, aber da tut sich absolut
nichts. Die Taster gehen gegen Masse. Ich in am Verwzeifeln...

Das jb hab ich aus dem Buch Basiskurs Mikrocontroller. B. Kainka mlegt
auch die Taster auf Masse und es läuft mit jb.....

Gruß,
Stephan L.

von Thomas Oly (Gast)


Lesenswert?

Hallo,

heißt der Befehl nicht sbis? So hatte ich mal ein kleines Programm
gemacht wenn schalter gedrückt wird übersprang es den nächsten befehl
oder nicht.

von Markus_8051 (Gast)


Lesenswert?

@Thomas: In welchem Film bist Du denn? Also ich kann Dir versichern, daß
es beim 8051 keinen snis-Befehl gibt!

@Stephan: Also im Programm fallen mir keine groben Fehler mehr auf,
abgesehen von der sehr knappen Initialisierung des µCs. Sollte aber
eigentlich laufen. Zur Sicherheit, probier mal am Anfang folgendes:

#include 8051.H
         .org 0000H
               jmp  start
                                ; hier in diesem Bereich liegen die
ganzen IRQ-Vektoren

         .org 0073H             ; ab hier ist wieder frei
start:         mov  sp,#30h     ; Stackpointer auf RAM-Startadresse
               call LEDs_aus    ; der call-Aufruf benötigt schließlich
STACK!!!
               clr  P1.5 ;LED3 (Mitte) an
....

Wenn es jetzt noch nicht klappt, poste mal den Schaltplan von deiner
Schaltung.

Gruß,
Markus_8051

von Stephan L. (Gast)


Lesenswert?

Hallo,

die Schaltung funzt leider immer noch nicht.

Ich kann leider im Moment keinen Plan zeichnen (zu wenig Zeit), aber ds
Ganze kurz erklären:

P1.0: Taster 1 NO auf Masse
P1.2: Taster 2 NO auf Masse
P1.4: Taster 3 NO auf Masse
P1.6: Taster 4 NO auf Masse
P3.0: Taster 5 NO auf Masse

P1.1: LED 1 mit Vorwiderstand 500 Ohm auf Vcc
P1.3: LED 2 mit Vorwiderstand 500 Ohm auf Vcc
P1.5: LED 3 mit Vorwiderstand 500 Ohm auf Vcc
P1.7: LED 4 mit Vorwiderstand 500 Ohm auf Vcc
P3.1: LED 5 mit Vorwiderstand 500 Ohm auf Vcc

Die Ports funktionieren sicher, ich habe folgendes Listing kurz
übertragen und ausprobiert:

;flash3.asm, input/output

#include 8051.H
         .org 0000H

main    jb    P1.0,ON  ;P1.0 = ?
        setb  P1.1     ;P1.1 = 1
        sjmp  OFF
ON      clr   P1.1     ;P1.1 = 0
OFF     sjmp  main
        .end

Funktioniert. Die LED geht aus, wenn man den Taster drückt.

Vg,

Stephan L.

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.