Forum: Mikrocontroller und Digitale Elektronik (Assembler) Taster für einen Lauflicht programmieren? Abi-aufgabe 06


von Onur (Gast)


Lesenswert?

Hallo Leute,
naja mit Assembler hab ich noch meine Probleme, und jetzt muss ich auch 
noch in der Schule einen Lauflicht auf Assebler programmieren als 
Jahresarbeit.

Das Problem ist, dass ich eigentlich schon mind. 70% des Programms 
programmiert habe(wovon ich ausgehe), aber ich weiss nicht, wie ich da 
noch den Taster programmieren soll, und noch vielleicht ein oder zwei 
kleine Befehle, die siecherlich fehlen.

Fakt ist, dass ich nur noch soweit Programmieren konnte, und nicht mehr 
weiter machen kann. Vielleicht bild ich es mir nur ein, dass da etwas 
noch fehlt, aber den Taster müsst ich doch noch programmirern oder 
nicht? Und wenn ja, dann sagt mir doch bitte auch noch wie?

Die genaue Afgabe heißt so:
Lauflicht mit Treffer anzeige:
- von 5 Leds, leuchtet immer nur einer
- außer beim einschlten sind nie alle Leds dunkel
- ein Leuchtpunkt wandert zyklisch auf und ab
- der Wechsel erfolgt nach jeweils 100 ms (10Hz)
- Das Lauflicht satrtet mit Q0
- Über einen Taster S0 soll die mittlere LED erwischt werden (Betätiging 
innerhalb der Zeit, in der diese LED leuchtet
- für den Fall, dass man zum richtigen Zeitpunkt drückt, wird eine
 Trefferanzeige um 1 erhöht.

Jetzt kommt der wichtigste Teil:
- der Taster S0 löst einen Interrupt aus (reaktion auf negative Flanke)
- die zugehörige Interrupr Service Routine erhöhtden Trefferzähler nur 
dann um eins, wenn zu diesem Zeitpunkt die mittlere LED leuchtet
- Die Trefferanzeige erfolgt in einem 7-Segmentanzeige
- Wenn 9 Punkte erreicht sind, stoppt das Spiel und kann nur über einen 
Reset wieder neu gestartet werden
- Die Steuerleitung sin entprellt
- Die angegben Portbezeichnungen gelten für einen MC der 8051-Familie

Nicht zu vergessen: 8051 Microcontroller

So: Der Taster S0 ist an Port P3.2 angeschlossen
Wie soll ich das programmieren, und muss ich noch weite sachen 
programmieren damit das Programm fertig wird.

Jetzt schon danke für eure Hilfe

Das Programm, soweit ich gekommen bin:

1
        code at 0                    ;Programm startet bei 0
2
        include reg_51.pdf              ;bindet die Datei "reg_51.pdf" mit ein
3
4
        org 0F00h
5
;*********************Initialisierung**********************
6
Start:
7
        MOV P0,#00000000b                ;nach Reset sind kurz alle LEDs dunkel
8
        MOV R2,#0                           ;Trefferregister zurücksetzen
9
        MOV DPTR,#Seg7Code                  ;Datenpointer mit Anfangsadresse der Codetabelle laden (Basiswert)
10
11
;*********************Initialisierung Interrupt************
12
13
        SETB IT0                            ;Externer Interrupt 0 bei abfallender Flanke
14
        CLR IE0                             ;eventuelle Anforderung löschen
15
        SETB EX0                            ;externer Interrupt 0 (P3.2) freigeben
16
        SETB EA                             ;globale Interruptfreigabe
17
18
;*********************HAUPTPROGRAMM************************
19
20
Lauflicht:                                      ;Sprungmarke für Lauflicht
21
        MOV P0,#00000001b                   ;Ausgabe Bitmuster 1 an Port 0
22
        ACALL Pause                         ;Aufruf des Unterprogramms Pause
23
        MOV P0,#00000010b                ;Ausgabe Bitmuster 2 an Port 0
24
        ACALL Pause                    ;Aufruf des Unterprogramms Pause
25
        MOV P0,#00000100b                ;Ausgabe Bitmuster 3 an Port 0
26
        ACALL Pause                    ;Aufruf des Unterprogramms Pause
27
        MOV P0,#00001000b                ;Ausgabe Bitmuster 4 an Port 0
28
        ACALL Pause                    ;Aufruf des Unterprogramms Pause
29
        MOV P0,#00010000b                ;Ausgabe Bitmuster 5 an Port 0  
30
        ACALL Pause                    ;Aufruf des Unterprogramms Pause
31
        MOV P0,#00001000b                ;Ausgabe Bitmuster 6 an Port 0
32
        ACALL Pause                    ;Aufruf des Unterprogramms Pause
33
        MOV P0,#00000100b                ;Ausgabe Bitmuster 7 an Port 0
34
        ACALL Pause                    ;Aufruf des Unterprogramms Pause
35
        MOV P0,#00000010b                ;Ausgabe Bitmuster 8 an Port 0
36
        ACALL Pause                    ;Aufruf des Unterprogramms Pause
37
        SJMP Lauflicht                  ;Sprung zum Anfang des Lauflichts
38
    
39
Seg7Code:                                          ;Beginn der Tabelle für 7-Segment-Code
40
        DB 11111100b, 01100000b, 11011010b    ;7-Segment-Code für die Zahlen 0,1,2
41
        DB 11110010b, 01100110b, 10110110b     ;7-Segment-Code für die Zahlen 3,4,5
42
        DB 10111110b, 11100000b, 11111110b     ;7-Segment-Code für die Zahlen 6,7,8
43
        DB 11110110b                  ;7-Segment-Code für die Zahl 9
44
45
;******************Unterprogramm Pause********************
46
47
Pause:                              ;Sprungmarke für Unterprogramm Pause
48
                MOV R0,#200d                  ;Äußere Schleife mit Wert 200 laden
49
Pause1:         MOV R1,#250d                           ;Innere Schleife mit Wert 250 laden
50
Pause2:         DJNZ R1,Pause2                         ;Innere Schleife
51
                DJNZ R0,Pause1                         ;Äußere Schleife
52
RET                                                ;Ende Unterprogramm und Rücksprung zum HP
53
54
;********************InterruptServiceRoutine*********************************
55
56
            SJMP Start                    ;ISR überspringen (Beginne mit Hauptprogramm)
57
ORG 0003h                                          ;Einsprungadresse für externen Interrupt 0
58
            PUSH ACC                               ;Akuinhalt retten
59
            CLR EX0                                ;externen Interrupt 0 (P3.2) sperren
60
            JNB P0.2,nichts                        ;Wenn kein Treffer, dann überspringe Erhöhung
61
            INC R2                                 ;Wenn Treffer, dann erhöhe Trefferegister
62
nichts:     MOV A,R2                               ;Lade Trefferregister in Akku
63
            MOVC A,@A+DPTR                         ;Hole 7-Seg-Code für Trefferanzahl
64
            MOV P2,A                               ;Gib Trefferanzahl im 7-Seg-Code an P2 aus
65
            CJNE R2,#9,weiter                      ;Wenn 9 Punkte noch nicht erreicht, dann weiter
66
Spielende:  SJMP Spielende                         ;Wenn 9 Punkte erreicht, dann Spielende
67
weiter:     SETB EX0                               ;externer Interrupt 0 (P3.2) wieder freigeben
68
            POP ACC                                ;Gepeicherten Akkuinhalt holen
69
RETI                                               ;Ende ISR und Rücksprung zum Hauptprogramm
70
71
END                                ;Ende des Hauptprogramms

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

a) Was hat das mit PC-Programmierung zu tun?

