Forum: Offtopic Realisierung eines Betrugswürfels


von dave2k (Gast)


Lesenswert?

Hi alle zusammen!

Ich wurde heute zu einer Hausarbeit verdonnert.
Es geht um, die Programmierung eines Betrugswürfels in Assembler.
Leider fehlt mir jeglicher Ansatz zur Realisierung des Projekts.
Die Aufgabenstellung lautet folgendermassen :


Ein Zähler soll von 1-6 (Würfelzahlen) zyklisch zählen.
Wenn die "blaue" Taste (P3.3) gedrückt wird soll der momentane 
Zählerstand am Port 2 (Adresse A0h) ausgegeben werden.
Wenn aber am Port 1 (Adresse 90h) das Bit 0 auf 1 ist, soll jede zweite 
Zahl die 6 sein! Trotzdem sollen alle Würfelzahlen vorkommen.
Die Taste muss entprellt werden.

Erstellen Sie ein Programm und ein kommentiertes Assemblerprogramm.


Falls es was bringt: die Platine, auf der dies realisiert werden soll, 
ist von Atmel um genau zu sein der AT89C51RD2 bzw. ED2.

von dave2k (Gast)


Lesenswert?

Sorry, mein Fehler es sollte so heißen
========

Erstellen Sie ein => Programmablaufplan <= und ein kommentiertes 
Assemblerprogramm.

von holger (Gast)


Lesenswert?

>Ich wurde heute zu einer Hausarbeit verdonnert.

Mal abgesehen davon das deine Frage in der Codesammlung
nichts verloren hat: Hausaufgaben sind dazu da das
man sie SELBER erledigt. Da möchte jemand wissen
ob DU dazu in der Lage bist eine Problemstellung
ALLEINE zu lösen.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

na betrachte die Aufgabe mal als Zustandsmaschine ("state machine"). Der 
eigentliche Würfel kennt 6 Zustände, dafür braucht man 3 Bit. Der Zähler 
auf 2 für die Tastendruckzählung braucht ein weiteres Bit.

von Peter D. (peda)


Lesenswert?

dave2k wrote:
> Erstellen Sie ein => Programmablaufplan

Das ist schön, daß auf sowas Wert gelegt wird.
Damit vereinfacht sich das Programmieren erheblich.

Ein Zwischenschritt könnte sein, den Programmablauf erstmal verbal in 
eigenen Worten zu beschreiben.

"Hier meine Aufgabe, macht ihr mal." führt definitiv nicht zum Ziel.


Peter

von Karl H. (kbuchegg)


Lesenswert?

> Leider fehlt mir jeglicher Ansatz zur Realisierung des Projekts.

Das ist schlecht.
Vor allem deswegen, weil in der Aufgabenstellung schon fast 70%
des Programmaufbaus beschrieben ist

> Ein Zähler soll von 1-6 (Würfelzahlen) zyklisch zählen.
> Wenn die "blaue" Taste (P3.3) gedrückt wird soll der momentane
> Zählerstand am Port 2 (Adresse A0h) ausgegeben werden.

Ich denke wir können mal von einem Stadardaufbau ausgehen:
Soll heissen: Nach der Initialisierung betritt das Programm
die Hauptschleife und arbeitet dieselbe Befehlssequenz immer
und immer wieder ab.
Mit diesem Ansatz kann man schon mal nicht so falsch liegen.

      +-----------------+
      | Initialisierung |
      +-----------------+
               |
               v
       +---------------+
       |               |<------+
       +---------------+       |
               |               |
               +---------------+

Da ist also von einem Zähler die Rede. Na das wird wohl
eine Variable werden, und da wir uns in Assembler bewegen
und absehbar ist, dass für die Aufgab nicht viele Register
benötigt werden, merken wir uns gleich mal, dass der Zähler
in einem Register residieren wird.

Schön und gut.
Was soll der Zähler machen?
> Ein Zähler soll von 1-6 (Würfelzahlen) zyklisch zählen.

Aha. Er soll also von 1 beginnend immer um 1 hochzählen
und wenn er 6 erricht hat, wieder bei 1 beginnen.
Na das ist doch nicht schwer einzuarbeiten

      +-----------------+
      | Initialisierung |
      |                 |
      |  Zähler = 1     |
      +-----------------+
               |
               v
       +---------------------+
       | Zähler = Zähler + 1 |<-----+
       +---------------------+      |
               |                    |
               v                    |
         /-------------\  Nein      |
        / Zähler = 7 ?  \-----------+
        \               /           |
         \-------------/            |
               |                    |
               v                    |
       +---------------+            |
       | Zähler = 1    |            |
       +---------------+            |
               |                    |
               +--------------------+

Überzeuge dich davon, dass dies tatsächlich die Vorgabe
> Ein Zähler soll von 1-6 (Würfelzahlen) zyklisch zählen.
erfüllt. Notfalls fährst du einfach mit dem Finger die
Verbindungen ab und führst die Aktionen aus. Im Kopf kannst
du dabei das Register 'Zähler' mitführen.

