Hallo zusammen.
Ich versuche derzeit, eine Routine zu schreiben, die LEDs an Port B
meines Atmega8 eine Minute jeweils ein- und eine Minute ausschaltet.
Leider funktioniert das Ganze aber noch nicht so wie es soll.
Da ich Timer0 für eine andere Funktion verwenden möchte, habe ich Timer2
(8-bit) dafür hergenommen.
Könntet ihr mal einen Blick auf meinen Code werfen?
1 | /***********************
|
2 | Controller: ATmega8
|
3 | ***********************/
|
4 |
|
5 |
|
6 | #include <avr/io.h>
|
7 | #include <avr/interrupt.h>
|
8 |
|
9 | #define F_CPU 8000000 // F_CPU = 8 MHz
|
10 |
|
11 | volatile unsigned char counter = 0;
|
12 | volatile unsigned char minute_vergangen = 0;
|
13 |
|
14 |
|
15 | void init_minute_timer(void)
|
16 | {
|
17 | TCCR0 |= (1 << CS02) | (1 << CS00); // Prescaler auf 1024tel setzen
|
18 | TIMSK |= (1 << TOIE2); // Overflow-Interrupt enablen
|
19 | sei();
|
20 | }
|
21 |
|
22 |
|
23 |
|
24 | ISR (TIMER2_OVF_vect)
|
25 | {
|
26 | // (8000000/1024)/256 Hz = 30,51 Hz => 32,776 ms
|
27 | counter++;
|
28 | if(counter == 30) // 1000ms / 32,766 = 30,51
|
29 | {
|
30 | minute_vergangen = 1;
|
31 | counter = 0;
|
32 | }
|
33 | }
|
34 |
|
35 | int wait_minute(void)
|
36 | {
|
37 | minute_vergangen = 0;
|
38 | while(minute_vergangen != 1);
|
39 | return 1;
|
40 | }
|
41 |
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 | void main (void)
|
48 | {
|
49 | DDRB = 0xFF; // Port-Pins als Ausgang schalten
|
50 | init_minute_timer();
|
51 |
|
52 | while(1)
|
53 | {
|
54 | PORTB = 0xFF;
|
55 | wait_minute();
|
56 | PORTB = 0;
|
57 | wait_minute();
|
58 | }
|
59 |
|
60 | return;
|
61 | }
|
Vielen Dank und Gruß
Johannes