Forum: Compiler & IDEs While Schleife


von Phil (Gast)


Lesenswert?

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?
1
int zustandT3 =0;
2
int  Programmablauf = 0;
3
//Tage
4
while(Programmablauf == 0){  
5
    //es passiert noch mehr    
6
    if (zustandT3==0 && !(PINC & (1<<PINC2))) {
7
        zustandT3 = 1;
8
    }
9
    else if (zustandT3==1 && !(PINC & (1<<PINC2))) {
10
        zustandT3 = 2;
11
    }
12
    else if (zustandT3==2 && (PINC & (1<<PINC2))) {
13
        zustandT3 = 3;
14
    }
15
    else if (zustandT3==3 && (PINC & (1<<PINC2))) {
16
        zustandT3 = 0;
17
              Programmablauf = 1;        
18
    }
19
}          
20
//Monate
21
while(Programmablauf == 1){  
22
    //es passiert noch mehr    
23
    if (zustandT3==0 && !(PINC & (1<<PINC2))) {
24
        zustandT3 = 1;
25
    }
26
    else if (zustandT3==1 && !(PINC & (1<<PINC2))) {
27
        zustandT3 = 2;
28
    }
29
    else if (zustandT3==2 && (PINC & (1<<PINC2))) {
30
        zustandT3 = 3;
31
    }
32
    else if (zustandT3==3 && (PINC & (1<<PINC2))) {
33
        zustandT3 = 0;
34
              Programmablauf = 2;        
35
    }
36
}  
37
//Jahre
38
while(Programmablauf == 2){  
39
    //es passiert noch mehr
40
    if (zustandT3==0 && !(PINC & (1<<PINC2))) {
41
        zustandT3 = 1;
42
    }
43
    else if (zustandT3==1 && !(PINC & (1<<PINC2))) {
44
        zustandT3 = 2;
45
    }
46
    else if (zustandT3==2 && (PINC & (1<<PINC2))) {
47
        zustandT3 = 3;
48
    }
49
    else if (zustandT3==3 && (PINC & (1<<PINC2))) {
50
        zustandT3 = 0;
51
              Programmablauf = 3;        
52
    }
53
}

von Phil (Gast)


Lesenswert?

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?
1
int zustandT3 =0;
2
int  Programmablauf = 0;
3
//Tage
4
while(Programmablauf == 0){  
5
    //es passiert noch mehr    
6
    if (zustandT3==0 && !(PINC & (1<<PINC2))) {
7
        zustandT3 = 1;
8
    }
9
    else if (zustandT3==1 && !(PINC & (1<<PINC2))) {
10
        zustandT3 = 2;
11
    }
12
    else if (zustandT3==2 && (PINC & (1<<PINC2))) {
13
        zustandT3 = 3;
14
    }
15
    else if (zustandT3==3 && (PINC & (1<<PINC2))) {
16
        zustandT3 = 0;
17
              Programmablauf = 1;        
18
    }
19
}          
20
//Monate
21
while(Programmablauf == 1){  
22
    //es passiert noch mehr    
23
    if (zustandT3==0 && !(PINC & (1<<PINC2))) {
24
        zustandT3 = 1;
25
    }
26
    else if (zustandT3==1 && !(PINC & (1<<PINC2))) {
27
        zustandT3 = 2;
28
    }
29
    else if (zustandT3==2 && (PINC & (1<<PINC2))) {
30
        zustandT3 = 3;
31
    }
32
    else if (zustandT3==3 && (PINC & (1<<PINC2))) {
33
        zustandT3 = 0;
34
              Programmablauf = 2;        
35
    }
36
}  
37
//Jahre
38
while(Programmablauf == 2){  
39
    //es passiert noch mehr
40
    if (zustandT3==0 && !(PINC & (1<<PINC2))) {
41
        zustandT3 = 1;
42
    }
43
    else if (zustandT3==1 && !(PINC & (1<<PINC2))) {
44
        zustandT3 = 2;
45
    }
46
    else if (zustandT3==2 && (PINC & (1<<PINC2))) {
47
        zustandT3 = 3;
48
    }
49
    else if (zustandT3==3 && (PINC & (1<<PINC2))) {
50
        zustandT3 = 0;
51
              Programmablauf = 3;        
52
    }
53
}

von Rolf M. (rmagnus)


Lesenswert?

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?

von Phil (Gast)


Lesenswert?

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.

von Phil (Gast)


Lesenswert?

Hier Link zum Thema
Entprellung

von Phil (Gast)


Lesenswert?

Und nochmal Entschuldigung. Hab als zweiten Code den gleichen im 
Zwischenspeicher gehabt.
Es funktioniert nur wenn ich die Bedingung der Schleife folgendermaßen 
ändere.
1
while(Programmablauf != 1){  
2
...
3
}

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Rolf Magnus schrieb:

> Andere Frage: Wo ist die Entprellung?

Ich fürchte, das soll seine 'Entprellung' sein.

von Phil (Gast)


Angehängte Dateien:

Lesenswert?

Ist noch etwas unübersichtlich. Es handelt sich um die Funktion 
uhrzeit_stellen.

von Phil (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

>   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.

von Phil (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Phil (Gast)


Lesenswert?

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?

von Phil (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

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.