Wie immer gibt es verschiedene Möglichkeiten die Funktion zu realisieren.
Mein Vorschlag ist daher nur eine mögliche Lösung. Es gibt sicher elegantere Lösung. Vor allem der Umgang mit der Variablen Betrag lässt sich sicher noch optimieren
. Nähere Information gibt es dazu Video.
Die Anforderungen an die Funktion Eingabe()
In der Funktion Eingabe sollen zwei Dinge umgesetzt werden.
- Die Erhöhung des Gesamtbetrages um den Wert der eingeworfenen Münze und die Ausgabe des Gesamtbetrages.
- Das Zurücksetzen des entsprechenden Portbits, damit die Münze beim nächsten Durchlauf nicht noch einmal gezählt wird.
Um die Funktion Eingabe() zu realiseren, musst Du verschiedene Dinge, die Du in den vergangenen Folgen gelernt hast umsetzen.
Zur Verwendung von Funktionen kannst Du Dir evtl, noch einmal die Videos ab Artikel 22 Funktionen in C angucken.
Auch die Videos zur Variablenzuweisung, zur if-Abfrage und zur Bitweisen Manipulation können vielleicht helfen.
Während der erste Teil, Die Erhöhung des Gesamtbetrages um den Wert der eingeworfenen Münze und die Ausgabe des Gesamtbetrages, noch verhältnismäßig einfach ist, geht es bei dem 2. Teil der Aufgabe schon ziemlich zur Sache.
Wie häufig bei Funktionen, bei denen die Ausführung abhängig von Parametern ist, ist es auch in diesem Beispiel so, dass Du bei der Programmierung der Funktion noch nicht weißt, welche Parameter übergeben werden. Du musst also die Funktion so flexibel gestalten, dass aus den übergebenen Parametern die durchzuführenden Befehle errechnet werden können.
Eine mögliche Lösung findest Du im Video.
Bis zum nächsten Mal.
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:Arrays In den vergangenen Folgen ging es ja schon um die Optimierung der Programmierung für unsren Kaffeeau...
Lösung der Übungsaufgabe zu Funktionen In den vergangenen Artikeln bin ich auf die Behandlung von Funktionen und das Thema Parameterübergab...
Bitweises Auslesen eines PORTs Im heutigen Video zeige ich eine mögliche Lösung, wie man mit Hilfe eins bitweisen UND bzw. eines bi...
Bitweise Manipulation Der Kaffeeautomat funktioniert ja schon im Prinzip. Aber zumindest beim Geldeinwurf gibt es noch ein...





