Hallo Leute
Ich versuche gerade bei nem Mega48 mit Timer1 am Port OC0A (=PD6) 40kHz
zu erzeugen. Der Timer wird auf Mode4 = CTC eingestellt und sollte den
Port ohne IRS-Routine mit 40kHz toggeln - so die Theorie. Nur tut halt
nicht so. Anbei meine main-routine
1 | int main(void)
|
2 | {
|
3 | PORTD &= ~(1<<PD6); // PD6 = 0
|
4 | DDRD |= (1<<PD6); // PD6 output
|
5 | PORTD |= (1<<PD6); // PD6 = 1
|
6 | PORTD &= ~(1<<PD6); // PD6 = 0
|
7 | PORTD |= (1<<PD6); // PD6 = 1
|
8 | PORTD &= ~(1<<PD6); // PD6 = 0
|
9 | TCCR1A |= (1<<COM1A0); // Toggle OC1A0 on Compare Match
|
10 | TCCR1B |= (1<<WGM12); // Waveform Generation Mode 4 -> CTC
|
11 |
|
12 | OCR1AL = 99; // no prescaler f = 8MHz/(2*(1+99)) = 40kHz
|
13 | OCR1AH = 0;
|
14 |
|
15 | TIMSK1 |= (1<<OCIE1A); // Output Compare A Match Interrupt Enable
|
16 |
|
17 | TCCR1B |= (1<<CS10); // timer start / no prescaling
|
18 |
|
19 | sei(); // Enable interrupts
|
20 |
|
21 | for(;;)
|
22 | {
|
23 |
|
24 | }
|
25 | }
|
Wenn ich den obigen Code ohne ISR-Routine laufen lasse resetet mir der
µC immer wieder - sehe ich mit nem Oszi an den Doppel-Toggeln von PD6.
Wenn ich ne leere ISR-Routine reinmache ist zwar das resetten weg, aber
geht trotzdem nicht.
Wenn ich in der ISR-Routine PD6 per SW toggeln lasse gehts.
Vielleicht kann mir ja jemand helfen, ich steh gerade ziemlich auf dem
Schlauch.
gruß thomas