Ich möchte für mein STK500 mit ATmega128 ein Programm schreiben das die
Led´s im Sekundentakt aufblinken lassen soll, sprich:
0s led´s aus
0,5s led´s an
1s led´s aus
1,5s led´s an
usw.
Dafür hab ich mir unter anderem die GCC Tutorials durchgelesen ( das
Allgemeine, das für Timer und das für die "genaue Sekunde")
und dabei ist folgender Code rausgekommen:
1 | #include <avr/io.h>
|
2 | #include <stdlib.h>
|
3 | #include <stdio.h>
|
4 | #include <avr/interrupt.h>
|
5 |
|
6 |
|
7 | //##########################################
|
8 | // Funktionen ###
|
9 | //##########################################
|
10 |
|
11 | //########TIMER0INT#########################
|
12 |
|
13 |
|
14 | void timer0 (void)
|
15 | {
|
16 |
|
17 | TCNT1 = 0x0000; //Startwert 0 setzen
|
18 | OCR1A = 31249; //Vergleichsregister auf 31249
|
19 | TIMSK = (1<<OCIE1A); //Enable Output Compare Interrupt
|
20 | sei(); //Enable Global Interrupt
|
21 |
|
22 | TCCR1A = 0x00;
|
23 | TCCR1B = (1<<CS12); // Prescaler 256
|
24 | }
|
25 |
|
26 |
|
27 | //##########################################
|
28 | // Variablen ###
|
29 | //##########################################
|
30 |
|
31 | unsigned char x=0;
|
32 |
|
33 |
|
34 | //#####MAIN#################################
|
35 |
|
36 | main()
|
37 | {
|
38 | timer0();
|
39 | DDRB = 0xFF;
|
40 | while(1)
|
41 | {
|
42 | if(x == 1)
|
43 | PORTB = 0xFF;
|
44 | else
|
45 | PORTB = 0x00;
|
46 | }
|
47 | }
|
48 |
|
49 | //##########################################
|
50 | // Interrupts ###
|
51 | //##########################################
|
52 |
|
53 | //####COMPAREA##############################
|
54 |
|
55 | ISR(TIMER1_COMPA_vect)
|
56 | {
|
57 | if(x == 0)
|
58 | x = 1;
|
59 | else
|
60 | x = 0;
|
61 | }
|
er funktioniert soweit auch, das die Led´s alle 2 sekunden blinken
(0 = LED´s aus, 1 = LED´s an, 2 = LED´s aus usw.)
ich hab die Rechnung aus dem "Die genaue Sekunde" Tutorial genommen und
bin damit auf diesen Wert (31249 bei 8Mhz ) gekommen.
Leider verstehe ich die Rechnung nicht ganz und weiß nicht was ich
ändern muss um das Intervall zu halbieren.
Würde mich freuen wenn ihr mir helfen könntet.
Mfg Niklas