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 | }
|