> Wenn die "blaue" Taste (P3.3) gedrückt wird soll der momentane
> Zählerstand am Port 2 (Adresse A0h) ausgegeben werden.

Aha. Da ist also von einer Taste die Rede.
Nun die Taste wird ja vom Programm nicht einfach so erkannt.
Da muss doch sicherlich irgendetwas initialisiert werden.
Auch sollte man festhalten, dass im Text von 'gedrückt wird'
und nicht von 'gedrückt ist' die Rede ist. Das bedeutet, der
Zählerstand wird nur dann ausgegeben, wenn die Taste vom Zustand
'nicht gedrückt' in den Zustand 'gedrückt' übergeht. Macht auch
Sinn, denn wenn der Zählerstand jedesmal ausgegeben werden würde,
wenn die Taste gedrückt ist, dann würden da so schnell Zahlen
durchlaufen, dass man nichts mehr sehen würde.

Das heist aber auch, dass das Prgramm über den Zustand der Taste
Buch führen muss: Nur dann wenn die Taste jetzt gedrückt ist
und im Schleifendurchlauf vorher war sie noch nicht gedrückt,
dann ist offensichtlich in der Zwischenzeit die Taste gedrückt
worden und die Ausgabe soll erfolgen.

Also so in etwa
      +-------------------------+
      | Initialisierung         |
      |                         |
      |  Zähler = 1             |
      |  TasteVorher = nicht g. |
      +-------------------------+
               |
               |<----------------------------------------------+
               v                                               |
         /----------------\   Ja                               |
        / Taste gedrückt ? \---------+                         |
        \                  /         |                         |
         \----------------/          v                         |
          Nein |           Ja  /------------------------\      |
               |       +------/ TasteVorher = gedrückt ? \     |
               |       |      \                          /     |
               |       |       \------------------------/      |
               |       |             |                         |
               |       |             v                         |
               |       |       +------------------------+      |
               |       |       | Zähler ausgben         |      |
               v       |       | TasteVorher = gedrückt |      |
+-------------------+  |       +------------------------+      |
| TasteVorher=n. g. |  |             |                         |
+-------------------+  |             |                         |
               |       |             |                         |
               |    +--+  +----------+                         |
               |    |     |                                    |
               v    v     v                                    |
       +---------------------+                                 |
       | Zähler = Zähler + 1 |                                 |
       +---------------------+                                 |
               |                                               |
               v                                               |
         /-------------\  Nein                                 |
        / Zähler = 7 ?  \--------------------------------------+
        \               /                                      |
         \-------------/                                       |
               |                                               |
               v                                               |
       +---------------+                                       |
       | Zähler = 1    |                                       |
       +---------------+                                       |
               |                                               |
               +-----------------------------------------------+

Jetzt verlangt aber deine Aufgabenstellung, dass die Taste entprellt
werden muss. Zum Entprellen gibt es meherer Methoden. Da ich
aber nicht wissen kann, welche ihr gelernt habt, musst du hier
selbst Hand anlegen und das gegebenenfalls modifizieren.

War doch bisher nicht schwer, oder?
Und so gehst du deine Aufgabenstellung durch und arbeitest mal
alles ein was du aus der Aufgabenstellung entnehmen kannst.

Und für den Rest: sei erfinderisch. Wie könnte man das wohl
hinkriegen, das jede 2.te Ausgabe eine 6 sein soll. Na da
wird man wohl mitzählen müssen! Ein 2ter Zähler der immer
0, 1, 0, 1, 0, 1, 0, 1 ... zählt. Steht der Zähler auf 0
dann gibst du das Ergebnis vom echten 'Würfelzähler' aus.
Steht er auf 1, dann gibst du immer eine 6 aus.

von DerSchelm (Gast)


Lesenswert?

Mal ganz etwas anderes

Hast Du den Plan von Hand eingetippt oder gibt es dazu ein schlaues 
Programmchen?

von Karl H. (kbuchegg)


Lesenswert?

DerSchelm wrote:
> Mal ganz etwas anderes
>
> Hast Du den Plan von Hand eingetippt oder gibt es dazu ein schlaues
> Programmchen?

Hand.
Geht schneller als man denkt.

von maddin (Gast)


Lesenswert?

hallo,

ich könnte das  sonst noch auf :

www.tech-chat.de/aacircuit.html

hinweisen.

das tool ist schon ganz nett, wenn man lernt mit den kleinen bugs 
umzugehen :_)

m.

von dave2k (Gast)


Lesenswert?

Hört sich ganz gut an. Werde mal versuchen mich mit den 
Lösungsvorschlägen auseinander zu setzen. Hat mir bis jetzt ziemlich 
weiter geholfen. Danke erst mal dafür.


Für weitere Anregungen und Lösungsvorschläge bin ich weiterhin offen und 
sehr dankbar.

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.