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


von Marco S. (schetti)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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.



von Marco S. (masterof)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von Peter D. (peda)


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

von Karl H. (kbuchegg)


Lesenswert?

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

von Marco S. (schetti)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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
1
  else if( time<( 1000.0/(F_CPU/1024) * 255 ) ) // Vorteiler 1024
2
  { 
3
    TCCR0 = 0b00000101;    
4
    steps = time / (1000.0/(F_CPU/1024));
5
    bit_8();
6
  }

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.

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.