Mein if Anweisung geht nicht

Gast #1182730
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
}
#1182739
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.
Gast #1182788
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
}
Gast #1182799
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.
Gast #1182813
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.
Gast #1182815
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.
Gast #1182821
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren