mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATTiny461A, Timer0 feste Frequenz


Autor: Tilo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

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


Peter

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tilo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.