Der Kaffeeautomat funktioniert ja schon im Prinzip. Aber zumindest beim Geldeinwurf gibt es noch eine kleine Schwierigkeit.
- Was passiert eigentlich, wenn jemand 2 oder mehr Münzen gleichzeitig einwirft?
- Wie können wir unsere Software dahingehend verbessern, damit die Software auch damit umgehen kann?
Tim hat recht: Wenn jemand zwei Geldmünzen gleichzeitig einwirft, oder so schnell hintereinander, dass der Mikrocontroller aus welchem Grund auch immer, noch beschäftigt ist und die Eingabe einzelnen Münzen nicht schnell genug abarbeiten kann, gibt es ein Problem. Nur die erste Münze wird gewertet, der Werte der anderen eingeworfenen Münzen geht verloren.
Eine Lösung dieses Problems besteht darin, die Bits des Ports einzeln abzufragen.
So kann bestimmt werden, ob eine Münze eingeworfen wurde, unabhängig davon, ob zusätzlich auch noch weitere Münzen eingeworfen wurden.
In dem Video wird mit hexadezimalen Zahlen gerechnet. Wenn Du Dir den Umgang mit Hex-Zahlen und die teilweise kryptische Art der Variablenzuweisung noch einmal vergegenwärtigen möchtest, dann empfehle ich Dir vorab noch diese 4 Artikel
Binäre, dezimale und hexadezimale Zahlen
Variablenzuweisung und modulo-Funktion
Nun aber zum Video über die bitweise Manipulation.
Nun bist Du wieder an der Reihe.
Deine Aufgabe ist es nun, ein Programm zu schreiben, das auch erkennt, wenn mehrere Münzen eingeworfen wurden.
Es ist hier wahrscheinlich einfacher, if-Abfragen statt switch-case-Abfragen zu nutzen.
Wichtig ist auch, dass Du, wenn Du ein Bit ausgewertet hast, nicht den gesamten Port zurückzusetzen, sondern nur das in Deinem Programm ausgewertete Bit.
Viel Spaß beim Programmieren!
In der nächsten Woche werde ich dann wieder eine mögliche Lösung zeigen.
Dieser Artikel ist Teil des Mikrocontroller-Kurses auf ET-Tutorials.de.
[ >> Hier geht es zurück zur Übersichtsseite des Mikrocontroller-Kurses .]
Hat Dir der Artikel geholfen? - Dann hilf dem Artikel ;-)
|
Ähnliche Artikel
Folgende Artikel aus der gleichen Kategorie könnten Dich ebenfalls interessieren:Programmierung der Münzeingabe In der vergangenen Folge wurde exemplarisch das Setzen und Löschen der ersten drei Bits des Kaffeeau...
Bitweises Auslesen eines PORTs Im heutigen Video zeige ich eine mögliche Lösung, wie man mit Hilfe eins bitweisen UND bzw. eines bi...
Programmierung der Getränkeausgabe In der vergangenen Woche haben wir eine mögliche Lösung für eine Zähleinrichtung der Geldeingabe für...
Programmierung eines Kaffeeautomaten – Teil 2 Wie versprochen möchte ich diese Folge mit einer möglichen Lösung der Programmieraufgabe für die Zä...





{ 2 Kommentare… sie unten lesen oder einen hinzufügen }
Hallo Wolfgang,
das Programm funktioniert
Du schreibst in der Aufgabenstellung „Wichtig ist, dass nach einer Bitauswertung nicht der gesamte Port zurückgesetzt wird, sondern nur das im Programm ausgewertete Bit.
Frage 1: Warum sollte ich das ausgewertete Bit zurücksetzen? Es wird doch im nachfolgenden Programm nicht mehr benötigt?
Frage 2: Genügt es wirklich ein Bit zurück zu setzen?
Müsste man nicht das ursprüngliche Bitmuster wieder herstellen?
Z.B. Merker1 = P1;
If (P1&0×01)
{…
}
P1=Merker1;
Frage 3: Ich hab bei meinen Lösungsversuchen zunächst versucht das Problem mit einer case (P1&0×01): Anweisung zu lösen. Hat nicht funktioniert. Kann man in einer case Abfrage keine „Funktion“ abfragen?
Viele Grüße
Christian
Meine Lösung
while(1)
{
P1=0; // Port P1 wird auf den Wert 0 gesetzt
printf(“Bitte ein Getränk auswählen \n k für Kaffe \n e für Espresso \n c für Cappuchino \n”);
zeichen = getchar(); //Wartet auf eine Eingabe
switch (zeichen)
{
case ‘k’:
printf(“\n Sie haben Kaffee gewählt \n”);
Preis = 30; //Preis für Kaffee 30 Cent
break;
case ‘e’:
printf(“\n Sie haben Espresso gewählt \n”);
Preis = 40; //Preis für Espresso 40 Cent
break;
case ‘c’:
printf(“\n Sie haben Cappuchino gewählt \n”);
Preis = 50; //Preis für Cappuchino 50 Cent
break;
}
while (Preis-Betrag >0)
{
Restbetrag=Preis-Betrag;
printf(“Bitte werfen Sie %d Cent ein \n”,Restbetrag);
getchar();
if (P1&0×01)
{
printf(“Betrag: %d Cent \n”, Betrag+=1);
}
if (P1&0×02)
{
printf(“Betrag: %d Cent \n”, Betrag+=2);
}
if (P1&0×04)
{
printf(“Betrag: %d Cent \n”, Betrag+=5);
}
if (P1&0×08)
{
printf(“Betrag: %d Cent \n”, Betrag+=10);
}
if (P1&0×10)
{
printf(“Betrag: %d Cent \n”, Betrag+=20);
}
if (P1&0×20)
{
printf(“Betrag: %d Cent \n”, Betrag+=50);
}
if (P1&0×40)
{
printf(“Betrag: %d Cent \n”, Betrag+=100);
}
if (P1&0×80)
{
printf(“Betrag: %d Cent \n”, Betrag+=200);
}
P1=0;
}
if (Preis-Betrag <=0)
Betrag = 0;
printf("\n Einen schönen Tag");
zeichen=0;
getchar();
Hallo Christian,
Zu Frage 1:
Wenn Du das Bit nicht zurücksetzt, dann wird im nächsten Schleifendurchlauf der Betrag noch einmal addiert, und in allen folgenden auch..
Frage 2:
Wenn beispielsweise ein 10Ct und ein 5Ct eingeworfen wurde, dann darfst Du nach der Bearbeitung des 5Ct Stücks auch nur dieses Bit zurücksetzen und nicht den gesamten Port gleich Null setzen, sonst würde die Information für das 10Ct Stück verloren gehen.
Frage 3:
Mit einer switch-case Abfrage ist das Problem nur über Umwege zu lösen. Mach hier keinen Sinn.