Hi,
wieso blinkt ein einfacher Blinker (invertieren eines Ports mit Timer)
nicht gleichmäßig? Im Anhang ein Timing-Diagramm, die obere rote Kurve
ist das Soll-Timing, unten drunter (blau) das Ist-Timing. Wieso blinkts
dann nicht ordentlich. Der Code:
1 | #include <stdlib.h>
|
2 | #include <avr/io.h>
|
3 | #include <avr/interrupt.h>
|
4 |
|
5 | static volatile unsigned char bytecount;
|
6 | static volatile unsigned int waittime;
|
7 | static volatile unsigned char tcnt0; // Reload-Wert f. TCNT0 (Int.
|
8 | Timer 0 Overflow)
|
9 |
|
10 |
|
11 | void sleep(unsigned long wait)
|
12 | {
|
13 | // Timer 0, 8-Bit Initialisierung
|
14 | tcnt0 = 227;
|
15 | TCNT0 = tcnt0;
|
16 | waittime = wait;
|
17 | TCCR0B = (1<<CS02); // Timer 0, Prescaler = 256
|
18 | //TIFR0 = (1<<TOV0);
|
19 |
|
20 | do
|
21 | TIMSK0 = (1<<TOIE0); // Timer Overflow Interrupt Enable 0
|
22 | einschalten
|
23 | while(waittime > 0);
|
24 |
|
25 | TIMSK0 = 0;
|
26 | TCCR0B &= ~((1<<CS00) | (1<<CS01) | (1<<CS02)); // Timer Stop
|
27 | }
|
28 |
|
29 |
|
30 | int main(void)
|
31 | {
|
32 | DDRB = 0x07; // Port PB0, PB1, PB2 Output
|
33 | PORTB = 0xFF; // Port PB0, PB1 aus
|
34 |
|
35 | TIMSK0 &= ~(1<<TOIE0); // Timer Overflow Interrupt Enable 0
|
36 | ausschalten
|
37 |
|
38 | sei();
|
39 |
|
40 | while(1)
|
41 | {
|
42 | PORTB = ~PORTB;
|
43 | sleep(500);
|
44 | }
|
45 | return 0;
|
46 | }
|
47 |
|
48 |
|
49 | // Timer 0 Overflow
|
50 | ISR(SIG_OVERFLOW0)
|
51 | {
|
52 | waittime--;
|
53 | TCNT0 = tcnt0;
|
54 | }
|
Der Watchdog ist lt. Fuse-Bits aus.
- Hegy