Kostenloser Elektrotechnik VIDEO-Kurs


mit VIDEO-Reihen zu den Themen:
Grundlagen der Elektrotechnik
Gleichstromnetze und Berechnungsverfahren
Wechselstrom und Drehstromnetze
Elektrische Maschinen
Regelungstechnik
Digitaltechnik
Mikrocontrollertechnik und C-Programmierung


Programmierung eines Kaffeeautomaten – Teil 2



Wie versprochen möchte ich diese Folge mit einer möglichen Lösung der Programmieraufgabe für die Zähleinrichtung beginnen.

Wie so häufig, gibt es viele Wege, die nach Rom führen.

Meine Lösung ist also nicht die einzige und sehr wahrscheinlich auch nicht die beste und schönste Lösung, die man sich vorstellen kann.

Here we are …


Für den Fall dass Du den Code einmal ausprobieren möchtest, aber nicht alles abtippen willst, kopiere ich das C-Programm einmal hierher:

P1=0;
printf(“Los gehts..”);

while(1){

switch (P1)
{
case 1:
printf(“Betrag: %d Cent”, Betrag+=1);
P1=0;
break;

case 2:
printf(“Betrag: %d Cent”, Betrag+=2);
P1=0;
break;

case 4:
printf(“Betrag: %d Cent”, Betrag+=5);
P1=0;
break;

case 8:
printf(“Betrag: %d Cent”, Betrag+=10);
P1=0;
break;

case 16:
printf(“Betrag: %d Cent”, Betrag+=20);
P1=0;
break;

case 32:
printf(“Betrag: %d Cent”, Betrag+=50);
P1=0;
break;

case 64:
printf(“Betrag: %d Cent”, Betrag+=100);
P1=0;
break;

case 128:
printf(“Betrag: %d Cent”, Betrag+=200);
P1=0;
break;

}
printf(“\n”);
getchar();  // damit das Programm hier wartet

Dies soll nur eine mögliche Lösung sein. Es gibt sicher noch elegantere Lösungen, die beispielsweise ohne das getchar() auskommen, damit dieses lästige Wechseln des Eingabefensters wegfällt.

So könnte man z.B. eine Warteschleife

while(P1==0);

einbauen und somit darauf warten, ob überhaupt eine Münze eingeworfen wurde.

Kaffeeausgabe

Im zweiten Teil der Aufgabe soll natürlich auch die Kaffeeausgabe überwacht werden.

Unser Kaffeeautomat bietet 3 Getränke

  • Kaffee 30 Ct
  • Espresso 40 Ct
  • Cappuchino 50 Ct

Die Wahl des Getränks soll über die Buchstaben “k” für Kaffee, “e” für Espresso und “c” für Cappuchino über die Tastatur erfolgen.

Bei Wahl des entsprechenden Getränks muss der Betrag natürlich wieder vom Guthaben abgezogen werden.

Ergänze also Dein Programm um diese Funktionalität.

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 ;-)

1 Star2 Stars3 Stars4 Stars5 Stars (Gibt jetzt das erste Rating ab!)
Loading ... Loading ...




Ähnliche Artikel

Folgende Artikel aus der gleichen Kategorie könnten Dich ebenfalls interessieren:

Programmierung der Getränkeausgabe In der vergangenen Woche haben wir eine mögliche Lösung für eine Zähleinrichtung der Geldeingabe für...

Geschachtelte for-Schleife Im letzten Artikel hast Du die Schleifen-Programmierung mit „for“ kennengelernt. Die Aufgabe für heu...

Programmierung eines Kaffeeautomaten In den vergangenen Folgen haben wir uns um die absoluten Grundlagen der Programmiersprache „C“ gekü...

Funktionen in C Ähnliche oder gleiche Befehle, die öfter genutzt werden kann man besser in Funktionen ausgliedern. F...

Schleifen mit for Dies ist nun der dritte Artikel, der sich mit der Programmierung von Schleifen beschäftigt. Neben de...

{ 10 Kommentare… sie unten lesen oder einen hinzufügen }

Willi

Hallo Wolfgang,
eine Frage zum Verständnis:
Soll zuerst gewählt und dann gezahlt oder
zuerst gezahlt und dann gewählt werden oder
sind beide Systeme zugelassen?
(In der Automatentechnik gibt es beide Systeme:
Zahlen – Wählen – Nehmen oder
Wählen – Zahlen – Nehmen oder
wahlweise die Kombination von beiden).
Gruß Willi

Wolfgang Bengfort

Hallo Willi,
beides soll möglich sein.
So lange das Guthaben ausreicht, soll auch Kaffee genommen werden können.
So könnte man beispielsweise 1 Euro einwerfen und dann 2 Kaffee und 1 Espresso entnehmen.

Viele Grüße
Wolfgang

Jan

Ich weiß zwar nicht ob du dich noch hier rum treibst,
erst mal großes Kompliment für diese Tutorials,
Sehr verständlich :)
Hier wäre mal meine Lösung:
Mit:
Geldzähler,
und Geld rückgabe:

