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.
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
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
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.
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.
@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
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.