-
-
Erfahrener Benutzer
Roboter Experte
Die 2. Variante ist IMHO definitiv genau. Bei beiden Interrupts entsteht die gleiche (minimalste) Zeitverzögerung zwischen Auslösen des Interrupts und Einspringen in die ISR – die Zeit, die der Timer läuft, entspricht also exakt der Zeit zwischen den beiden Lichtschranken-Passagen.
Ich habe aber natürlich trotzdem einen Denkfehler gemacht: Der Timer zählt (bei 16 MHz und einem Prescaler von 1024) alle 64µs ein Bit weiter – man muss den Zählerstand also mit 64 malnehmen, um auf die Zeit zu kommen, und ihn nicht durch 64 teilen. Dieses Produkt dann durch 1000 geteilt ergibt die Zeit in ms.
Folglich muss der Zähler immer bei 0 starten – hat er z.B. bis 7628 gezählt, sind 488 ms vergangen. Nach dem Stoppen in der ISR_lichtschranke2 übergibst Du seinen Wert an eine Variable und setzt ihn auf 0 zurück – für den nächsten Start (die Variable muss dabei ausreichend groß dimensioniert sein, um sich noch mit 64 multiplizieren zu lassen!). Außerdem wäre es elegant, in dieser Stop-ISR ein Flag-Bit zu setzen, das der Hauptschleife anzeigt, dass jetzt die Zeit berechnet werden kann und soll. Damit bleibt die ISR schön kurz und hält das Hauptprogramm nicht länger auf als nötig.
Alles klar??
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen