Forum: Mikrocontroller und Digitale Elektronik ATTiny461A, Timer0 feste Frequenz


von Tilo (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

Nimm den Compare-A-Interrupt und addiere die Verkürzungszeit zu OCR0A/B.


Peter

von spess53 (Gast)


Lesenswert?

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

von Tilo (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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
Noch kein Account? Hier anmelden.