-> Verschoben.

b) Bist Du Dir sicher, daß die Datei mit den Registerdefinitionen des 
MCS-51 auf Deinem System wirklich die Dateinamenserweiterung PDF hat?

von Oliver (Gast)


Lesenswert?

>So: Der Taster S0 ist an Port P3.2 angeschlossen
>Wie soll ich das programmieren,

Aufgabe:

>- der Taster S0 löst einen Interrupt aus (reaktion auf negative Flanke)
>- die zugehörige Interrupr Service Routine erhöhtden Trefferzähler nur
>dann um eins, wenn zu diesem Zeitpunkt die mittlere LED leuchtet

Wenn du das wörtlich nimmst, könnte man z.B vor dem Einschalten der LED 
3 ein Flag setzten (= eine Variable auf 1 setzen), und nach dem 
Ausschalten wieder löschen (= auf Null setzen). Dieses Flag fragst du in 
der ISR ab, und nur, wenn das gesetzt ist, wird hochgezählt.

Einfacher, aber nicht ganz der wörtlichen Aufgabenstellung entsprechend, 
wäre es, den ISR nicht am Anfang des Programms freizugeben, sondern erst 
direkt vor Einschalten von LED 3, und nach deren Ausschalten wieder zu 
deaktivieren. Dann zählt er auch nur, solange die richtige LED leuchtet. 
Falls der 8051 sowas wie Interrupt-Flags hat, sollte das entsprechende 
vor der Freigabe noch gelöscht werden.

