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
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.
Ich finde der timer ist genau als die Delay-Routinen. Bei welcher Frequenz ist diese Routine?
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.
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
<pfeif> Wow. 3.3k im Vergleich zu 160 Bytes mit _delay_ms sind kein Pappenstiel. (Compiliert mit -Os)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.