Fang erst mal damit an, deinen Code einzurücken!
Dazu musst du:
dich mit dir selbst auf ein Schema einigen, wie genau du die { } setzen
willst.
Sagen wir mal: die { kommt immer in die nächste Zeile und steht alleine.
Nach der { wird der Code der innerhalb des Blocks steht um 2 Leerzeichen
eingerückt. Die Einrückung wird erst durch das } wieder aufgehoben,
wobei die } in derselben Spalte steht, in der auch die { stand
Dann sieht dein Code so aus:
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | void init ()
|
5 | {
|
6 | //Led auf PORT B
|
7 | DDRB |=0x01;
|
8 | PORTB |=0x00;
|
9 |
|
10 | //CTC von Timer1 aktivieren
|
11 | TCCR1A &= ~(1<<WGM00);
|
12 | TCCR1A |= (1<<WGM01);
|
13 |
|
14 | TCCR1A |= (1<<CLKPS0);
|
15 | TCCR1A |= (1<<CLKPS1);
|
16 | TCCR1A &= ~(1<<CLKPS2);
|
17 | TCCR1A &= ~(1<<CLKPS3);
|
18 |
|
19 | //Keine ahnung ob die nächsten 3 Zeilen stimmen...
|
20 | OCR0=1
|
21 | TIMSK |= (1<<OCIE0);
|
22 | sei();
|
23 | }
|
24 |
|
25 | ISR(TIMER1_COMP_vect)
|
26 | {
|
27 | PORTD &= ~0x01;
|
28 |
|
29 | int main()
|
30 | {
|
31 | init();
|
32 | while(1)
|
33 | {
|
34 | PORTB |= (1<<0x01); //LED AN
|
35 | //Hier müsste ich dann irgendwie den Timer mit 10ms aufrufen... habe aber bis jetzt keine Idee wie!
|
36 | PORTB &= (1<<0x01); //LED AUS
|
37 | //Hier wieder dem Timer aufrufen
|
38 | }
|
39 | }
|
40 | }
|
Durch diese Struktur sieht man sofort, dass deine Funktion main()
innerhalb der ISR geschachtelt wurde. Zumindest würde es das, wenn es in
C gehen würde, denn in C kann man keine Funtionen in andere Funktionen
schachteln (auch wenn der gcc das kann). Auf jeden Fall ist das nicht
das, was du wolltest. Wo liegt der Fehler? Nun, du hast die } von der
ISR Funktion vergessen.
Durch die Einrückung sieht man solche Dinge! Daher ist eine Einrückung
nicht einfach nur etwas, damit der Code schöner aussieht, sondern ist
ein wichtiges Hilfsmittel um nicht den Überblick zu verlieren.
Zum Code.
Du rufst keinen Timer auf! Sondern: Du stellst den Timer in eine
bestimmte Betriebsart ein und wenn bestimmte Bedingungen vorliegen (zb
der Timer hat seinen Endwert erreicht), dann ruft der Timer die
ISR-Funktion auf!
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | ISR(TIMER1_COMPA_vect)
|
5 | {
|
6 | PORTB ^= 0x01;
|
7 | }
|
8 |
|
9 | int main()
|
10 | {
|
11 | //Led auf PORT B
|
12 | DDRB |= 0x01;
|
13 |
|
14 | // CTC Modus
|
15 | // Vorteiler 1024
|
16 | TCCR1B = (1<<WGM12) | (1<<CS12) | (1<<CS10);
|
17 | OCR1A = 780;
|
18 | TIMSK |= (1<<OCIE1A);
|
19 | sei();
|
20 |
|
21 | while(1)
|
22 | {
|
23 | }
|
24 | }
|
Soweit blinkt die LED.
Dein Zähler zählt mit
16000000 / 1024 = 15625
Das heist, wenn du nichts weiter tust, dann würde der Timer in 1 Sekunde
bis 15625 zählen.
Du willst 10 Hz haben, also brauchst du 20 ISR Aufrufe in der Sekunde
(10 fürs einschalten, 10 fürs ausschalten). D.h. von einem ISR AUfruf
zum nächsten dürfen 1 / 20 = 0.05 Sekunden vergehen.
Wenn dein Timer in 1 Sekunde bis 15625 zählen würde, wie weit kommt er
dann in 0.05 Sekunden?
Na genau bis 15625 * 0.05 = 781.25
Und daher setzt ich diesen Wert als Vergleichswert ins
Vergleichsregister.
Jetzt zählt der Zähler mit einer bestimmten Taktrate (vorgegeben durch
Taktfrequenz und Vorteiler) bis 780. Danach löst er einen Compare Match
aus welcher wiederrum die ISR Funktion aufruft. Wegen dem CTC Modus
zählt der Timer aber nicht bei 781, 782, ... weiter, sondern fängt
wieder bei 0 an.
Der Timer zählt also laufend
0, 1, 2, 3, ..., 777, 778, 779, 780, 0, 1, 2, 3, .... , 777, 778, 779,
780
und die 780 sind so gewählt, dass der Timer für einmal von 0 bis 780
zählen 0.05 Sekunden braucht.
Bei einem andern Vorteiler ergibt sich ein anderer Vergleichswert. Aber
da es nicht allzuviele Vorteiler gibt, kannst du ja einfach mal alle
durchprobieren und nachsehen, ob es einen gibt, bei dem sich die
Berechnung des Vergleichswertes auf eine glatte 0 in den
Nachkommastellen ausgeht.
Nichts gegen die Formeln im Datenblatt. Aber IMHO ist es besser, du
machst dir klar, was der Timer eigentlich macht und was das für deine
Zahlen bedeutet. Dann brauchst du auch keine Formeln mehr lernen oder
nachschlagen.