Oliver

von Onur (Gast)


Lesenswert?

>b) Bist Du Dir sicher, daß die Datei mit den Registerdefinitionen des
>MCS-51 auf Deinem System wirklich die Dateinamenserweiterung PDF hat?

Ja, so haben wir es in der Schule gelernt.

von Peter D. (peda)


Lesenswert?

Was geht denn nicht?

Vor dem "SJMP Start" fehlt noch ein "org 0".
Wenn Du im Interrupt ACC sicherst, dann aber auch PSW, das wird auch 
geändert.
Dein Main benutzt weder ACC noch PSW, daher geht hier auch garnichts 
sichern.

Interruptsperre im Interrupt ist überflüssig.
Beim 8051 kann kein Interrupt durch Interrupts gleicher Priorität 
unterbrochen werden.


Peter

von Karl H. (kbuchegg)


Lesenswert?

Ordne mal die einzelnen Sektionen in der richtigen Reihenfolge an.
Das ist doch ein Unsinn, die Sektionen mittels org wild durcheinander zu 
würfeln.
Wenn du das tust, kommst du nämlich drauf, dass dein vermeintlich am 
Anfang stehendes 'sjmp Start' keineswegs am Programmanfang steht und der 
Prozessor mit allem möglichen loslegt, nur nicht mit deinem Programm.

von Onur (Gast)


Lesenswert?

Ok, aber muss ich auch noch nen Taster auf P3.2 extra Programmieren???

von Karl H. (kbuchegg)


Lesenswert?

Nachdem deine Aufgabenstellung nach einem Taster verlangt, wirst du wohl 
einen programmieren müssen.
Also: Taster an den µC anhängen und den bewussten Eingang abfragen. Wo 
ist das Problem?

von Peter D. (peda)


Lesenswert?

Onur wrote:
> Ok, aber muss ich auch noch nen Taster auf P3.2 extra Programmieren???

Du benutzt doch den Interrupt, was willst Du denn noch?
Entweder Pollen oder Interrupt, beides zusammen geht in die Hose.

Interrupt geht natürlich nur, wenn die Taste in extra Hardware entprellt 
ist.
Deshalb werden Tastenabfragen zu 99% mit Pollen und Entprellen im 
Timerinterrupt realisiert.


Peter

von STK500-Besitzer (Gast)


Lesenswert?

>Also: Taster an den µC anhängen und den bewussten Eingang abfragen. Wo
>ist das Problem?

Taster an VCC oder GND gibt noch ganz andere Probleme ;-)
Das Programm kann man ja so gestalteten, dass der Taster nur abgefragt 
wird, wenn die entsprechende LED leuchtet (einfachste und vermutlich 
auch geforderte Variante).
Dann kann man den Taster noch während des gesamten Programms abfragen 
und einen Fehler melden (Punktabzug), wenn die Taste zu früh oder zu 
spät gedrückt wurde (Deluxe-Variante).

Dazu sollte man sich aber ein vernünftiges Programmkonzept (auf Papier) 
überlegen, bevor man sinnlos in der Gegend herum programmiert.

von Karl H. (kbuchegg)


Lesenswert?

STK500-Besitzer wrote:

> Dann kann man den Taster noch während des gesamten Programms abfragen
> und einen Fehler melden (Punktabzug), wenn die Taste zu früh oder zu
> spät gedrückt wurde (Deluxe-Variante).

