Hallo Zusammen, mit Hilfe der 2 Kanäle des 16 Bit Timers des ATMEGA644 möchte ich in bestimmten Zeitintervallen Interrupts auslösen. Dazu habe ich in beide OCR Register A und B jeweils einen anderen Vergleichswert geladen. Der Interrupt des jeweiligen Kanals wird jeweils über OCIE1A/B aktiviert. Interrupts sind global natürlich aktiv. Nun zu dem Problem: Interrupt für Kanal A fünktioniert aber wenn ich für den Kanal A die Interrupts deaktiviere und Kanal B aktiviere wird zwar ein Interrupt ausgelöst aber für den Vergleichswert der in OCR1A steht. Hat irgendjemand eine Idee wo mein Fehler liegt? Danke im Voraus. MfG Christian
Wie stellst Du Dir das vor? Ich vermute mal, Du hast den Timer im CTC-Modus laufen. Dann wird er zurückgesetzt, wenn OCR1A erreicht ist. OCR1B wird dann nie erreicht. Auch wenn OCR1B kleiner ist als OCR1A, sind die Abstände zwischen den Interrupt-Ereignissen vermutlich nicht so, wie Du Dir das vorstellst, weil jeder Interrupt nur einmal pro Timerdurchlauf auftritt.
Wenn Du 2 verschiedene Intervalle erreichen willst, mußt Du den Zähler frei durchlaufen lassen und in dem jeweiligen Interrupt die Intervalldauer zu OCR1A bzw. OCR1B addieren. Peter
@Johannes CTC Mode ist richtig. Also wenn ich jetzt noch mal im Datenblatt nachschaue und dich richtig verstanden habe wird der Timer stets bei erreichen von OCR1A zurückgesetzt. Dann ist es mir klar. Mein OCR1B Wert war nämlich größer und ich Esel habe gedacht OCIE1A aktiv & OCIE1B inaktiv -> reset bei OCR1A und OCIE1B aktiv & OCIE1A inaktiv -> reset bei OCR1B. @Peter So werde ich das machen. Besten Dank
Aber denk dran: Der Timer muss dazu im Normal-Modus laufen (kein CTC und keine PWM)...
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.