Liebe Kollegen,
habe einen Programmier-Fehler entdeckt, mit dem ich im Moment nicht
weiter komme. Im Timer-Interrupt inkrementiere ich (jede 100 ms) eine
Variable, die dann im Hauptprogramm abgefragt wird (counter >= 600), um
einmal pro Minute etwas durchführen zu können.
Wenn ich mir diesen Counter ausgeben lasse, enthält er fast immer genau
den Wert 600 aber ab und zu auch noch den Wert 512 und nur diesen.
Warum? Mit meinem Realtime-Clock (DS1339) habe ich herausgefunden, dass
diese If-Abfrage zu FRÜH kommt, also nach 51,2 Sekunden nach dem letzten
Durchlauf.
Diese Werte von 512 kommen unregelmässig, einmal sogar zwei
hintereinander, einmal ist der Abstand 7 Minuten, einmal 19 Minuten. Ich
sehe darin keine Regelmässigkeit.
Zu meinem Setup: ATMEGA1284P, IDE: Eclipse mit WinAVR, AVR-Studio4 mit
JTAGICEII zum Flashen.
Hier ein Auszug aus meinem Programm:
1 | volatile uint16_t one_hundred_ms_ticks_counter = 0;
|
2 | //gets incremented in timer1 compare match interrupt
|
3 |
|
4 | ISR(INT0_vect)
|
5 | { "ADC auslesen" }
|
6 |
|
7 | // Timer 1 interrupt
|
8 | ISR(TIMER1_COMPA_vect)
|
9 | {
|
10 | one_hundred_ms_ticks_counter++;
|
11 | }
|
12 |
|
13 | int main(){
|
14 | cli(); //global disable interrupts
|
15 | ....
|
16 | //start timer
|
17 | TCCR1B |= (1<<CS11) | (1<<CS10); // Pre-scaler for Timer1 set to 64 (p.136 data sheet)
|
18 | OCR1A=31249; TCCR1B |= (1<<WGM12); TIMSK1|= (1<<OCIE1A);}
|
19 | // CTC clear on compare match
|
20 | // with prescaler 64 and 31249
|
21 | // every 100 ms
|
22 |
|
23 | EIFR |= (1<<INTF0); // Delete INT0 flag in case it was set
|
24 | INT0_Enable(); // Interrupt 0 on rising edge at PD2
|
25 |
|
26 | sei(); //global enable interrupts
|
27 |
|
28 | while(1){
|
29 | ... tue etwas leichtes :-)
|
30 |
|
31 | if(one_hundred_ms_ticks_counter >= 600) //1 minute
|
32 | {
|
33 | USART_puts(getTimeStamp());
|
34 | USART_puts(itoa(one_hundred_ms_ticks_counter, buff, 10));USART_puts("\r\n"); //GIBT MANCHMAL 512 :-(
|
35 | one_hundred_ms_ticks_counter = 0;
|
36 | }
|
Und hier die Ausgabe am Terminal:
2012-04-10 11:50:47
one_hundred_ms_ticks_counter = 600.
2012-04-10 11:51:47
one_hundred_ms_ticks_counter = 600.
2012-04-10 11:52:47
one_hundred_ms_ticks_counter = 600.
2012-04-10 11:53:38
one_hundred_ms_ticks_counter = 512.
2012-04-10 11:54:38
one_hundred_ms_ticks_counter = 600.
Warum funktioniert die IF-Abfrage so komisch?
Vielen Dank für eure Tipps und Hilfe!
Karel