Tool: AVR-Timer-Calculator

Dirk

Administrator
Teammitglied
28 Jan 2007
4.273
135
63
Mittelhessen, Giessen
Sprachen
C, C++, C#, Pascal, Assembler, PHP, Java
Noch ein kleines Programm, was euch eventuell einmal hilfreich sein könnte:

AVR-Timer-Calculator

Kurzbeschreibung:
Das Programm ermittelt die Reload- und Compare-Werte für eine vorgegebene Zeit bei unterschiedlichen Prescalern. Zur Berechnungen werden Prescaler von 2 bis 4096 zu Grunde gelegt.

Hinweis:
Nicht alle Timer der AVR-Mikrocontroller besitzen alle zur Berechnung genutzten Prescaler. Ihr solltet also prüfen, welche Prescaler das Timermodul eures AVRs besitzt.


Revision 1.2

Dirk


Kurze Erläuterung zu Overflow- und Compare-Interrupts:

Wenn du in bestimmten periodischen Zeitintervallen Programmteile ausführen möchtest, eignet sich zum Beispiel ein Overflow-Interrupt oder ein Compare-Interrupt eines Timers.

Overflow-Interrupt
Bei dem Overflow-Interrupt läuft der Timer ab einem bestimmten Wert los. Erreicht er das Ende (0xFF bei 8bit, 0xFFFF bei 16bit Timer), wird der Overfllow-Interrupt ausgelöst. In der Interruptroutine muss man den Timer wieder selbst auf den Anfangswert (Reloadwert) stellen (das muss möglichst zu Begin der Interruptroutine erfolgen).

Compare-Interrupt
Bei dem Compare-Interrupt läuft der Timer ab 0x00 los. Erreicht er den Wert, der zuvor in einem Compare-Register festgelegt wurde, wird der Compare-Interrupt ausgelöst, der Timer wird automatisch wieder auf 0x00 zurückgesetzt (CTC-Mode = Clear Timer on Compare Event).

Die Periodendauer des Interrupts läßt sich nun bei gegebener Oszillatorfrequenz (fosc) einerseits durch den Prescaler und andererseits durch den Reloadwert oder den Comparewert beeinflussen.

Die Taktzeit für den Timer ergibt sich folgendermaßen: tclk = Prescaler/fosc.

Beispiel:
8bit Timer, fosc = 16MHz, Interrupt-Periodendauer = 1ms

Overflow-Interrupt:
Prescaler = 128, Reloadwert = 131
1ms = (256-Reloadwert) x Prescaler / fosc
1ms = (256-131) x 128 / 16MHz

Compare-Interurpt:
Prescaler = 128, Comparewert = 124
1ms = (Comparewert+1) x Prescaler / fosc
1ms = (124+1) x 128 / 16MHz

Um den Overflow-Interrupt des Timers zu nutzen, musst du
  • Timer auf Reloadwert setzen
  • Overflow-Interrupt des Timers freigeben, eventuell zuvor Interrupt-Request-Flag löschen
  • Prescaler festlegen (jetzt läuft der Timer)
  • nicht vergessen global die Interrupts freizugeben
  • In der Interrupt-Routine selbst den Timer wieder mit Reloadwert beschreiben (bei 16Bit hier auf die Schreib-Reihenfolge von low und high achten)
Um den Compare-Interrupt des Timers zu nutzen, musst du
  • Compareregister mit Comparewert beschreiben
  • Timer auf 0x00 setzen
  • Compare-Interrupt freigeben, eventuell zuvor Interrupt-Request-Flag löschen
  • Prescaler festlegen (Timer läuft nun)
  • globale Interrupts freigeben.
Beispiel in C:
Compare, fosc = 16MHz, Periodendauer = 1ms



CodeBox C und C++
void InitTimer0CompareAInt(void)
{

   TIFR0 |= (1<<OCF0A);                // Interrupt Request loeschen
   TIMSK0 |= (1<<OCIE0A);              // Enable Output Compare A Interrupt

   OCR0A = 249;                        // CompareTime ist 1ms
   TCNT0 = 0;
   TCCR0A   |= 1 << WGM01;             // CTC Mode 2
   TCCR0B   |= (1<<CS01) | (1<<CS00);  // 64 prescaler, Timer0 Start

}

ISR(TIMER0_COMPA_vect)
{
   // Compare-Interrupt:
   // hier etwas tun, möglichst nur zeitkritische
   // Sachen erledigen
  
}
Rechtlicher Hinweis:
Der Autor dieses Programms haftet nicht für Schäden an Soft- oder Hardware oder Vermögensschäden, die durch das Benutzen des Programms entstehen, es sei denn diese beruhen auf einem grob fahrlässigen oder vorsätzlichen Handeln des Autors, seiner Erfüllungsgehilfen oder seiner gesetzlichen Vertreter.
 

Anhänge

Zuletzt bearbeitet:
  • Like
Wertungen: timomenges

Markus

BASCOM-Experte
11 Jan 2008
1.172
5
38
Lonsee
Sprachen
Hi Dirk,

super Sache das Tool. Werde es gerne sofort installieren und verwenden. Bin immer auf der Suche nach brauchbaren Tools die einem lästiges Standardgeschäft abnehmen.

So, jetzt hätte ich gerne noch einen Knopf bei dem in einem 2. Fenster gleich Code für BASCOM, für Assembler und für C erzeugt wird :p