{ 4 Kommentare… sie unten lesen oder einen hinzufügen }
Hallo Herr Wolfgang Bengfort,
ich finde die fehler in der Implementierung nicht.
-Ich muss 3 mal auf Run klicken dann wird ausgeführt.
-ich bekomme den gesamten Betrag nicht zurück.
Könnten Sie mir bitte vielleicht ein paar Tips geben.
Danke im voraus.
#include
#include
int betrag;
void eingabe(char,int);
void main (void) {
char h,k,c,e;
P1=0;
printf(“Schmeißen Sie das Geld rein \n”);
while (1) {
if (P1&0×01) eingabe (0×01,1);
if (P1&0×02) eingabe (0×02,2);
if (P1&0×04) eingabe (0×04,5);
if (P1&0×08) eingabe (0×08,10);
if (P1&0×10) eingabe (0×10,20);
if (P1&0×20) eingabe (0×20,50);
if (P1&0×40) eingabe (0×40,100);
if (P1&0×80) eingabe (0×80,200);
k=’k';
e=’e';
c=’c';
h=getchar();
switch(h){
case ‘k’:
printf(“Sie haben Kaffee gewählt. \n”);
printf(“Kaffee kostet 30 Cent. \n”);
if(betrag>=30){
printf(“Sie haben noch %d Cent übrig.\n”, betrag=betrag-30);
}
else { printf(“Sorry, Sie haben nicht genug Geld, schmeissen Sie mindestens %d Cent rein.\n “, 30-betrag);}
break;
case ‘e’:
printf(“Sie haben Espresso gewählt. \n”);
printf(“Espresso kostet 40 Cent. \n”);
if(betrag>=40){
printf(“Sie haben noch %d Cent übrig.\n”, betrag=betrag-40);
}
else { printf(“Sorry, Sie haben nicht genug Geld, schmeissen Sie mindestens %d Cent rein.\n “, 40-betrag);}
break;
case ‘c’:
printf(“Sie haben Cappuccino gewählt. \n”);
printf(“Cappuccino kostet 50 Cent. \n”);
if(betrag>=50){
printf(“Sie haben noch %d Cent übrig.\n”, betrag=betrag-50);
}
else { printf(“Sorry, Sie haben nicht genug Geld, schmeissen Sie mindestens %d Cent rein.\n “, 50-betrag);}
break;
default:
printf(“Drücken Sie e für Esspresso,k für Kaffee oder c für Cappuccino \n”);
} //end switch */
} //end while
} // end main
void eingabe (char platz, int sum){
printf(“Der Guthaben beträgt %d Cent\n”, betrag+sum);
P1=P1&(0XFF-platz);
}
Ja, da gibt es mehrere kleine Probleme.
Wenn das Programm gestartet wird, läuft der Mikrocntroller zunächst einmal zum ersten getchar().
Die geplante Auswertung durch die Funktion eingabe() ist dann schon gelaufen.
Es wird also als erstes die Getränkeauswahl bearbeitet, obwohl der Betrag noch 0 beträgt.
In der Funktion eingabe() fällt mir noch auf, dass die Variable betrag nicht aktualisiert wird.
Es wird zwar der neue Betrag angezeigt, der Wert aber nicht in der Variablen betrag gespeichert.
Danke schön
Hallo Wolfgang & Co,
hier mal meine Version – etwas länger und etwas anders, aber funktioniert prächtig
——————————————————————
void Eingabe(int Wert, char Schacht); // Bekanntgabe Funktionen …
void Ausgabe();
int zaehler=0; // Globale Variablen …
int preis=0;
int differenz=0;
char auswahl=’a';
void main (void) {
…..
while (1) {
P1=0;
printf(“Auswahl: [k]affee 30ct | [e]spresso 40ct | [c]appuccino 50ct \n \n”);
auswahl = getchar(); // Auffangen der Tasteneingabe k,e oder c
switch (auswahl)
{
case ‘k’: preis = 30;break;
case ‘e’: preis = 40;break;
case ‘c’: preis = 50;break;
default: printf(“\n Bitte Auswahl treffen: k,e oder c? \n”);
}
while (zaehler<preis) // Schleife solange, bis zaehler mind. gleich groß ist wie preis
{
if(P1&0×01){Eingabe(1,0xFE);} //0xFE entspricht 1111 1110
if(P1&0×02){Eingabe(2,0xFD);} //0xFD entspricht 1111 1101
if(P1&0×04){Eingabe(5,0xFB);} //0xFB entspricht 1111 1011
if(P1&0×08){Eingabe(10,0xF7);} //0xF7 entspricht 1111 0111
if(P1&0×10){Eingabe(20,0xEF);} //0xEF entspricht 1110 1111
if(P1&0×20){Eingabe(50,0xDF);} //0xDF entspricht 1101 1111
if(P1&0×40){Eingabe(100,0xBF);} //0xBF entspricht 1011 1111
if(P1&0×80){Eingabe(200,0x7F);} //0x7F entspricht 0111 1111
if(zaehler<preis)
{
differenz = preis-zaehler;
switch (auswahl)
{
case 'k': printf("\nKaffee 30ct \n");break;
case 'e': printf("\nEspresso 40ct \n");break;
case 'c': printf("\nCappuccino 50ct \n");break;
}
printf("Erhalten: %d ct \n", zaehler);
printf("Fehlt: %d ct \n", differenz);
getchar();
}
else {differenz = zaehler-preis;}
} // Ende while-Schleife "zaehler 0)
{
if(zaehler == preis)
{
printf(“Kaffee wird serviert. Neue Auswahl -> ENTER drücken. \n”);
Ausgabe();
getchar();
}
else
{
printf(“Kaffe wird serviert, %d Cent retour. Neue Auswahl -> ENTER drücken. \n”, differenz);
Ausgabe();
getchar();
}
} // Ende if-Abfrage “zaehler>0″
} // Ende while-Schleife
} // Ende main-Funktion
void Eingabe(int Wert, char Schacht)
{
zaehler+=Wert;
P1&=Schacht;
}
void Ausgabe() // WICHTIG, da sonst ka gscheite Übergabe an nächste Auswahl
{
zaehler=0;
preis=0;
differenz=0;
auswahl=’a';
P1=0;
}
————————————————————-
Es macht echt Spaß, sich nach den Anweisungen von Wolfgang in diese Thematik einzuarbeiten. Leider komme ich nur hin&wieder dazu, dem Kurs zu folgen, aber ich werde dranbleiben. Dank der Aufbereitung von Wolfgang ist es ja zum Glück kein Problem, wenn man nicht regelmäßig dabei sein kann. DANKE für DIESE Website!