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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.