Forum: Compiler & IDEs Problem mit while-Schleife und Timer Overflow (Endlos!?)


von Bimbi (Gast)


Lesenswert?

Hallo,
ich habe ein komisches Problem. Wenn die Bedingung in der inneren 
While-Schleife nicht mehr erfüllt ist, sollte das Programm weiter in der 
äußeren While-Schleife weitermachen. Dies funktioniert auch, nur hängt 
das Programm vermutlich unendlich in der Warteschleife (siehe Makierung 
im Code)! Obwohl ich nur eine gewisse Zeit dort warten will und dann 
wieder in die innere Schleife springen will. Das Warten realisiere ich 
mit dem TimerOverflow Interrupt, der mir die Variablen hochzählt. Aber 
irgendwie scheint es als ob der Interrupt sich in der Warteschleife 
abschaltet. ???
Ich bin irgendwie ratlos...


1
...
2
#define MAX_LAUFZEIT 5
3
#define FEUCHTEGRAD  230
4
#define WOCHENZEITBASIS 8
5
6
uint8_t eeFooByte EEMEM;
7
char pumpenlaufzeit=0;
8
uint32_t wochenlaufzeit=0;
9
10
int main(void)
11
{
12
  DDRB|=(1<<PB1)|(1<<PB2);  //Ausgänge: PB1=Pumpe, PB2=Feuchtesensor
13
  
14
  uint8_t zaehlwert=0;
15
  char Buffer[5];
16
   
17
  //Timmer Initailaisierung
18
  TIMSK|=(1<<TOIE1);        //Overflow Interrupt enable Timer1 (16Bit)
19
  
20
  lcd_init(LCD_DISP_ON);
21
  lcd_clrscr();
22
     
23
  TCCR0|=(1<<CS01);////*/(1<<CS00); //Prescaler Timer0 auf 8  
24
    
25
    
26
27
   sei();
28
   while(1)
29
   {
30
    while(pumpenlaufzeit<=MAX_LAUFZEIT)
31
    {
32
      TIFR|=(1<<TOV0);
33
      PORTB|=(1<<PB2);      //Messung sarten
34
      TCNT0=0;          //Timer zurücksetzen
35
      while(!(ACSR & (1<<ACO)));  //Warten bis Komperator = 1
36
      zaehlwert=TCNT0;      //Zahlwert ist Faktor der Feuchte
37
      lcd_gotoxy(0,0);
38
      if(TIFR & (1<<TOV0))
39
      {
40
        lcd_puts("Overflow");
41
        zaehlwert=255;
42
        //TIFR|=(1<<TOV0);
43
      }
44
      else
45
        lcd_puts("Messung ok");
46
    
47
      PORTB &=~(1<<PB2);      //Kondensator entladen
48
      eeprom_write_byte(&eeFooByte, zaehlwert);
49
        itoa( zaehlwert, Buffer, 10);
50
      lcd_gotoxy(0,1);
51
      lcd_puts(Buffer);
52
    
53
      if(zaehlwert<=FEUCHTEGRAD)// && !(TIFR & (1<<TOV0)))
54
      {
55
        lcd_puts(" Pumpe an");
56
        PORTB |=(1<<PB1);
57
        TCCR1B|=(1<<CS12)|(1<<CS10);
58
      }
59
      else
60
      {
61
        PORTB &=~(1<<PB1);
62
        lcd_puts(" Pumpe aus");
63
        //TCCR1B &=~((1<<CS12)|(1<<CS00));
64
        pumpenlaufzeit=0;
65
      }  
66
      for(uint8_t i=0; i<=50; i++)
67
        _delay_ms(100);
68
      lcd_clrscr();
69
      lcd_gotoxy(0,0);
70
    
71
    }
72
  PORTB=~PORTB;    //Pumpe aus
73
  lcd_clrscr();
74
  lcd_gotoxy(0,0);
75
  lcd_puts("Dosis erreicht");
76
  lcd_gotoxy(0,1);
77
  lcd_puts("Pumpe aus");
78
  
79
  while(wochenlaufzeit<=WOCHENZEITBASIS); //<---- Problem, kommt nicht mehr aus der Warteschleife raus!
80
81
  TCCR1B &=~((1<<CS12)|(1<<CS00));
82
  TCNT1=0;
83
  pumpenlaufzeit=0;
84
  wochenlaufzeit=0;
85
86
    }
87
  return 0;
88
}
89
90
ISR(TIMER1_OVF_vect)
91
{
92
  ++pumpenlaufzeit;
93
  ++wochenlaufzeit;
94
95
}

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?


von Johann L. (gjlayde) Benutzerseite


Lesenswert?


von Bimbi (Gast)


Lesenswert?

Super Danke für den Tipp! :D Oh man da wäre ich echt nicht drauf 
gekommen.

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.