> mmhh ich benötige den timer, weil ich damit die flanken-längen
> messe.
Was ist eine "Flanken-Länge"???
Die "Flanke" ist der Wechsel zwischen zwei Pegeln, deren Länge sollte
möglichst kurz sein.
Oder meinst du die H- oder L-Impulsdauer (den Abstand zwischen zwei
unterschiedlichen Flanken) oder gar die Periodendauer (der Abstand
zwischen zwei gleichen Flanken)? Dies kann der ICP-Interrupt sehr gut.
Wer Timer auf 0 setzt, verbaut sich die restlichen Hardware-Features
des Timers. Es ist ohne Weiteres möglich, Timer1 frei durchlaufen zu
lassen und quasi gleichzeitig den ICP-Interrupt, beide OCR-Interrupts
und bedingt den OVF-Interrupt zu nutzen. Zusätzlich kann mit jedem
Externen Pin-Interrupt ein Software-ICP programmiert werden. Und das
alles mit nur einem Timer1. Bedingung: Niemand darf den Timerstand
manipulieren! Alle gereifen nur lesend auf den Timerstand zu!
Lösung:
ICP:
In der ICP-ISR wird vom aktuell eingelesenen Inhalt des ICP-Registers
der (gemerkte) Wert des letzten mal subtrahiert und der aktuelle Wert
für das nächste mal gesichert (gemerkt). Die ermittelte Differenz ist
der gewünschte Wert (Anzahl der Timer-Ticks) seit dem letzten Int.
OCR:
In der OCR-ISR wird das OCR-Register (nicht der Timerstand!)
eingelesen. Dann wird das gewünschte Intervall (Anzahl der Timer-Ticks
bis zum nächsten gewünschten Interrupt) dazuaddiert und der Wert wieder
in das OCR-Register geschrieben. Danach kann man die Arbeit machen,
weshalb man den Interrupt überhaupt nutzen will.
OVF:
Es gibt zyklische Dinge, die zwar eine konstante Frequenz erfordern,
deren absoluter Wert der Frequenz aber relativ unwichtig ist. Nutzt man
den OVF-Interrupt des freilaufenden Timer1 (also ohne Reoad!), so
bekommt man eine stabile Frequenz, deren Wert vom Vorteiler bestimmt
wird. Zählt man in dieser ISR eine Variable hoch, kann man diese von
allen Programmteilen als Referenz für langsame Softwaretimer nutzen.
Damit lassen sich sehr effizient Verzögerungen realisieren, ohne dass
Warteschleifen Rechenzeit vernichten.
Software-ICP:
In der ISR des externen Int. wird der Timerstand ausgelesen und mit dem
(gemerkten) Wert der letzten Messung verrrechnet
(Zeit=Neuwert-Altwert).
Achja, ich habe erst heute hier irgendwo gelesen, dass BASCOM in jeder
ISR alle Register sichern soll. Wenn das wahr ist, dann ist BASCOM für
interruptgesteuerte Programme unbrauchbar, denn das Sichern und
Wiederherstellen aller Register und des SREG in jedem Interrupt ist
eine nicht hinnehmbare Verschwendung von Rechenzeit, die den Controller
sinnlos belastet. Das Geniale an Interrupts ist nämlich, dass man die
ISR extrem kurz halten kann, damit trotz häufigen INT-Aufrufs das
Hauptprogramm kaum langsamer wird. Anders wären Dinge wie Software-PWM
oder Timer-synchronisierte LCD-Ausgabe garnicht möglich.
...