www.mikrocontroller.net

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


Autor: Bimbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...


...
#define MAX_LAUFZEIT 5
#define FEUCHTEGRAD  230
#define WOCHENZEITBASIS 8

uint8_t eeFooByte EEMEM;
char pumpenlaufzeit=0;
uint32_t wochenlaufzeit=0;

int main(void)
{
  DDRB|=(1<<PB1)|(1<<PB2);  //Ausgänge: PB1=Pumpe, PB2=Feuchtesensor
  
  uint8_t zaehlwert=0;
  char Buffer[5];
   
  //Timmer Initailaisierung
  TIMSK|=(1<<TOIE1);        //Overflow Interrupt enable Timer1 (16Bit)
  
  lcd_init(LCD_DISP_ON);
  lcd_clrscr();
     
  TCCR0|=(1<<CS01);////*/(1<<CS00); //Prescaler Timer0 auf 8  
    
    

   sei();
   while(1)
   {
    while(pumpenlaufzeit<=MAX_LAUFZEIT)
    {
      TIFR|=(1<<TOV0);
      PORTB|=(1<<PB2);      //Messung sarten
      TCNT0=0;          //Timer zurücksetzen
      while(!(ACSR & (1<<ACO)));  //Warten bis Komperator = 1
      zaehlwert=TCNT0;      //Zahlwert ist Faktor der Feuchte
      lcd_gotoxy(0,0);
      if(TIFR & (1<<TOV0))
      {
        lcd_puts("Overflow");
        zaehlwert=255;
        //TIFR|=(1<<TOV0);
      }
      else
        lcd_puts("Messung ok");
    
      PORTB &=~(1<<PB2);      //Kondensator entladen
      eeprom_write_byte(&eeFooByte, zaehlwert);
        itoa( zaehlwert, Buffer, 10);
      lcd_gotoxy(0,1);
      lcd_puts(Buffer);
    
      if(zaehlwert<=FEUCHTEGRAD)// && !(TIFR & (1<<TOV0)))
      {
        lcd_puts(" Pumpe an");
        PORTB |=(1<<PB1);
        TCCR1B|=(1<<CS12)|(1<<CS10);
      }
      else
      {
        PORTB &=~(1<<PB1);
        lcd_puts(" Pumpe aus");
        //TCCR1B &=~((1<<CS12)|(1<<CS00));
        pumpenlaufzeit=0;
      }  
      for(uint8_t i=0; i<=50; i++)
        _delay_ms(100);
      lcd_clrscr();
      lcd_gotoxy(0,0);
    
    }
  PORTB=~PORTB;    //Pumpe aus
  lcd_clrscr();
  lcd_gotoxy(0,0);
  lcd_puts("Dosis erreicht");
  lcd_gotoxy(0,1);
  lcd_puts("Pumpe aus");
  
  while(wochenlaufzeit<=WOCHENZEITBASIS); //<---- Problem, kommt nicht mehr aus der Warteschleife raus!

  TCCR1B &=~((1<<CS12)|(1<<CS00));
  TCNT1=0;
  pumpenlaufzeit=0;
  wochenlaufzeit=0;

    }
  return 0;
}

ISR(TIMER1_OVF_vect)
{
  ++pumpenlaufzeit;
  ++wochenlaufzeit;

}

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Bimbi (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.