www.mikrocontroller.net

Forum: Projekte & Code timer ganz einfach benutzen. [ AVR, AtMega8]


Autor: Marco Schettgen (schetti)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hab mal ne include-Datei geschrieben, die die Benutzung des Timers sehr 
vereinfacht. Man muss sich keine großen gedanken über irgendwelche 
Register oder so machen. Ich selber habe lange gebraucht, bis ich den 
Timer verstanden habe. Und da ich den oft benutze, wollte ich es mir ein 
bißchen einfacher machen.

Einfach die Datei runterladen. In das Include-Verzeichnis setzen und in 
das Projekt mit einbinden.
Dann kann einfach der Timer aufgerufen werden.
zb.:
timer8(40);  // 8bit Timer mit 40ms
oder
timer16(2000); // 16bit Timer mit 2 sekunden

Im Kopf der timer_set.h ist es auch nochmal kurz erklärt. Benutze diese 
Datei für meinen AtMega8 im AVR-Studio. Weiß nicht wie weit, das auf 
andere Pics kompatibel ist.
Dann viel Spaß

Mit freundlichen Grüßen

Schetti

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht böse sein, aber wo liegt hier der Unterschied
zu den Routinen aus delay.h?

(Ausser, dass die delay.h genauer sein dürften, einfacher
auf eine andere Taktfrequenz angepasst werden können und
mir nicht die Floating Point Library ins Programm reinziehen)

OK.
Einen Vorteil gibt es: Ein Interrupt kann dazwischen funken
(solange er fertig ist bevor der Timer abläuft) und das
Timing stimmt noch so einigermassen.



Autor: Marco S. (masterof)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich finde der timer ist genau als die Delay-Routinen.
Bei welcher Frequenz ist diese Routine?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco Schwan wrote:
> Ich finde der timer ist genau als die Delay-Routinen.

Dann überleg dir mal, inwiefern die floating point Berechnungen
am Anfang in die Zeitberechnung eingehen und ob das in irgendeiner
Form im Code berücksichtigt ist.

Im Grunde macht der Code nichts anderes als Takte abwarten.
Genau dasselbe machen auch die delay Routinen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
float ohne Not ist des ATtiny2313 sein Tod.

Und der ATmega8 ist damit auch schon ganz gut gefüllt.

Und er ist kein Pic.

Schau Dir mal an, was für ein Assembler-Monster Dein Code generiert.

Das float-Rechnen überlasse mal schön dem Präprozessor und der trägt 
dann einfach nur die ausgerechneten Integer-Konstanten ein.


Peter

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
<pfeif>
Wow. 3.3k im Vergleich zu 160 Bytes mit _delay_ms sind
kein Pappenstiel. (Compiliert mit -Os)

Autor: Marco Schettgen (schetti)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habs ganz vergessen dabei zu schreiben.
Mein AtMega läuft mit 3,6864 Mhz.
Meine timer_set.h ist natürlich nicht das beste was es gibt. Aber 
vielleicht kann es ja einer gebrauchen. Oder vielleicht hilft es einem, 
den Timer besser zu verstehen.

Ich habe mir für die Berechnung ein Exel-Dokument mit 2 registerkarten 
für 8 und 16 bit gemacht. Da kann ich die Taktfrequenz eingeben und 
bekomme alles angezeigt was ich wissen muss. Bin erst seit einem Jahr am 
Mikrokontroller programmieren. Lerne also auch immer noch viel dabei, 
wenn was falsch ist.

MFG
Schetti

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marco Schettgen wrote:
>
> Ich habe mir für die Berechnung ein Exel-Dokument mit 2 registerkarten
> für 8 und 16 bit gemacht. Da kann ich die Taktfrequenz eingeben und
> bekomme alles angezeigt was ich wissen muss. Bin erst seit einem Jahr am
> Mikrokontroller programmieren. Lerne also auch immer noch viel dabei,
> wenn was falsch ist.

Keine gute Lösung.
Lass doch den Compiler die Konstanten ausrechnen.

Am Beispiel timer8 beim Vorteiler 1024
  else if( time<( 1000.0/(F_CPU/1024) * 255 ) ) // Vorteiler 1024
  { 
    TCCR0 = 0b00000101;    
    steps = time / (1000.0/(F_CPU/1024));
    bit_8();
  }

Die Konstante für die Taktfreqeuenz heist traditionell
F_CPU. Wenn du im AVR-Studio in den "Configuration Options"
eine Taktfrequenz eingibst, dann landet die genau in dieser
Präprozessor Konstante.

Du brauchst dir auch keine Sorgen zu machen. Da obige
Berechnung nur aus Konstanten besteht, berechnet die der
Compiler für dich. Das gibt also im Gegensatz zu den
anderen Berechnungen keinen Overhead zur Laufzeit.
Im Grunde hat sich zur Laufzeit am Programm nichts geändert.
Der einzige Unterschied: Für eine andere Taktfrequenz wird
einfach nur ein neuer Wert für F_CPU festgelegt, den Rest
macht der Compiler. Du brauchst kein Excel Blatt, du musst
keine Werte von dort ins Programm rüberkopiern.

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.