Hallo,
folgendes Programm toggelt aus dem Interrupt heraus in periodischen
Abständen PB1.
1 | #include <avr/io.h>
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | // *** TIMER 0 Zeitschleifen ***
|
5 |
|
6 | ISR(TIM0_OVF_vect)
|
7 |
|
8 | {
|
9 |
|
10 | PORTB ^= ( 1 << PB1 );
|
11 |
|
12 | } // Ende ISR
|
13 |
|
14 |
|
15 | int main()
|
16 | {
|
17 |
|
18 | TCCR0B |= (1<<CS00 | 1<<CS02);
|
19 | TIMSK0 |= (1<<TOIE0);
|
20 |
|
21 | sei(); // enable timer interrupt
|
22 | DDRB |=( 1 << PB1 ); // PB0 an PORTB als Ausgang setzen
|
23 |
|
24 |
|
25 | while(1)
|
26 | {
|
27 | } // Ende while
|
28 |
|
29 | return 0;
|
30 | } //Ende main
|
So weit funktioniert es.
Was mich aber wundert: woher weiß der Counter, wie oft er durchlaufen
soll, bevor ein Match vorliegt und das IRQ aufgerufen wird?
Hätte gedacht, dass man im OCR0A-Register einen Wert ablegen müsste.
Wenn ich es richtig sehe (und richtig gemessen und gerechnet habe), wird
die Interrupt-Routine alle 256 Takte aufgerufen (wenn Vorteiler = 1).
Was muss man machen, damit das IRQ z.B. alle 100 Takte aufgerufen wird ?
Nachtrag: habe versuchsweise auch schon in die OCR0A/OCR0B-Register
verschiedene Werte zwischen 10 und 240 geschrieben, das ändert aber
leider nichts an der Ausgabefrequenz an Pin B1.