Hallo,
für meine Projekt benutze ich den Atmega16. Um einen Rechteckpuls mit
einer Pulsbreite 10µs an pin PD4 zu erzeugen kommt der Timer0 zum
Einsatz.
Die Idee ist folgendes: Ich betreibe den µC bei 8Mhz. Timer Vorteile
8--> Clock Timer = 1Mhz. Der Pin PD4 wird zunächst auf High gesetzt,
gleichzeitig wird der Timer gestartet und zählt bis 10 (entsprechend
10µs), dann wird ein Interuppt ausgelöst, wobei der Pin wieder auf Low
gesetzt.
Das Problem ist: ich habe den Puls mit einem Osciloscop gemessen. Was
ich an dem Pin rauskriege ist ein Puls mit einer Pulsbreite von ca. 100
µs. Kann jemand mir das erklären? Liegt es daran, dass der Timer nicht
rechtzeitig gestartet wird oder beim Interrupt wird das Programm
verzögert?
Unten ist die C-Code als Funktion:
1 | void trigger(void)
|
2 | {
|
3 | DDRD|= (1<<PD4);
|
4 | PORTD |= (1<<PD4);
|
5 | //Der µC wird mit 8Mhz betrieben, Vorteile 8--> Clock Timer = 1Mhz
|
6 | TCCR0 = (1<<CS01);
|
7 | //Vergleichwert
|
8 | OCR0 = 10;
|
9 | //Output Compare Match interrupt aktivieren
|
10 | TIMSK = (1<<OCIE0);
|
11 | //Timer aktivieren
|
12 | TCNT0 = 0;
|
13 | }
|
14 | ISR (TIMER0_COMP_vect)
|
15 | {
|
16 | //Timer stoppen
|
17 | TCCR0 = 0;
|
18 | //PIND4 auf Low setzen
|
19 | PORTD &=~(1<<PD4);
|
20 | }
|