Hallo, Randbedingung, AT mega32 mit 16MHz. Timer 1 soll mehrere Servosignale im Bereich bis 2,5ms (0,5 - 2,5ms) Erzeugen. Timer läuft im CTC und soll im Überlauf noch was anderes machen. Leider verrechne ich mich irgendwie und komme nicht auf mein Timing. Timer läuft im CTC Modus. durch setzen von OCR1A und dem entsprechenden Interrupt will ich nun : - Im Überlauf, neuen Ausgang setzen und OCR1A setzen für nächsten Endpunkt - Im OCR1A Ausgang aus - Im Überlauf wieder von vorne Aber ich bekomme mein Timing nicht hin. Ich hab jetzt nur mal den Overflow aktiv und toggle einen Pin. Mein Timing ist aber komplett daneben wenn ich mit dem Oszi messe. Ich nehme an ich mache einen Denkfehler. Alle 2,5ms muss der Timer überlaufen. Timer 1 ist 16 bit. Also 2,5ms/65536 >= 26MHz.Takt des Timers.... Das geht ja nicht... Kann mir mal einer über die Straße helfen... Ich möchte eigentlich schon eine Genauigkeit von 256 Werten im Bereich 0,5-2,5ms haben. Danke Juergen
Jürgen Sachs schrieb: > Timer läuft im CTC Modus. durch setzen von OCR1A und dem entsprechenden > Interrupt will ich nun : > - Im Überlauf, neuen Ausgang setzen und OCR1A setzen für nächsten > Endpunkt > - Im OCR1A Ausgang aus > - Im Überlauf wieder von vorne Machs nicht von so kompliziert. Lass den Timer durchlaufen und berechne einfach den nächsten Compare Match, den du dann ins OCR1A Register setzt. Modellbauservo Ansteuerung - die letzte Routine Umstricken auf den 16 Bit Timer und kleineren Vorteiler, dann wird auch der Wertebereich größer. > Alle 2,5ms muss der Timer überlaufen. Timer 1 ist 16 bit. > Also 2,5ms/65536 >= 26MHz.Takt des Timers.... Das geht ja nicht... Mal sehen. Wenn der Timer full Speed läuft, dann zählt er in 1 Sekunde theoretisch bis 16000000. Ein Durchlauf von 0 bis 65535 dauert daher 0.00409 Sekunden (in 1 Sekunde bis 16000000, wie weit bis 65536: 65536 / 1 * 16000000). Da das zu lang ist, darf der Timer nicht bis 65536 zählen, sondern muss schon früher wieder bei 0 anfangen. Wie weit genau darf er zählen 16000000 1000 Millisekunden x 2.5 Millisekunden ----------------------------------- 16000000 * 2.5 x = ----------------- = 40000 1000 d.h. wenn dein Timer full speed bis 40000 zählt, braucht er dazu genau 2.5 Millisekunden.
Danke, ich habe meinen Fehler auch erkannt... Jetzt klappt es... Danke Juergen
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.