Problem mit while-Schleife und Timer Overflow (Endlos!?)

Gast #939421
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
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.