Sein jetziges Programm schreit doch förmlich danach, dass in 'Pause' in 
der innersten Schleife der Taster abgefragt wird. Ist er gedrückt, noch 
in P0 nachsehen, welche LED gerade leuchtet und den Zähler eventuell 
hochzählen und die 7_Segment aktualisieren.

> Dazu sollte man sich aber ein vernünftiges Programmkonzept (auf Papier)
> überlegen, bevor man sinnlos in der Gegend herum programmiert.

Das allerdings ist mehr als wahr.

von Uwe (Gast)


Lesenswert?

Hi!
>Ist er gedrückt, noch
>in P0 nachsehen, welche LED gerade leuchtet und den Zähler eventuell
>hochzählen und die 7_Segment aktualisieren.
Nicht ganz, bei ständigem drücken hat er immer einen Treffer.
Besser vor dem Einschalten von LED3 prüfen ob Taster losgelassen. Wenn
ja, ein Prüfbit setzen und dann in der Pause Led3,Taster und Prüfbit
testen. Wenn alles Ok Punkt vergeben.

Viel Erfolg, Uwe

von Karl H. (kbuchegg)


Lesenswert?

Uwe wrote:
> Hi!
>>Ist er gedrückt, noch
>>in P0 nachsehen, welche LED gerade leuchtet und den Zähler eventuell
>>hochzählen und die 7_Segment aktualisieren.
> Nicht ganz, bei ständigem drücken hat er immer einen Treffer.
> Besser vor dem Einschalten von LED3 prüfen ob Taster losgelassen. Wenn
> ja, ein Prüfbit setzen und dann in der Pause Led3,Taster und Prüfbit
> testen. Wenn alles Ok Punkt vergeben.

:-)
Man kanns auch gemein machen.
Wird der Taster gedrückt, wenn nicht die mittlere LED leuchtet, gibts 
negative Punkte. Bei -100 Punkte ist das Spiel zu Ende :-)

Dann ist dein "Cheat" wirkungslos, weil das Spiel schon aus ist, noch 
bevor der Leuchtpunkt aus seiner Ruheposition raus ist.

Man sieht: Möglichkeiten gibt es viele. Alles nicht weiter schwer zu 
realisieren wenn man mit ein bischen gutem Willen und Phantasie an die 
Sache rangeht. Und klar, da ist noch Handlungsbedarf notwendig. Zb. soll 
ja ein gedrückter Taster auf der richtigen Led nur einmal erkannt 
werden, etc. Aber ich denke, Sinn einer Abi-Arbeit ist ja, dass der 
Ersteller auf solche Sachen selber draufkommt, bzw. sich im Vorfeld 
schon Gedanken über solche Themen macht und sein 'Konzept' drauf 
abstimmt. Drauf losprogrammieren kann jeder, demenstprechend sehen auch 
die meisten Programme dann auch aus.

(Den µC in der ISR bei Spielende gefangen zu halten ist auch nicht 
unbedingt die feine englische Art :-)

von Onur (Gast)


Lesenswert?

Also ich hab das Programm an den zuständigen Lehrer geschickt, er hat 
sich das angeschaut und hat mir geantwortet, dass ich den Taster an den 
Port der 7SegAnzeige legen soll.
Hmm wie soll ich das machen?

von Yada (Gast)


Lesenswert?

Du machst ein Abitur? Bitter :-(

von STK500-Besitzer (Gast)


Lesenswert?

>Also ich hab das Programm an den zuständigen Lehrer geschickt, er hat
>sich das angeschaut und hat mir geantwortet, dass ich den Taster an den
>Port der 7SegAnzeige legen soll.
>Hmm wie soll ich das machen?

Wenn er sich da auf längere zeit aufhalten soll und auch noch gegen 
Umkippen gesichert sein soll, schlage ich Heißkleber vor.

Was ist das denn für eine Prüfungsvorbereitung, wenn man son Pippifax 
nicht hinbekommt?
Lieber Mo.-Fr. Party gemacht vermutlich (am Wochende sowieso...).

von Onur (Gast)


Lesenswert?

Hmm...
Ich glaub ich hab mich falsch ausgedrückt.
Er hat gemeint dass ich den Eingang vom Taster an den Port von der 
7SegAnz legen soll.
Also gehe ich mal daon aus, dass ich noch im Programm etwas ändern muss.
Das war meine eigentliche Frage, wie ich es da im Programm ändern soll.

von Oliver (Gast)


Lesenswert?

z.B. so:

Befehlsstring .equ "User an 8015: Taster am gleichen Port wie 7SegAnz"
Das versteht der schon.

> Ok, aber muss ich auch noch nen Taster auf P3.2 extra Programmieren???
Nicht, wenn du o.a. Geheimtrick anwendest.

Bau es ein, und schick es an deinen Lehrer. Mal sehen, was der sagt.

Ehrlich, habt ihr das nicht gemacht, hast du nicht aufgepasst, und gibt 
ees auch gar keine Bücher/Hefte/sonstige Unterlagen, in denen mal 
erklärt wurde, wie man mit einem Mikrocontroller einen Taster abfragt?

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Onur wrote:

> Er hat gemeint dass ich den Eingang vom Taster an den Port von der
> 7SegAnz legen soll.

Ein kompletter Port hat 8 Pins
Eine 7-Segment Anzeige benötigt 7 Ausgangspins.

Nach Adam Riese bleibt daher 1 Pin frei, der als Eingang benutzt werden 
kann.

> Also gehe ich mal daon aus, dass ich noch im Programm etwas ändern muss.
> Das war meine eigentliche Frage, wie ich es da im Programm ändern soll.

Diesen einen Pin auslesen?
Das müsst ihr doch mal in der Schule durchgemacht haben, wie man einen 
Pin einliest.

von Peter D. (peda)


Lesenswert?

Onur wrote:
> Er hat gemeint dass ich den Eingang vom Taster an den Port von der
> 7SegAnz legen soll.

Da gibt es 2 Mööglichkeiten:

1. Du legst das Display an den Port wo auch der externe Interrupt ist

2. Du benutzt nicht den externen Interrupt
In dem Fall mußt Du eine Flankerkennung in Software machen, z.B. in 
einem Timerinterrupt alle 10ms den Pin einlesen und mit dem vorherigen 
Zustand vergleichen.


Peter

von Onur (Gast)


Lesenswert?

>Ehrlich, habt ihr das nicht gemacht, hast du nicht aufgepasst, und gibt
>ees auch gar keine Bücher/Hefte/sonstige Unterlagen, in denen mal
>erklärt wurde, wie man mit einem Mikrocontroller einen Taster abfragt?

>Diesen einen Pin auslesen?
>Das müsst ihr doch mal in der Schule durchgemacht haben, wie man einen
>Pin einliest.

Also,
tud mir Leid aber unser Lehrer ist so von schlecht, dass ist echt 
unglaublich. Ich bin auf einem ITG, wir hatten letzt Abiturprüfungen, 
und fast die ganze Klasse hat für die Assembleraufgabe ein leeres Blatt 
abgegeben. Für die Aufgabe gab es 1/3 der Gesamtpunktzahl, soll schon 
was heißen.
So, jetzt muss ich nächste Woche mit der Jahresarbeit fertig werden, und 
Assembler ist wahrlich nicht meine Stärke.

von H-G S. (haenschen)


Lesenswert?

Musst du den Taster wirklich entprellen ? Reicht es nicht dass du 
während dem Leuchten der besagten LED permanent den Taster abfragst und 
bei Gedrückt-Erkennung dann fortfährst ?

Es ist ja nicht so dass Prellen in dem Fall wirklich etwas negatives 
auslösen könnte...

von Heinz V. (heinz_v)


Lesenswert?

Der Pseudoopcode 'include' kann weiteren Quelltext als *.asm, *.inc oder 
*.txt einbinden, aber keinesfalls eine *.pdf Datei.

von c-hater (Gast)


Lesenswert?

Heinz V. schrieb:

> Der Pseudoopcode 'include' kann weiteren Quelltext als *.asm, *.inc oder
> *.txt einbinden, aber keinesfalls eine *.pdf Datei.

Also zum einen heißen diese "Pseudoopcodes" eigentlich Direktiven und 
zum anderen kann die Include-Direktive natürlich auch *.pdf einbinden. 
Die Datei muss nur reinen Quelltext enthalten, heißen darf sie, wie sie 
will.

Was Include allerdings tatsächlich nicht einbinden kann (zumindest nicht 
erfolgreich), sind Dateien im Portable Dokument Format. Übrigens auch 
dann nicht, wenn sie *.asm heißen.

Soll heißen: Dateinamen sagen erstmal rein garnichts über Dateiinhalte 
aus. Im allerbesten Fall passen sie lediglich gut dazu.

von Heinz V. (heinz_v)


Lesenswert?

Ja, exat das meinte ich, hatte mich nur leider missverständlich 
ausgedrückt :-S

von posti (Gast)


Lesenswert?

Hi

Wenn ich oben recht gelesen habe, gillt der Taster-Pin als 
'hardwaremäßig entprellt' - ferttsch - da ist nix mehr zum Entprellen 
da.

Das Hin- und Herschieben des Leucht-Punkt wünscht sich der Lehrer wohl 
mit Schiebe-Befehlen - könnte ich mir vorstellen.

7+1=8, hatten wir ja eben gerade - 7 LEDs, 1 Taster -> passt.

Das Port muß somit 7 OUT und 1 IN haben.

Die Taster-Abfrage sollte per Interrupt geschehen (stand auch oben, also 
auch nix mit Pollen) - wurde wohl bereits verbaut.

Nicht nur 'schön', sondern unabdingbar ist der Umstand, daß der Taster 
VOR dem Aufleuchten der mittleren LED aus war.

Da wir auf fallende Flanke überprüfen (und prellfrei sind, stand Beider 
ebenfalls oben), müssen wir auch nur nachsehen, ob gerade jetzt die 
mittlere LED leuchtet.
Ja -> Punkt
Nein -> kein Punkt oder Abzug (ist aber nicht vorgegeben)

Nun wird das Spiel angehalten, bis die Taste wieder frei gegeben wurde 
(wieder prellfrei).

Wenn der Punktestand von 9 erreicht ist, Programm beenden.

Als Schmankerl könnte man jetzt eine Licht-Show als Belohnung darbieten, 
der geneigte Spieler freut sich über so Kram.

8051 nicht mein Controller, das Listing schaut so weit aber schon 
brauchbar aus, wenn auch recht konfus verteilte Blöcke :)

