Hallo,
ich habe hier einen Atmega 8, mit dem ich alle 4 Mikrosekunden per Interrupt eine Ausgangsleitung auf L oder H schalten will. Viel mehr ist dazwischen nicht zu tun, ich wollte zunächst testen ob ich das dann noch in die Zeit dazwischen bekomme.
Mit 14, 7xx Mhz Takt ist das von der Geschwindigkeit her scheinbar auch kein Problem, jedoch bemerke ich gerade, dass sich auch schon bei sehr kurzen Codestücken in der Interruptroutine die Zeit zwischen zwei Aufrufen mit der Länge dieses Codes ändert.
Der verwendete Timer (mit Timer 0 und 1 getestet) wird jeweils am Beginn der Interruptroutine gleich wieder mit dem Ursprungswert geladen, so dass der nächste Interrupt ja IMHO immer wieder nach dieser Zeit ausgelöst werden müsste, unabhängig davon wieviel Befehle dann noch folgen (solange es nicht insgesamt zu viel Code ist). Testweise habe ich deshalb die Zeit für die Interrupts auch schon mal verdoppelt, der Effekt war aber genau so vorhanden.
Im Moment scheint es so, als ob der Timer erst nach dem verlassen der Interruptroutine wieder weiterläuft. Ich war davon ausgegangen, dass er das sofort nach dem neu laden tut. Übersehe ich da was?
Bisher hatte ich immer nur mit Interrupts im Millisekundenbereich zu tun, so dass mir das vielleicht nicht auffiel.
Hier die Interruptroutine (mit ICCAVR erstellt, der erzeugte Assemblercode sieht auch unverdächtig kurz und kompakt aus)
#pragma interrupt_handler timer1_ovf_isr:9 void timer1_ovf_isr(void) { //TIMER1 has overflowed TCNT1H = 0xFF; //reload counter high value TCNT1L = 0xC6; //reload counter low value
Setlow; //kurzen Puls an Ausgang, der mit Oszi sichtbar gemacht wird Sethigh;// dahinter sind zwei kurze Makros, die ein Bit setzen und löschen
//counter++; // jeder weitere Befehl hier verlängert die Zeit zwischen den Interrupts??
}Danke für eure Tips
Lutz