-
-
Erfahrener Benutzer
Robotik Visionär
Das mit dem TCNT0 = 192 verkürzt die Zeit der Späternen Messungen etwas. Solange man das für alle Messungen gleich hat stört es nicht weiter.
Man sollte den Timer1 vor dem SEi() in der ISR stopen, sonst hat man dadurch nicht viel gewollen. Den Timer solle man erst wieder Starten nachdem man den Wert wieder auf Null gesetzt hat.
Wenn man den Prescaler von timer0 nicht zurücksetzt sollte man sicher sein, das der Code zwischen stop der einen Messung und Start der nächsten immer genau gleich lange braucht. Duch die eventuell nachgehohlte ISR sollte das aber fast unmöglich sein. Also sollte man wenigstens für volle genauigkeit den Prescaler zurücksetzen Wie das geht müßte man im Datenbraltt nachlesen.
Bleibt noch der eher seltene Fall, das man kurz vor dem entscheidenen Aufruf von overflow0 gerade einen overflow1 oder anderen Interrupt hat. Dies läßt sich aber vermeiden, wenn auch nicht ganz elegant:
In der ISR(overflow0) (Nr. 3905) wird erstmal der overflow1 abgeschaltet und dann ein eventuell noch ausstehender overflow1 erlaubt.
Danach bleiben interrupts erlaubt und es wird per Sleep in den Idel Mode gegangen. Aus dem Idel mode wacht der Controller auf, um den overflow0 (Nr. 3906) abzuarbeiten und man ist dabei sicher eine genau definierte Verzögerung vom Timer zu haben. Erst hier wird das Ergebins ausgelesen und die Timer wider gestartet, etwa so wie in jetzingen Version.
Das ganze ist dann aber schon einen ziehmlich verschalchtelte version. Das wäre einer der ganz wenigen Fälle wo man in einer ISR den Sleep- befehl nutzen darf und dann auch noch die gleiche ISR noch einmal auftreten kann. Normalerweise sollte man ja vermeiden das eine ISR druch eine von gleichen Typ unterbrochen wird.
Man solle auf alle Fälle sehen das man genug Stack hat, denn da wird einiges gebraucht.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen