Hallo, ich nochmal.
Habe nun meinen Timer auf der Hardware getestet und nichts geht.
timer.h
1 | #ifndef _TIMER_H_
|
2 | #define _TIMER_H_
|
3 |
|
4 |
|
5 | #include <inttypes.h>
|
6 |
|
7 |
|
8 |
|
9 | extern volatile uint8_t ms0;
|
10 |
|
11 |
|
12 |
|
13 | void init_timer0(void);
|
14 |
|
15 | void start_timer0(void);
|
16 |
|
17 | void stop_timer0(void);
|
18 |
|
19 |
|
20 | #endif // _TIMER_H_
|
timer.c
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | #include "timer.h"
|
5 |
|
6 | volatile uint8_t ms0 = 0;
|
7 |
|
8 |
|
9 | void init_timer0(void)
|
10 | {
|
11 | TCCR0 = (1 << WGM01);
|
12 |
|
13 | OCR0 = 250;
|
14 |
|
15 | TIMSK |= (1 << OCIE0);
|
16 |
|
17 |
|
18 | }
|
19 |
|
20 | void start_timer0(void)
|
21 | {
|
22 | TCCR0 |= (1 << CS01) | (1 << CS00);
|
23 | }
|
24 |
|
25 | void stop_timer0(void)
|
26 | {
|
27 | TCCR0 &= ~((1 << CS01) | (1 << CS00));
|
28 | }
|
29 |
|
30 |
|
31 | ISR(TIMER0_COMP_vect)
|
32 | {
|
33 | if(ms0 < 0xFF) {
|
34 | ++ms0;
|
35 | }
|
36 | }
|
main.c
1 | #ifndef F_CPU
|
2 | #define F_CPU 16000000UL
|
3 | #endif // F_CPU
|
4 |
|
5 |
|
6 | #include <avr/interrupt.h>
|
7 | #include <avr/io.h>
|
8 | #include <util/delay.h>
|
9 |
|
10 | #include "timer.h"
|
11 |
|
12 |
|
13 | int main(void)
|
14 | {
|
15 | DDRB |= (1 << DDB0);
|
16 |
|
17 | PORTB |= (1 << PB0);
|
18 |
|
19 | _delay_ms(1000);
|
20 |
|
21 | PORTB &= ~(1 << PB0);
|
22 |
|
23 | init_timer0();
|
24 | sei();
|
25 | start_timer0();
|
26 |
|
27 | while(1)
|
28 | {
|
29 | if(ms0 >= 1000)
|
30 | {
|
31 | PORTB ^= (1 << PB0);
|
32 | ms0 = 0;
|
33 | }
|
34 | }
|
35 | }
|
Anscheinend funktioniert das mit der globalen volatile Variable in der
timer.h nicht. Habe allerdings auch keine wirklichen C Erfahrungen, also
bin mir auch nicht sicher ob das wirklich so geht.
Das IF scheint irgendwie wegoptimiert zu werden.
.lss
1 | init_timer0();
|
2 | aa: 0e 94 2f 08 call 0x105e ; 0x105e <init_timer0>
|
3 | sei();
|
4 | ae: 78 94 sei
|
5 | start_timer0();
|
6 | b0: 0e 94 37 08 call 0x106e ; 0x106e <start_timer0>
|
7 |
|
8 | while(1)
|
9 | {
|
10 | if(ms0 >= 1000)
|
11 | b4: 80 91 dc 01 lds r24, 0x01DC
|
12 | b8: fd cf rjmp .-6 ; 0xb4 <main+0x22>
|
Habe ich bei der globalen Variable und/oder beim Timer ansich etwas
falsch gemacht? Ich denke schon, nur was?
An Port B0 hängt eine LED, die eigentlich jede Sekunden umschalten
sollte.