Wäre doch ne geile Sache, oder? :)

Grüße und schönen Abend,
Markus

PS: Übrigens, seit dem Umzug flutscht das Forum richtig gut. So schnell waren die Seiten die letzten Wochen nicht! Danke!!!!
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.273
135
63
Mittelhessen, Giessen
Sprachen
C, C++, C#, Pascal, Assembler, PHP, Java
So, jetzt hätte ich gerne noch einen Knopf bei dem in einem 2. Fenster gleich Code für BASCOM, für Assembler und für C erzeugt wird :p
Hi Markus,

daran habe ich auch schon gedacht, das ist soweit auch recht einfach zu lösen. Allerdings muss man ja berücksichtigen...
  • welche Timer hat der genutzte AVR,
  • welche Vorteiler besitzt das Timer-Modul des gewählten Timers und
  • wie nennen sich die Register des AVR
Ich hätte hier erst einmal alle Datenblätter durchsehen müssen, das hätte den Rahmen für ein kleines Tool gesprengt, deshalb habe ich es etwas allgemein gehalten.

Vielleicht werde ich das aber in einer nächten überarbeiteten Version "einbauen".

Das nächste Tool wird wahrscheinlich ein kleines Programm sein, dass Bitmap-Bilder (.bmp) in Code konvertiert (Data-Zeilen für Assembler, C, Pascal und Bascom), so dass man mit einem bisschen weiteren Programmcode die Bilder auf einem Grafikdisplay ausgeben kann. Ich hatte das schon einmal realisiert und genutzt, muss den Sourcecode nur nochmal suchen :rolleyes:

Grüße
Dirk
 

tcg

Neues Mitglied
31 Mrz 2008
1
0
0
Sprachen
cpu-register

hi,

ich hab auch einen kleinen calculator geschrieben:
http://greschenz.dyndns.org/AvrWizOnline.php
bist du evtl an der cpu-config interessiert ? ich habe angefangen für ein paar
cpus die info aus den datenblätern zusammenzusaugen, und auch mal einen "compiler" gebaut, der (naja, mehr schlecht als recht) die part-description-files
vom avr-studio in ein config-file konvertiert...

cu, gg
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.273
135
63
Mittelhessen, Giessen
Sprachen
C, C++, C#, Pascal, Assembler, PHP, Java
Hallo,

danke für dein Angebot, ich wäre schon an der cpu-config interessiert. Ich hatte auch schon mal daran gedacht, die .def Files vom AVR-Studio zu analysieren, es war mir aber dann doch zu viel Arbeit :rolleyes:. Wenn ich wieder ein bisschen "Luft" habe, werde ich mir dann das Tool nochmal vornehmen.

Grüße,
Dirk
 

Walmo

Neues Mitglied
17 Okt 2008
1
0
0
Sprachen
Gut gemacht! Danke!

Hallo Dirk,

prima Tool, einfach und doch direkt einsetzbar.

MFG

WalMo
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.273
135
63
Mittelhessen, Giessen
Sprachen
C, C++, C#, Pascal, Assembler, PHP, Java
Hallo WalMo,

dankeschön für den Lob :) Es freut mich, dass dir das Tool gefällt!

Grüße
Dirk
 

RR4711

Neues Mitglied
22 Apr 2009
1
0
0
Sprachen
Bug?

Also ich behaupte mal daß die Werte zumindest für den compare Mode um 1 zu groß berechnet werden. Habe hier gerade eine Anwendung mit einem hochgenauen TCXO (+/-2ppm) und die Datenblätter studiert (Mega168). Da muss zur Berechnung der Periodendauer noch 1 abgezogen werden. Ich muss hier 25Hz generieren und mit dem Wert vom Programm ist die Frequenz zu klein gewesen. Ich hab den Timer so programmiert, daß bei Compare Event der Ausgangspin toggelt.

http://atmel.com/dyn/resources/prod_documents/doc2545.pdf

Auf Seite 120 steht die Formel.

Ansonsten praktisches Tool. In welcher Sprache gecodet?

Markus
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.273
135
63
Mittelhessen, Giessen
Sprachen
C, C++, C#, Pascal, Assembler, PHP, Java
Hallo Markus,

ich schaue mir das später mal an.

Das Programm habe ich in Delphi geschrieben.

Grüße,
Dirk

EDIT: Markus, du hast recht. Ich habe den Fehler behoben und die neue Version an den obersten Beitrag angehängt.
 

fastred

Neues Mitglied
30 Apr 2010
1
0
0
Sprachen
Vielen Dank !
Funtzt auch wunderbar mit Wine (wine_1.0.1-0ubuntu8_amd64.deb) !

fastred
 

Supply

Neues Mitglied
11 Sep 2010
1
0
0
Sprachen
I´ve found you at avrfreaks,

thanks for this timer calculator, very usefull!


supply

(sorry I don´t speak german)
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.273
135
63
Mittelhessen, Giessen
Sprachen
C, C++, C#, Pascal, Assembler, PHP, Java
Was bedeutet das "fosc" ?
Die Frequenz des Oszillators. Danach kann man oft noch einen Teiler aktivieren, so dass der Timer mit einer kleineren Frequenz versorgt wird (Vorteiler = Prescaler).
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)