Wenn bereits letztes Jahr der Großteil der Prüflinge versagt hat, ist 
entweder der Lehrer eine Niete, oder das Volk entwickelt sich so, wie 
ich es schon immer anprangerte gg.

Also ne Pfeife ist somit im Klassenraum - nur die Frage, ob vor oder 
hinter dem Pult.

Da der zuständige Lehrer aber Dir den Tip(... ok ... p) gab, das gleiche 
Port wie die 7-Segment-Anzeige zu benutzen, kann Er gar nicht so 
'pfeifig' sein.

Will jetzt Keinem in die Suppe spucken, aber Lehrer wöllte ich nicht 
sein - wir waren bestimmt keine Engel ... und besser geworden ist's mit 
der Generation 'Anti-Autoritär' nicht geworden ;)

MfG

von Bernd K. (prof7bit)


Lesenswert?

c-hater schrieb:
> natürlich auch *.pdf einbinden.
> Die Datei muss nur reinen Quelltext enthalten, heißen darf sie, wie sie
> will.

Wobei es jedoch vollkommen schwachsinnig ist einer Assembler-datei die 
Endung .pdf zu verpassen.

Ich würde das ändern und der Datei einen besser passenden Namen geben. 
Sinnvolle und konsequente Namensgebung für alles (auch für Dateien) ist 
auch ein wichtiger Teil der Programmierung den man sich von Anfang an 
angewöhnen sollte, und spätestens wenn Namen so unpassend gewählt sind 
daß sich einem beim Lesen die Fußnägel nach oben rollen und man sich vor 
Schmerzen überhaupt nicht mehr konzentrieren kann sollte man dringend 
was dagegen tun und ein bisschen Ordnung rein bringen.

von Thomas F. (igel)


Lesenswert?

Habt ihr mal aufs Datum geschaut?

Die Schule liegt wohl schon lange hinter ihm, sogar ein eventuelles 
Studium sollte inzwischen abgeschlossen sein.

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.