Hallo,
ich möchte bei einem Mega8(F_CPU = 16MHz) mit dem Timer1 einen Interrupt
alle 1µs erzeugen.
Innerhalb des CompareMatch Interuptes sollen dann Portpins entsprechend
gesetzt werden.
Leider macht mein Timer alles andere, als das gewünschte.
Zu Testzwecken habe ich im Compare-Interupt eine LED toggeln lassen.
Hier der Code:
1 | void init(void)
|
2 | {
|
3 | // Timer1 initialisieren ´1µs
|
4 | TCCR1B |= (1<<WGM12)|(1<<WGM13)|(1<<CS10); // CaptureCompare / No precaler
|
5 | TIMSK |= (1<<OCIE1A); // Compare A Interupt Enable
|
6 | ICR1 = (F_CPU/1000000)-1; // 1µs
|
7 | OCR1A = (ICR1*50)/100; // DC = 50%
|
8 | }
|
9 |
|
10 |
|
11 | ISR (TIMER1_COMPA_vect )
|
12 | {
|
13 | toggle_led(2);
|
14 | }
|
Nach Aussage meines Oszi's toggelt die LED mit einer Frequenz von
84,21kHz.
Der Duty-Cycle stimmt aber mit 50%.
Etwas verwunderlich finde ich, dass egal ob ich als Timerfrequenz 1µs
oder 500ns einstelle immer die selbe ausgangsfrequenz zu messen ist.
Könnt Ihr mir da irgendwie helfen?
Spielt es eigentlich hier eine Rolle welchen der beiden CTC-Moden(4,12)
ich verwende?
Gruß
Martin