Hallo Ich fange gerade an mit ATTinys zu arbeiten. Ich verwende einen ATTiny461. Mit Timer0 will ich eine feste Zykluszeit vorgeben. Dieser läuft im 16Bit Modus. Timer0 soll bei compare match einen IRQ auslösen. Das ganze soll möglichst genau werden. An und für sich kein Problem. Einfach den entsprechenden Wert ins compare Register laden. Wenn ich das Handbuch richtig verstanden habe, gibts für 16Bit leider keinen CTC Modus. Ist das wirklich so? Wenn ja, wäre es keine gute Idee, den Timer am Anfang der Interruptfunktion auf 0 zu setzen, da sich dann die Interruptlatenzen bei jedem Durchlauf addieren und der Fehler somit immer größer wird. Um den Fehler klein zu halten, müsste vom aktuellen Timerwert der Comparewert sowie die Verarbeitungszeit X abgezogen werden. Damit sollte der Offset kompensiert sein. Jetzt meine Frage: Muss der Umweg wirklich sein oder geht es auch einfacher? Viele Grüße, Tilo
Da hast du dir ja auch einen reichlich speziellen Controller rausgesucht. Ja, der Timer 0 ist normalerweise ein 8-bit-Timer, beim ATtinyX61 ist der offenbar nur auf 16 bit "aufgebohrt" worden, aber eben nicht mit vollem Umfang. Das "tiny" steht ja für "klein und billig", und dafür muss man eben auch irgendwo was einsparen. Der übliche Weg, wenn man keinen CTC-Modus hat ist, dass man den Zähler auf einen bestimmten Wert vorlädt (der Wert beinhaltet dabei bereits die Interruptlatenz) und dann im Overflow-IRQ diesen Ladewert in den Zähler schreibt.
Nimm den Compare-A-Interrupt und addiere die Verkürzungszeit zu OCR0A/B. Peter
Hi >Mit Timer0 will ich eine feste Zykluszeit vorgeben. Wie gross? >Das ganze soll möglichst genau werden. Wie genau? Erkläre doch mal genau, was du machen willst. MfG Spess
Servus Ich habe den Controller genommen, weil er klein und billig ist und alles kann was ich will :) Ich habe mir auch übverlegt den Timer vorzuladen hab ich mir auch überlegt, allerdings ist die Interruptlatenz nicht konstant. Ich weiß, das wird es nicht rausreißen, allerdings hätte ich gerne formal korrekten Code, wenn ich ein Projekt zum einarbeiten verwende. Hier ist es egal aber an einer anderen Stelle kann es relevant werden. Mir ist schon bewusst, dass der reale Fehler deutlich größer ist, da ich nur den internen RC Oszillator verwende. Clock * Periodendauer ergibt eine natürliche Zahl bei ca. 3500. Da wären die 16Bit nett gewesen. Danke für eure Antworten, ich habe das Handbuch also richtig verstanden., Jeder Hersteller hat doch seinen eigenen Stil, Dinge zu beschreiben. Der Code soll nur einen DAC per DDS ansteuern sowie abhängig von 4 Analogeingängen 4 Ausgänge schalten. Fszu kommt noch ein wenig Bitschieben und das wars. Viele Grüße, Tilo
Tilo schrieb: > Ich habe den Controller genommen, weil er klein und billig ist und alles > kann was ich will :) Offenbar kann er es nicht. ;-) > ..., allerdings hätte ich gerne formal > korrekten Code, wenn ich ein Projekt zum einarbeiten verwende. Die Physik kannst du aber schlecht überlisten. Wenn deine Interruptlatenz nicht konstant ist, kannst du keine "formal korrekte" Implementierung für deinen Timer erreichen, egal was deine Software tut. > Clock * Periodendauer ergibt eine natürliche Zahl bei ca. 3500. Da wären > die 16Bit nett gewesen. Dann nimm doch einen Prescaler von 64, CTC-Modus im 8-bit-Betrieb, und kalibriere den RC-Oszillator auf die passende Frequenz.
Tilo schrieb: > allerdings hätte ich gerne formal > korrekten Code, wenn ich ein Projekt zum einarbeiten verwende. Das hast Du doch, wenn Du den Compareinterrupt benutzt. Die Latenzzeit und die Berechnungszeit werden dann nicht akkumuliert. Etwas unschön ist nur, daß der AVR-GCC OCR0A/B nicht als 16Bit zugreifen kann. Peter
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.