Forum: Compiler & IDEs Probleme bei Initialisierung und while Schleife


von Sascha S. (sands)


Angehängte Dateien:

Lesenswert?

Hallo liebe Forengemeinde,

habe ein Problem, welches sich wie folgt darstellt:
Bei der Initialisierungsroutine geschehen Dinge die ich echt nicht 
nachvollziehen kann.
Dort werden Variablen gesetzt die ich vorher mit dem Wert 0 deklariert 
habe. Dadurch wird meine while Schleife quasi garnicht mehr beachtet.

Hier kurz der mainloop:
1
main()
2
{
3
    Init();
4
  t=0;
5
  z=0;
6
  y=0;
7
    code[0]=5;          // Code Stelle 1
8
  code[1]=8;          // Code Stelle 2
9
  code[2]=3;          // Code Stelle 3
10
  code[3]=4;          // Code Stelle 4
11
12
  
13
  
14
    while (1)
15
    {  
16
  
17
      while( t==0 && z==0);  // Wiederhole für 4 Durchläufe
18
    {
19
      Tastenlesen();            // Unterprogramm Tasteneinlesen
20
      if(value>0)
21
        {
22
        Fall();
23
                        // Unterprogramm Fallunterscheidung
24
        if (code[i] == code1[i])    // Feldvariablen der Arrays gleich?
25
        {
26
          if(i==0)
27
          {
28
          zahl1ok=1;
29
          x++;
30
          }
31
          if(i==1)
32
          {
33
          zahl2ok=1;
34
          x++;
35
          }
36
        
37
          
38
          if(zahl1ok==1 && zahl2ok==1)
39
          {
40
            PORTB=0x02;      //PB1
41
            z=1;
42
            x=0;
43
          }
44
          i++;
45
        }
46
        else              //wenn nicht
47
        {
48
        x++;
49
        }                // Erhöhe Alarmvariable um 1
50
          
51
          if(x>=2)
52
          {
53
            y++;
54
            PORTB=0x01;
55
            _delay_ms(1000);
56
            PORTB=0x00;      
57
            i=0;
58
            x=0;
59
          }
60
          if (y>=3)        // Alarmvariable kleine als 3?
61
          {
62
            test();
63
            t=1;
64
          }
65
        value=0;
66
      }
67
          
68
    }
69
    
70
    
71
  }
72
  
73
}

im Anhang befindet sich der kompltte Code.

Wäre echt nett, wenn mir jemand helfen könnte und mir sagt wo ich den 
Bock geschossen habe. Sitze da jetzt echt schon fast den halben Tag dran 
rum und sehe den Fehler einfach nicht.

Danke.

von Stefan E. (sternst)


Lesenswert?

Sascha S. schrieb:
> Dadurch wird meine while Schleife quasi garnicht mehr beachtet.

Wegen eines überzähligen und äußerst schlecht platzierten Semikolons.

von user (Gast)


Lesenswert?

genau hier:
while( t==0 && z==0);
ändern in
while( t==0 && z==0)

von Sascha S. (sands)


Lesenswert?

Danke habe ich echt nicht bemerkt. Habe da jetzt Stunden vor gesessen 
und nicht gesehen.
Echt nochmal Danke!!!!

von Karl H. (kbuchegg)


Lesenswert?

1
void Tastenlesen()
2
{
3
  
4
    wert1=messen(PC0);      //PC0 messen
5
    _delay_us(80);        //Warte
6
    wert=messen(PC0);      //PC0 messen
7
8
    if ((wert1-wert) < 20)    //Wertevergleich der eingelesenen Werte
9
    {
10
      if (wert1 > 0x07)       //Entprelle Taste andrücken
11
      {    
12
        _delay_us(100);
13
      }
14
      if((wert1 >=0x07) && (wert1 <0x12))    //Wertevergleich Taste 1
15
      {
16
        value = 1;
17
        if (wert1 <=0x07)        //Entprelle Taste loslassen
18
        {
19
          _delay_ms(100);
20
        }
21
22
      }
23
24
      if((wert1 >=0x12) && (wert1 <0x1C))    //Wertevergleich Taste 2
25
      {
26
...

Schreib doch deine Grenzwert-Zahlen mal in dezimaler Form auf. Das sieht 
das so aus, als ob das eine ganz einfache Reihe wäre. Sprich: Den 
'value' kann man aus dem 'wert1' durch eine einfache Formel berechnen. 
Und schon fallen wieder 4 Bildschirmseiten Code weg.

von Karl H. (kbuchegg)


Lesenswert?

Selbiges hier
1
void Fall()
2
{
3
  switch (value)
4
  {
5
    case 3:
6
      code1[i] = 1;
7
    break;
8
    case 2:
9
      code1[i] = 2;
10
    break;
11
...

das kann man alles viel kürzer schreiben.
In einem Array hältst du dir die Ergebnisse, mit 'value' indizierst du 
in dein Array und kriegst direkt den Wert für code1
1
void Fall()
2
{
3
                         //  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 
4
  static uint8_t Codes[] = { 0, 3, 2, 1, 6, 5, 4, 9, 8, 7, 12, 11, 10 };
5
6
  code1[i] = Codes[value];
7
}

und wieder eine Bildschirmseite Code weniger.

DU musst dir deinen Code übersichtlich machen. Wenn DU es nicht tust, 
tut es keiner für dich.

von Klaus (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> DU musst dir deinen Code übersichtlich machen. Wenn DU es nicht tust,
> tut es keiner für dich.

Doch. Du. ;-)

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.