Forum: Mikrocontroller und Digitale Elektronik Mein if Anweisung geht nicht


von Anfänger (Gast)


Lesenswert?

Hallo ich bin am verzweifeln das Programm macht nicht das was es soll.
Ich möchte das es die If Anweisungen aufruft (if 1-4 ) obwohl ich 
izeile1 auf 1 setze tut sich nichts?

1
int main(void)
2
{
3
DDRC = 0x00;  //c1=1 c2=2 c3=3 c4=4 c5=5 c6=6 c7=7 d0=8 d1=9 d2=0 d3=up d4=down d5=left d6=right c0=return d7=enter
4
DDRD = 0x00;
5
6
7
8
lcd_init();
9
izeile1 = 1;
10
izeile2 = 2;
11
izeile3 = 3;
12
izeile4 = 4;
13
while(1){
14
hauptmenu();
15
}
16
return 0;
17
}
18
19
20
int hauptmenu(void)
21
  
22
    if    (PIND == ((0b00001000)&(0b00001000))){    // up
23
    while(PIND == ((0b00001000)&(0b00001000))){} 
24
    //if (!(izeile1==-2)){
25
                izeile1 = izeile1 -1;
26
    izeile2 = izeile2 -1;
27
    izeile3 = izeile3 -1;
28
    izeile4 = izeile4 -1;
29
    }//}
30
31
    if    (PIND == ((0b00010000)&(0b00010000))){     // down
32
    while(PIND == ((0b00010000)&(0b00010000))){} 
33
    //if (!(izeile3==4)){
34
                izeile1 = izeile1 +1;
35
    izeile2 = izeile2 +1;
36
    izeile3 = izeile3 +1;
37
    izeile4 = izeile4 +1;
38
    }//}
39
40
41
  
42
    
43
    
44
45
46
lcd_clear();
47
//set_cursor(0,2);
48
//lcd_string(">");
49
50
if (izeile1 == 1||izeile1 == 2||izeile1 == 3){  // If 1
51
set_cursor(1,izeile1);
52
lcd_string("1 SETUP");
53
//izeichen=izeichen+1;
54
}
55
56
if (izeile1 == 1||izeile1 == 2||izeile1 == 3){  // If 2
57
set_cursor(1,izeile2);
58
lcd_string("2 STARTEN");
59
//izeichen=izeichen+1;
60
}
61
62
if (izeile1 == 1||izeile1== 2||izeile1 == 3){   // If 3
63
set_cursor(1,izeile3);
64
lcd_string("3 SILO");
65
//izeichen=izeichen+1;
66
}
67
68
if (izeile1 == 1||izeile1 == 2||izeile1 == 3){  // If 4
69
set_cursor(1,izeile4);
70
lcd_string("4 STATUS");
71
//izeichen=izeichen+1;
72
}
73
74
75
76
77
//set_cursor(1,4);
78
//lcd_string("ANLAGE AUS");
79
uebergabe();
80
_delay_ms(200);
81
82
return 0;
83
}

von Johannes M. (johnny-m)


Lesenswert?

1
    0b00001000
2
 &  0b00001000
3
 -------------
4
 =  0b00001000
Das & ist an der Stelle absolut überflüssig, weil es nichts macht. Ich 
vermute fast, Du hast das mit der Bitzustandsabfrage nicht ganz 
verstanden. Ich kann mir nämlich nicht vorstellen, dass Du garantieren 
kannst, dass PIND jemals wirklich exakt gleich 0b00001000 oder 
ob00010000 wird.

Schau Dir mal den Artikel Bitmanipulation an. Da steht, wie es 
richtig geht!

Allerdings ist es verdammt schwer, wirklich sinnvoll zu helfen, wenn Du 
sagst "Das Programm macht nicht, was es soll", aber nicht erzählst, 
was es denn machen soll. Außerdem ist der Code oben absolut 
unzureichend kommentiert, was es für dritte sehr schwer macht, 
nachzuvollziehen, was da passiert.

von holger (Gast)


Lesenswert?

Gewöhn dir mal eine anständige Klammersetzung
und einrücken von Code an. Den Scheiss da oben
überblickt doch kein Schwein.

Beispiel:

while(1){
hauptmenu();
}


while(1)
 {
  hauptmenu();
 }

von Anfänger (Gast)


Lesenswert?

Sorry es geht um if 1-4 und nicht up und down oder was meinst du

von Peter (Gast)


Lesenswert?

kann es sein das durch

izeile1 = izeile1 -1;

izeile1 = 0 ist?


Aber die code ist wirklich unübersichtlich, wo geht überhaupt die 
klammer { für die funktion int hauptmenu(void) auf?

von Johannes M. (johnny-m)


Lesenswert?

Anfänger wrote:
> Sorry es geht um if 1-4 und nicht up und down oder was meinst du
Noch mal: Solange hier keiner außer Dir weiß, was das Programm machen 
soll und was es konkret nicht macht, kann Dir auch keiner wirklich 
helfen.

"Funktioniert nicht" ist keine Fehlerbeschreibung.

von 1.8T-Passat (Gast)


Lesenswert?

Ich sehe da ein Problem:

Es sind 4 If- Abfragen. Aber alle fragen das selbe ab. Gewollt??

von Tom (Gast)


Lesenswert?

Hallo,

wie schauen die Funktionen
lcd_string
und
set_cursor
aus?

Wenn nichts passiert kann das auch an diesen Funktionen liegen.

Grüße

von Anfänger (Gast)


Lesenswert?

@ Peter

Aber doch nur wenn ich den Taster betätige aber izeile ist doch auf 1 
gesetzt

von Anfänger (Gast)


Lesenswert?

1.8T-Passat

ja das soll so, dass ist ein menu auf eim LCD

von Peter (Gast)


Lesenswert?

Woher sollen wir wissen wie deine Taster sein, können ja auch invertiert 
sein.

Schreibe mal das izeile1 = 1; direkt über die IF anweisung die deiner 
meinung nach nicht geht.

von Anfänger (Gast)


Lesenswert?

@ Tom

das sind Funktionen von LCD.

von Anfänger (Gast)


Lesenswert?

ich habe izeile1 = 1; über die Anweisung geschrieben dann geht es aber 
wenn ich es weg mache geht es nicht mehr.

von Peter (Gast)


Lesenswert?

dann geht doch mal logisch ran und kommentiere alle stellen aus die 
izeile1 verändern (auser die zuweisung auf 1).

von Anfänger (Gast)


Lesenswert?

nur die Taster und an denen machen ich doch nichts

von Anfänger (Gast)


Lesenswert?

ich habe mir auch die Variabel izeile1 auch schon anzeigen lassen und 
sie ist 1 aber die if Anweisung geht nicht.

von Peter (Gast)


Lesenswert?

sie kann aber nicht 1 sein, sonst würde es ja gehen, wenn du sie vorher 
auf 1 setzt und es geht muss sie jemand verändern.

mache es einfach und kommentiere die stellen mal aus!

von Anfänger (Gast)


Lesenswert?

ich habe up und down komplett auskommentiere und ich komme nicht in die 
if

von Anfänger (Gast)


Lesenswert?

1
#include <util/delay.h>
2
#include <avr/io.h>
3
#include "lcd.h"
4
// Prototypen
5
int hauptmenu(void);
6
int uebergabe(void);
7
8
// globale Variablen 
9
int izeile1;  // zeilen gehen von 1-4 
10
int izeile2;
11
int izeile3;
12
int izeile4;
13
int izeichen; // zeichen gehen von 0-15
14
15
// main
16
17
int main(void)
18
{
19
DDRC = 0x00;  //c1=1 c2=2 c3=3 c4=4 c5=5 c6=6 c7=7 d0=8 d1=9 d2=0 d3=up d4=down d5=left d6=right c0=return d7=enter
20
DDRD = 0x00;
21
22
23
24
lcd_init();
25
izeile1 = 1;
26
izeile2 = 2;
27
izeile3 = 3;
28
izeile4 = 4;
29
while(1)
30
{
31
  hauptmenu();
32
}
33
return 0;
34
}
35
36
37
38
39
40
41
42
43
44
45
int hauptmenu(void)
46
{  /**
47
    if    (PIND == ((0b00001000)&(0b00001000))){    // up
48
    while(PIND == ((0b00001000)&(0b00001000))){} 
49
    //if (!(izeile1==-2)){
50
        //izeile1 = izeile1 -1;
51
    //izeile2 = izeile2 -1;
52
    //izeile3 = izeile3 -1;
53
    //izeile4 = izeile4 -1;
54
    }//}
55
56
    if    (PIND == ((0b00010000)&(0b00010000))){     // down
57
    while(PIND == ((0b00010000)&(0b00010000))){} 
58
    //if (!(izeile3==4)){
59
        //izeile1 = izeile1 +1;
60
    //izeile2 = izeile2 +1;
61
    //izeile3 = izeile3 +1;
62
    //izeile4 = izeile4 +1;
63
    }//}
64
65
**/
66
  
67
    
68
    
69
70
71
lcd_clear();
72
//set_cursor(0,2);
73
//lcd_string(">");
74
75
if (izeile1 == 1||izeile1 == 2||izeile1 == 3){
76
set_cursor(1,izeile1);
77
lcd_string("1 SETUP");
78
//izeichen=izeichen+1;
79
}
80
81
if (izeile1 == 1||izeile1 == 2||izeile1 == 3){
82
set_cursor(1,izeile2);
83
lcd_string("2 STARTEN");
84
//izeichen=izeichen+1;
85
}
86
87
if (izeile1 == 1||izeile1== 2||izeile1 == 3){
88
set_cursor(1,izeile3);
89
lcd_string("3 SILO");
90
//izeichen=izeichen+1;
91
}
92
93
if (izeile1 == 1||izeile1 == 2||izeile1 == 3){
94
set_cursor(1,izeile4);
95
lcd_string("4 STATUS");
96
//izeichen=izeichen+1;
97
}
98
99
100
101
102
//set_cursor(1,4);
103
//lcd_string("ANLAGE AUS");
104
uebergabe();
105
_delay_ms(200);
106
107
return 0;
108
}

von Peter (Gast)


Lesenswert?

dann solltest du uns vielleicht erstmal den kompletten code zur 
verfügung stellen, denn izeile1 hat überhaupt kein Datentyp.

Und ich bezweifele das der code von oben überhaupt compiliert.

von Anfänger (Gast)


Lesenswert?

doch das tut er

von Tom (Gast)


Lesenswert?

Naja also ich persönlich habe meine LCD-Funktionen selber 
geschrieben..deswegen hab ich gefragt.

Stell einfach mal deinen kompletten Source-Code als c-File bzw als 
Zip-File hier rein.

Grüße

von Peter (Gast)


Lesenswert?

ja der code ja, ist ja auch etwas mehr als oben.

Was macht übergabe? kann sein das er die izeile1 ändert?

wenn du izeile1=1 über die if einweisung schreibst geht es, also kann ja 
izeile1 nicht 1 sein.

von Tom (Gast)


Lesenswert?

Tut er nicht weil nach int hauptmenu(void) keine "{" kommt...

von Anfänger (Gast)


Lesenswert?

übergabe habe ich grade ausgeklammert und bringt nichts

von Anfänger (Gast)


Lesenswert?

>Tut er nicht weil nach int hauptmenu(void) keine "{" kommt...

ich bekomme aber kein error und am ende ist }

