Hi.
Ich bin mir gerade nicht ganz sicher ob meine Rechnung stimmt.
Ich will die blinkfrequenz meiner LEDs berechnen, welche ich mit einem
Timer blinken lasse.
Als Quarz haben ich 4MHz, einen Teilungsfaktor von 1024 und meinen
Timer lasse ich ein Ereigniss alle 60 durchläufe also Outputcompare =
60 auslösen.
Das heisst ich hab folgende Rechnung :
4000000 1014 60 / 2 = 32Hz
Das komische ist das ich es noch gaaanz leicht flackern sehe also kann
da irgendwas nicht stimmen.
(die zwei weil ich ja bei einem Vorgang auschalte und beim nächsten
wieder ein)
Hier mein C Code:
(ATMEGA8515)
1 | #include <avr/io.h>
|
2 | #include <stdint.h>
|
3 |
|
4 | #include <avr/signal.h>
|
5 | #include <avr/interrupt.h>
|
6 |
|
7 |
|
8 | uint8_t blub;
|
9 |
|
10 |
|
11 | SIGNAL (SIG_OUTPUT_COMPARE0)
|
12 | {
|
13 |
|
14 | //Ereigniss
|
15 |
|
16 | //blub++;
|
17 | //if (blub >= 8)
|
18 | // blub = 0;
|
19 |
|
20 | //PORTB = ~(1 << blub);
|
21 | PORTB = ~PORTB;
|
22 | }
|
23 |
|
24 |
|
25 |
|
26 | int main(void)
|
27 | {
|
28 |
|
29 | DDRB = 0xFF;
|
30 | PORTB = 0xFF;
|
31 |
|
32 | //TIMER
|
33 | TCCR0 = 0b00000101; //Prescaler definieren
|
34 | TCCR0 |= (1 << WGM01); //Output Compare einschalten (CTC-Modus)
|
35 | OCR0 = 60; //Wenn Timer bis 50 gezählt hat dann Ereigniss auslösen
|
36 | und clearen
|
37 |
|
38 | TIMSK = (1 << OCIE0); //Output compare interrupt aktivieren
|
39 | sei(); //Global interrupts on
|
40 |
|
41 |
|
42 | while(1);
|
43 | }
|