i=0;
while (1) {
switch (P1)
{case 1:
printf(“Guthaben: %d cent\n”,++i);
getchar();
break;
case 2:
i=i+2;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 4:
i=i+5;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 8:
i=i+10;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 16:
i=i+20;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 32:
i=i+50;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 64:
i=i+100;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 128:
i=i+200;
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 0:
printf(“Guthaben: %d cent\n”,i);
getchar();
break;
case 3:
printf(“Ihr Restguthaben wird Ihnen Ausgegeben: %d cent\n”,i);
i=i-i;
getchar();
break;
default:
printf(“Ihr Geld wird Ausgeworfen”);
break;

}
if(i>=320)
{
printf(“Ihr Kafee wird ausgegeben\n”);
i=i-320;
getchar();
}
else
{printf(“\n”);
}
}
}

Und eine Frage ist es nciht möglich bei der Case function Berreiche einzugrenzen zB.
case ((i30) oder (<=10)
{
printf("der Berreich ist zwischen 5 und 30"\n);
break;
}

Hoffe auf Antwort :)
MfG

Chris

Hi,
Ich hab das oben gezeigte Programm kopiert und wollte es ausprobieren jedoch kommt ständig nur diese Fehlermeldung:
Rebuild target ‘Simulator’
compiling HELLO.C…
HELLO.C(42): error C100: unprintable character 0×93 skipped
HELLO.C(42): error C202: ‘Los’: undefined identifier
HELLO.C(42): error C141: syntax error near ‘gehts’
HELLO.C(42): error C100: unprintable character 0×94 skipped
HELLO.C(49): error C100: unprintable character 0×93 skipped
HELLO.C(49): error C141: syntax error near ‘:’
HELLO.C(49): error C100: unprintable character 0×94 skipped
HELLO.C(49): error C141: syntax error near ‘)’
HELLO.C(54): error C100: unprintable character 0×93 skipped
HELLO.C(54): error C141: syntax error near ‘:’
HELLO.C(54): error C100: unprintable character 0×94 skipped
HELLO.C(54): error C141: syntax error near ‘)’
HELLO.C(59): error C100: unprintable character 0×93 skipped
HELLO.C(59): error C141: syntax error near ‘:’
HELLO.C(59): error C100: unprintable character 0×94 skipped
HELLO.C(59): error C141: syntax error near ‘)’
HELLO.C(64): error C100: unprintable character 0×93 skipped
HELLO.C(64): error C141: syntax error near ‘:’
HELLO.C(64): error C100: unprintable character 0×94 skipped
HELLO.C(64): error C141: syntax error near ‘)’
HELLO.C(69): error C100: unprintable character 0×93 skipped
HELLO.C(69): error C141: syntax error near ‘:’
HELLO.C(69): error C100: unprintable character 0×94 skipped
HELLO.C(69): error C141: syntax error near ‘)’
HELLO.C(74): error C100: unprintable character 0×93 skipped
HELLO.C(74): error C141: syntax error near ‘:’
HELLO.C(74): error C100: unprintable character 0×94 skipped
HELLO.C(74): error C141: syntax error near ‘)’
HELLO.C(79): error C100: unprintable character 0×93 skipped
HELLO.C(79): error C141: syntax error near ‘:’
HELLO.C(79): error C100: unprintable character 0×94 skipped
HELLO.C(79): error C141: syntax error near ‘)’
HELLO.C(84): error C100: unprintable character 0×93 skipped
HELLO.C(84): error C141: syntax error near ‘:’
HELLO.C(84): error C100: unprintable character 0×94 skipped
HELLO.C(84): error C141: syntax error near ‘)’
HELLO.C(89): error C100: unprintable character 0×93 skipped
HELLO.C(89): error C141: syntax error near ‘\’
Target not created

“Mein” Programm sieht wie folgt aus:

#include /* special function register declarations */
/* for the intended 8051 derivative */

#include /* prototype declarations for I/O functions */

#ifdef MONITOR51 /* Debugging with Monitor-51 needs */
char code reserve [3] _at_ 0×23; /* space for serial interrupt if */
#endif /* Stop Exection with Serial Intr. */
/* is enabled */

/*————————————————
The main C function. Program execution starts
here after stack initialization.
————————————————*/
void main (void) {
int Betrag;
/*————————————————
Setup the serial port for 1200 baud at 16MHz.
————————————————*/
#ifndef MONITOR51
SCON = 0×50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0×20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
#endif

/*————————————————
Note that an embedded program never exits (because
there is no operating system to return to). It
must loop and execute forever.
————————————————*/
P1=0;
printf(“Los gehts..”);

while(1){

switch (P1)
{
case 1:
printf(“Betrag: %d Cent”, Betrag+=1);
P1=0;
break;

case 2:
printf(“Betrag: %d Cent”, Betrag+=2);
P1=0;
break;

case 4:
printf(“Betrag: %d Cent”, Betrag+=5);
P1=0;
break;

case 8:
printf(“Betrag: %d Cent”, Betrag+=10);
P1=0;
break;

case 16:
printf(“Betrag: %d Cent”, Betrag+=20);
P1=0;
break;

case 32:
printf(“Betrag: %d Cent”, Betrag+=50);
P1=0;
break;

case 64:
printf(“Betrag: %d Cent”, Betrag+=100);
P1=0;
break;

case 128:
printf(“Betrag: %d Cent”, Betrag+=200);
P1=0;
break;

}
printf(“\n”);
getchar(); // damit das Programm hier wartet
}
}

Ich weis echt nicht woran es liegen könnte?
Würde mich freuen wenn Sie mir bei meinem Problem helfen könnten

Wolfgang Bengfort

Hallo Chris,
es sieht so aus,als wenn bei em Kopieren des Codes einige Sonderzeichen, wie etwa das ” nicht korrekt kopiert werden.

Gib die Hochkommata einmal per Tastatur ein, dann sollte es gehen.

Wolfgang Bengfort

Ich habe eben eine Email von Chris erhalten, dass genau da das Problem war.
Sollte also noch jemand das Problem haben: Bitte die Hochkommata manuell setzen.

Steffen

Hallo Wolfgang,

Danke für die tolle Möglichkeit programmieren zu lernen.
Hat mir schon sehr geholfen.

Hab jetzt aber ne Frage.
Mein Guthaben wird nicht addiert. Ich kann nicht erkennen warum.
Kannst Du mir bitte Feedback geben?
Danke, Steffen

#include /* special function register declarations */
#include /* prototype declarations for I/O functions */

void main (void) {

int Guthaben;
Guthaben=0;
P1=0;

#ifndef MONITOR51
SCON = 0×50; /* SCON: mode 1, 8-bit UART, enable rcvr */
TMOD |= 0×20; /* TMOD: timer 1, mode 2, 8-bit reload */
TH1 = 221; /* TH1: reload value for 1200 baud @ 16MHz */
TR1 = 1; /* TR1: timer 1 run */
TI = 1; /* TI: set TI to send first char of UART */
#endif

while (1)
{

switch (P1)
{
case 1: Guthaben+=1;
printf(“Ihr Guthaben beträgt %d Cent\n”,Guthaben);
break;
case 2: Guthaben+=2;
printf(“Ihr Guthaben beträgt %d Cent\n”,Guthaben);
break;
case 4: Guthaben+=5;
printf(“Ihr Guthaben beträgt %d Cent\n”,Guthaben);
break;
case 8: Guthaben+=10;
printf(“Ihr Guthaben beträgt %d Cent\n”,Guthaben);
break;
case 16: Guthaben+=20;
printf(“Ihr Guthaben beträgt %d Cent\n”,Guthaben);
break;
case 32: Guthaben+=50;
printf(“Ihr Guthaben beträgt %d Cent\n”,Guthaben);
break;
case 64: Guthaben+=100;
printf(“Ihr Guthaben beträgt %d Cent\n”,Guthaben);
break;
case 128: Guthaben+=200;
printf(“Ihr Guthaben beträgt %d Cent\n”,Guthaben);
break;
default: printf(“Bitte Geld einwerfen\n”);
}
getchar();
P1=0;
printf(“Ihr Guthaben beträgt %d Cent\n”,Guthaben);

} //end while
} //end main

Wolfgang Bengfort

Hallo Steffen,

das Problem liegt in den viert- und fünftletzten Zeilen:

getchar();
P1=0;

Du wartest mit getchar(), während Du wartest gibst Du über P1 Deine Münze ein, drückst eine Taste, damit das Programm weiterläuft und setzt dann den Port P1 auf 0 bevor Du ihn auswertest.

Der Port P1 ist also immer 0×00 bei der Auswertung. Deshalb wird der Betrag auch nicht inkrementiert.

Asgedom

Chris,
überprüfe dein printf Befehl, die invertierten Commas sind nicht richtig geschrieben.

grüß

monettenom

#include

int InsertCoint()
{
// Todo: Münzeinwurf simulieren
return 0; // 0 = Münzeinwurf abgeschlossen
}

void main(void)
{
int Coin = 0;
int Sum = 0;
printf(“Bitte werfen Sie eine Münze ein!\n”);

while(Coin = InsertCoin())
{
int Amount = 0;
switch (Coin)
{
case 1: Amount = 1; break;
case 2: Amount = 2; break;
case 4: Amount = 5; break;
case 8: Amount = 10; break;
case 16: Amount = 20; break;
case 32: Amount = 50; break;
case 64: Amount = 100; break;
case 128: Amount = 200; break;
default: break;
}
Sum += Amount;
printf(“Einwurf: %d Cent: Betrag: %.2f Euro\n”, Amount, Sum/100.0);
}
getchar(); // damit das Programm hier wartet
}

Einen Kommentar hinterlassen