Forums Neueste Beiträge
 

AVR-Interrupts im Mikrosekundenbereich

06/01/2008 - 21:13 von Lutz Schulze | Report spam
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


Mit unseren Sensoren ist der Administrator informiert, bevor es Probleme im
Serverraum gibt: preiswerte Monitoring Hard- und Software-kostenloses Plugin
auch für Nagios - Nachricht per e-mail,SMS und SNMP: http://www.messpc.de
Neu: Ethernetbox jetzt auch im 19 Zoll Gehàuse mit 12 Ports für Sensoren
 

Lesen sie die antworten

#1 Udo Piechottka
06/01/2008 - 21:25 | Warnen spam
Lutz Schulze schrieb:
,> //counter++;
// jeder weitere Befehl hier verlàngert die Zeit zwischen den Interrupts??



Der Interrupt wird ja auch erst nach dem Verlassen dieser Routine wieder
akzeptiert.

Es ist natürlich völliger Schwachsinn, alle 4 usec einen Code
auszuführen, der incl. allem Overhead >4usec benötigt.

Auch wenn Du die Interrupts direkt am Anfang wieder freigibst, wird
erforderliche Rechenzeit "verbraten". Vielleicht hast Du ja auch noch
andere Aufgaben zu erledigen, ausser ein Rechtecksignal zu erzeugen?
Dann wird's knapp.


Viel Erfolg.

Gruss Udo

Ähnliche fragen