Hallo,
ich hab ein Problem, was ich nicht begreife: Ich schalte in einer ISR
eine Variable und benutze diese, um im Mainloop ein Display alle 100ms
zu updaten. Das Problem ist nur, das in der Mainloop die Funktion
zweimal ausgeführt wird, obwohl die Variable zurückgesetzt wird. Als
Controller verwende ich einen ATmega644 mit 16 MHz Der Code sieht wie
folgt aus:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 | #include "config.h"
|
4 | #include "uart-routines.h"
|
5 |
|
6 | volatile unsigned char disp_update;
|
7 | unsigned char display_updater;
|
8 |
|
9 | void timer_init( void )
|
10 | {
|
11 | setBits(TCCR0A, Bit(WGM01));
|
12 | setBits(TCCR0B, Bit(CS01) | Bit(CS00));
|
13 | OCR0A = (uint8_t)(XTAL / 64.0 * 1e-3 - 0.5);
|
14 | TIMSK0 |= 1<<OCIE0A;
|
15 | #define DISPUP 100L
|
16 | display_updater = (unsigned char)DISPUP;
|
17 | }
|
18 |
|
19 | int main (void)
|
20 | {
|
21 | usart_init(9600);
|
22 | timer_init();
|
23 | for(;;)
|
24 | {
|
25 | if(disp_update == 1)
|
26 | {
|
27 | //display_update(menu_count,disp_ebene);
|
28 | disp_update = 0;
|
29 | usart_puts("Display Update\n");
|
30 | }
|
31 | }
|
32 | return 0;
|
33 | }
|
34 |
|
35 | ISR( TIMER0_COMPA_vect)
|
36 | {
|
37 | if( --display_updater == 0)
|
38 | {
|
39 | disp_update = 1;
|
40 | display_updater = (unsigned char)DISPUP;
|
41 | }
|
42 | }
|
Dabei seh ich mittels des UART das die Ausgabe einmal wiederholt wird,
also zweimal erscheint. Woran liegt das?
Vielen Danke und mit freundlichen Grüßen
Peter