Hallo,
auf einem ATMEGA32 in der ISR des TIMER1:
1 | volatile uint16_t pwm_cycle_counter;
|
2 | ISR(TIMER1_COMPA_vect)
|
3 | {
|
4 | static uint8_t pwm_cnt;
|
5 | ...
|
6 |
|
7 | if (pwm_cnt == 0)
|
8 | {
|
9 | pwm_cnt++;
|
10 | pwm_cycle_counter++;
|
11 | }
|
12 | else
|
13 | {
|
14 | ...
|
15 | if (pwm_cnt == pwm_cnt_max)
|
16 | {
|
17 | pwm_sync = 1; // Update jetzt möglich
|
18 | pwm_cnt = 0;
|
19 | }
|
20 | else pwm_cnt++;
|
21 | }
|
22 | }
|
und in der main
1 | main()
|
2 | {
|
3 | ...
|
4 |
|
5 | while(1)
|
6 | {
|
7 | // Zeit berechnen
|
8 | if( (pwm_cycle_counter - last_pwm) >= F_PWM )
|
9 | {
|
10 | uart_puts("Sekunde:");
|
11 | itoa((pwm_cycle_counter - last_pwm),rs232buf,10);
|
12 | uart_puts(rs232buf);
|
13 | uart_putc('\n');
|
14 | second_counter++;
|
15 | }
|
16 | ...
|
17 | }
|
18 | }
|
Nun passiert etwas, das ich mir nicht ganz erklären kann. Über UART wird
ein Wert ausgegeben, der kleiner F_PWM ist. Was aber eigentlich gar
nicht sein darf, da die Abfrage eine Zeile darüber ja genau das abprüft.
Zusätzlich wird pwm_cycle_counter nur inkrementiert, die Differenz kann
also gar nicht kleiner werden im Laufe der Zeit.
Weiß jemand was genau da schief läuft?
Eventuell kann etwas schief gehen wenn der Interrupt genau dann kommt
wenn ich auf die Größe zugreife?
Gruß
Daniel