Im Prinzip wird das schon funktionieren.
Allerdings wird Dir ein 8 Bit Timer nur eine relativ geringe Auflösung bieten.
Ich würde als ersten Schritt einen 16Bit Timer verwenden.
Ich bau meine Servoempfangsroutinen nach folgendem Schema auf.
Zuerst wird das Interrupt Sensing auf steigende Flanke ( =rising edge ) gestellt.
Tritt dann dieser Interrupt auf, wird der aktuelle Zählerstand des Timers 1 abgespeichert.
In dieser Interrupt Routine wird dann das Interrupt Sensing auf fallende Flanke umgestellt ( =falling edge ).
Fällt das Servosignal nach der Impulsdauer wieder ab, wird wieder der Timer 1 ( TCNT1 ) ausgelesen und der, bei der steigenden Flanke ermittelte, Wert davon abgezogen. Die Flanke wieder auf steigende Flanke für den nächsten Servoimpuls zurückstellen.
Nun hast Du ein Maß für die Impulslänge. Der Wert ist abhängig von den Einstellungen des Timers und der verwendeten Taktfrequenz.
Bei 8MHz und Prescaler 8 bekommst Du eine Auflösung von genau 1µs = 0,001ms.
Das kann dann für beliebig viele Interruptquellen so gehandelt werden ( INT0, INT1, ICP, ANALOG Komperator ).
Allerdings müssen die verwendeten Interruptroutinen so kurz wie nur irgend möglich sein, damit sich die Interrupt Routinen nicht gegenseitig blockieren.
Da der TCNT1 Wert durch diese Art der Impulsauswertung nicht beeinflusst wird, kannst Du den Timer auch noch für andere Zwecke verwenden, so lange das TCNT1 Register nicht manuell beschrieben wird.
Es ist dabei sogar eine Servoimpuls Ausgabe von bis zu 16Kanälen zusätzlich mit den beiden OCR1x Interrupts auf diesem Timer1 zusätzlich möglich - Aber das war ja nicht die Frage.
Beispielcode kann ich Dir leider nicht geben - Ich progge in "C". Aber mit dem Prinzip sollte das auch bei Bascom kein Problem sein.
Lesezeichen