Hallo,
ich komm nicht weiter. Ich möchte nacheinander die 3 While-Schleifen
durchlaufen. Beendet werden sollen diese durch Betätigung des Tasters
PINC2.
Von der ersten Schleife in die zweite klappt das auch ganz gut. Aber aus
der zweiten Schleife komm ich dann nicht raus. Kann mir jemand bitte
helfen?
Muss mich korrigieren! Es funktioniert nur von Schleife 1 zu 2 bei
folgenden Code. Bei den oben aufgeführten überspringt er alle Schleifen.
War es nicht so, dass die while solange ausgeführt wird wie die
Bedienung true ist?
Phil schrieb:> Muss mich korrigieren! Es funktioniert nur von Schleife 1 zu 2 bei> folgenden Code. Bei den oben aufgeführten überspringt er alle Schleifen.
Sollen wir jetzt "finde den Unterschied" spielen? Was ist am zweiten
Code anders als am ersten?
> War es nicht so, dass die while solange ausgeführt wird wie die> Bedienung true ist?
Ja.
Andere Frage: Wo ist die Entprellung?
Natürlich nicht. Einfach den zweiten Code anschauen und den ersten nicht
betrachten. Danke.
Für die Entprellung hab ich mich bei [Entprellung] "Flankenerkennung"
bedient. Der Code ist ja in meinen Codeschnipsel oben mit enthalten.
Beim Loslassen von Taster 3 wird der Variable Programmablauf ein Wert
zugewiesen.
Und nochmal Entschuldigung. Hab als zweiten Code den gleichen im
Zwischenspeicher gehabt.
Es funktioniert nur wenn ich die Bedingung der Schleife folgendermaßen
ändere.
Phil schrieb:> Und nochmal Entschuldigung. Hab als zweiten Code den gleichen im> Zwischenspeicher gehabt.
Häng das C-File als Attachment an, so wie es ist.
Karl Heinz Buchegger schrieb:> Ich fürchte, das soll seine 'Entprellung' sein.
Zum De- bzw. Inkrementieren mit den Tastern T1 und T2 funktioniert das
allerdings sehr gut. Wenn ich das trotzdem falsch interpretiert habe mit
der Entprellung für den Fall, dann bitte ich um Aufklärung.
> char Tag_c[0] = "0";
Ein Array der Länge 0?
Ich fürchte da wird ein
sprintf(Tag_c,"%2d",Tag);
aber nicht reinpassen!
> Wenn ich das trotzdem falsch interpretiert habe mit
der Entprellung für den Fall, dann bitte ich um Aufklärung.
Dein Glück könnte sein, dass sprintf bzw. lcd Ausgabe auch Zeit
brauchen. Aber abgesehen davon ist das ziemlicher Unsinn, was du da
hast. Dein µC hachelt den Code schneller durch, als dein Taster auch nur
ansatzweise an prellen denken kann.
In der Zeit, in der du mit Copy&Paste Codeverfielfältigung betrieben
hast, hättest du auch eine ordentliche Entprellung übernehmen können.
Wenn du dir wenigstens eine einzige Funktion für die Zahleneingabe
gebaut hättest. Aber einfach Copy&Paste .... ts, ts, ts
Du hast ein LCD. AUf dem kann man sich auch Variablen ausgeben lassen,
von denen nicht klar ist, welchen Wert sie haben. Und es ist auch nicht
verboten, das LCD dazu zu benutzen sich zb Statusmeldungen des Programms
auszugeben, damit der geneigte Programmierer nachvollziehen kann, was
das Programm aus welchem Grund macht. Warum benutzt du das LCD nicht
dazu? Hauptsache die Copyrightmeldung taucht am Anfang auf.
Man man man Karl-Heinz. Du hast auch mal angefangen. Wenn dir es nicht
passt, dass ich zum Erlernen mich hier vom Tutorial bediene, dann dürft
ihr keine Beispiele reinstellen. Mit Sicherheit hast du wesentlich mehr
Erfahrung im programmieren, aber die Sprache C hast du auch nicht
entwickelt.
Zum Wesentlichen:
Das Array passt nicht rein. Ist ja auch nur ein Feld groß. Für Tage und
Monate brauch ich 2 Felder. Die Darstellung funktioniert allerdings
wunderbar. Konnte es mir bislang nicht erklären. Ich brauch den Wert
auch nicht im Array, sondern als int. Das Array ist nur für die LCD
Ausgabe gedacht.
Zum Thema Entprellung:
Ich hab mir das Tutorial angeschaut und am optimalsten hab ich die
Variante mit Flankenerkennung empfunden. Dazu habe ich mich wirklich von
Copy&Paste bedient. Warum auch das Rad neu erfinden? Ich hab den Code
für mein Programm angepasst. Und mit jeder fallenden Flanke wird der
Zaehler1 erhöht oder dekrementiert. Ich versteh nicht warum das keiner
Tastenentprellung entspricht?
Phil schrieb:> Zum Wesentlichen:>> Das Array passt nicht rein. Ist ja auch nur ein Feld groß. Für Tage und> Monate brauch ich 2 Felder.
Nein. Du brauchst 3.
Um einen String "Hallo" abzuspeichern, brauchst du ein Array der Länge
6. Denn hinter die Buchstaben kommt noch der für Strings obligatorische
Abschluss in Form eines \0 zeichens.
und du brauchstz ein C-Buch.
So hab nämlich ich mit C angefangen: mit einem Buch und durcharbeiten
der Übungen im Buch.
(Und PS: das war nachdem ich meinen ersten Compiler gebaut habe :-)
> Die Darstellung funktioniert allerdings> wunderbar.
Das heißt noch lange nichts.
> Konnte es mir bislang nicht erklären. Ich brauch den Wert> auch nicht im Array, sondern als int. Das Array ist nur für die LCD> Ausgabe gedacht.
Ist wurscht.
der sprintf bügelt dir Speicher nieder. Ob das nur für jetzt ist und
später wieder rauskommt oder nicht. Speicher überbügelt ist Speicher
überbügelt. Danach kann alles mögliche passieren, je nachdem wie genau
die Variablen im Speicher angeordnet sind.
Der Tip steht allerdings immer noch:
In deinem LCD ist zb die Ecke rechts oben in der ersten Zeile frei. Da
kann man sich zb wunderbar mal laufend 'Programmablauf' ausgeben lassen
und sich ansehen, wie sich der Wert verändert und überprüfen ob das so
richtig ist oder nicht. Oder ZustandT1. Oder ZustandT2. Oder ZustandT3.
Oder gleich alle 4 Variablen.
Karl Heinz Buchegger schrieb:> Nein. Du brauchst 3.> Um einen String "Hallo" abzuspeichern, brauchst du ein Array der Länge> 6. Denn hinter die Buchstaben kommt noch der für Strings obligatorische> Abschluss in Form eines \0 zeichens.
Ich erinner mich! Du hast vollkommen Recht. Das hatte ich vergessen.
Karl Heinz Buchegger schrieb:> C-Buch.
Ja/Nein :) Grundlegende Befehle kenn ich. Sind nur etwas eingerostet.
Das mit dem Speicher ist natürlich unschön. Da geb ich dir auch Recht.
Kannst du mir vielleicht trotzdem sagen warum ich von der ersten while
in die zweite while komme, dann aber nicht mehr in die dritte while?
Ganz unabhängig von den array?
Karl Heinz Buchegger schrieb:> Der Tip steht allerdings immer noch:> In deinem LCD ist zb die Ecke rechts oben in der ersten Zeile frei. Da> kann man sich zb wunderbar mal laufend 'Programmablauf' ausgeben lassen> und sich ansehen, wie sich der Wert verändert und überprüfen ob das so> richtig ist oder nicht. Oder ZustandT1. Oder ZustandT2. Oder ZustandT3.> Oder gleich alle 4 Variablen.
Alles klar. Das teste ich morgen gleich aus.
Phil schrieb:> Ganz unabhängig von den array?
Solange dieser Fehler nicht korrigiert ist, nehme ich keine Wetten an.
dein sprintf überschreibt alles mögliche im Speicher.
Phil schrieb:> Karl Heinz Buchegger schrieb:>> Der Tip steht allerdings immer noch:>> In deinem LCD ist zb die Ecke rechts oben in der ersten Zeile frei. Da>> kann man sich zb wunderbar mal laufend 'Programmablauf' ausgeben lassen>> und sich ansehen, wie sich der Wert verändert und überprüfen ob das so>> richtig ist oder nicht. Oder ZustandT1. Oder ZustandT2. Oder ZustandT3.>> Oder gleich alle 4 Variablen.>> Alles klar. Das teste ich morgen gleich aus.
Blöd ist jetzt natürlich, dass du den Code einfach dupliziert hast. Gäbe
es nur 1 Funktion
uint16_t numberInput( char* Text, uint16_t Minimum, uint16_t Maximum,
uint8_t Spalte )
{
...
}
dann bräuchte man nur an einer Stelle die Debug Ausdrücke einfügen und
hätte in einem Aufwasch für alle Zahleneingaben die Überprüfung drinnen.
So muss man jetzt jede Schleife einzeln 'pimpen' und nachher die Tests
und Ausgaben wieder aus jeder Schleife einzeln ausbauen.
Fazit: Es lohnt nicht, sich vermeintlich die Dinge 'einfach' zu machen,
indem man zunächst auf vernünftige Codeorganisation verzichtet. Im
Endeffekt hat man damit IMMER mehr Arbeit, als wie wenn man die Dinge
gleich vernünftig gemacht hätte.
Diese if-else-if Monster mag sich keiner ansehen, weil viel zu
unübersichtlich.
Für Statemachines gibt es schließlich switch-case.
Beim Entprellen lohnt es nicht, sich was selber auszudenken, ohne die
Seiteneffekte zu beachten.
Man spart sich sehr viel Zeit, wenn man erprobte Lösungen im
Timerinterrupt verwendet. Das Main kann dann dann bequem die
Ereignisflags behandeln und hat keine Seiteneffekte (Delays,
doppelte/verlorene Tastendrücke usw.) zu befürchten.