von Tom (Gast)


Lesenswert?

Ahso, sorry, hab den 2ten Code übersehen, den du eingefügt hast.

von Peter (Gast)


Lesenswert?

Teste bitte noch mal ob es mit izeile1=1 über den IF immer noch geht. 
Denn jetzt denn sonst kann ich keinen Fehler mehr finden - und das 
verhalten ist nicht erklärbar.

Lade es mal in den Simulator und gehe schrittweise durch.

von Tom (Gast)


Lesenswert?

Angezeigt werden kann gar nix, da jedesmal nach erneutem Ausführen der 
Funktion Hauptmenü lcd_clear ausgeführt wird...ich nehme an das löscht 
den Displayinhalt.
Des weiteren wird das LCD alle 200 ms überschrieben.

von Tom (Gast)


Lesenswert?

Na gut angezeigt müsste schon was werden, aber wahrscheinlich flackerts.

von Anfänger (Gast)


Lesenswert?

>Angezeigt werden kann gar nix, da jedesmal nach erneutem Ausführen der
>Funktion Hauptmenü lcd_clear ausgeführt wird...ich nehme an das löscht
>den Displayinhalt.
>Des weiteren wird das LCD alle 200 ms überschrieben.

das ist alles richtig denn wenn ich izeile1 =1; über if1 einfüge bekomme 
ich eine Anzeige

von Tom (Gast)


Lesenswert?

Hallo,

na dann passts ja. :)
Viel Erfolg noch.

Grüße

von Anfänger (Gast)


Lesenswert?

danke an alle!

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.