So, hab jetzt doch den 16-Bit-Counter genommen, da gibts einfach mehr
funktionen (auch wenn das doch mit dem 8-Bitter auch gehen müsste)?
Wo ist jetzt noch der Fehler (s.u.), eigentlich müsste doch nach ca.
1,1 Sekunden der Port auf Low gezogen werden? Laut Tutorial passt das
so zusammen, wenn ich das so richtig verstanden habe:
Der Timer der mit CPU_CLK/64 läuft, und damit den TCNT1L bis 65535
hochzählt. Wenn er diesen Wert erreicht hat, löst TIMSK = (1<<TOIE1)
nen Timer1 Overflow Interrupt aus, der dann von der
ISR(TIMER1_OVF_vect) empfangen wird und dann ein interrupt event
ausgelöst wird (z.B. Port schalten etc).
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 |
|
5 | int main(void)
|
6 | {
|
7 |
|
8 | DDRD = 0xFF; // kompletter PORTD als Ausgang
|
9 | PORTD = 0xFF;
|
10 |
|
11 |
|
12 |
|
13 | //Timer
|
14 |
|
15 | TCCR1B = (1<<CS11)|(1<<CS10); //prescaler64
|
16 |
|
17 | TCNT1L; //16-Bit Aufwärtszähler
|
18 |
|
19 | sei(); //Setzt globales Interupt
|
20 |
|
21 | TIMSK = (1<<TOIE1); //WENN UEBRLAUF , dann interrupt
|
22 |
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 | for(;;)
|
31 | {
|
32 |
|
33 |
|
34 |
|
35 | ISR(TIMER1_OVF_vect)
|
36 |
|
37 | {
|
38 | PORTD &= ~((1<<PD0));
|
39 | }
|
40 |
|
41 | }
|
42 |
|
43 | }
|