Hallo zusammen, laut Artikel: http://www.mikrocontroller.net/articles/AVR-Tutorial:_Uhr lässt sich bei 4 Mhz keine exakte Sekunde per Overflow auf Timer0 8bit realisieren. Aber laut: https://mpg.dnsalias.com/~magerlu/rn-wiki/avrtimer_applet/ muss es gehen: 4 Mhz Prescaler: 128 Timervorladen: 131 kommt genau 250 Overflows in einer Sekunde. Was ist an meiner Rechnung falsch? Ich muss dann nur noch eine Variable bis 250 hochzählen und schon habe ich eine Sekunde.
Uhren programmiert man nicht per Timer-Reload sondern per CTC. Damit ist (fast) jede beliebige Zeitbasis erzeugbar.
> Was ist an meiner Rechnung falsch? In Deiner Rechnung fehlt die Zeit, die das Programm bei jedem Overflow braucht, um den Timer mit dem Startwert nachzuladen. Und bei 250 Overflows pro Sekunde kann da auf Dauer schon eine ganz schöne Abweichung entstehen. Bei einigen 8051er-Controllern gibt es die Möglichkeit, dieses Nachladen verzögerungsfrei per Hardware zu machen. Bei den AVRs gibt es das nicht, es ist allerdings auch nicht erforderlich, da man ja CTC zur Verfügung hat. Und CTC macht im Prinzip dasselbe, nur umgekehrt... Man kann das natürlich (mit Overflow und Nachladen) in Assembler programmieren. Da weiß man genau, wie viele Takte es dauert, um den Timer nachzuladen und man kann diese Zeit dann zum Reload-Wert hinzuaddieren und damit kompensieren. Aber warum so viel Aufwand bei der Software, wenn der Controller das alles hardwaremäßig machen kann?
>In Deiner Rechnung fehlt die Zeit, die das Programm bei jedem Overflow >braucht, um den Timer mit dem Startwert nachzuladen. Naja, bei einem Vorteiler von 128 wären 128 Takte bis zum nächsten Erhöhen des TCNT-Registers nötig. Das sollte man hinkriegen...
Wer hat eigentlich diesen Wiki-Artikel geschrieben? Der klingt wie "So, jetzt machen wir den Mund schön weit auf"... (Ihn zu ändern habe ich aber keine Lust...)
Hoffen wir das beste lieber Leser für unseren Titelhelden - Forts folgt das ist pluralis maiestatis, Wir dero Gnaden verfügen...
Ich habe eben im Datenblatt nachgelesen das der 8bit Timer vom ATTINY2313 auch Clear Timer on Compare Match (Auto Reload) machen kann. Wie sieht der Code aus um in zu aktivieren? Von dem C-Tutorial wird man nicht schlauer weil die Register bei dem AVR anders sind. Kann mir da einer helfen?
> Hoffen wir das beste lieber Leser für unseren Titelhelden - Forts folgt > das ist pluralis maiestatis, Wir dero Gnaden verfügen... Mich stört es nicht, wenn ein Tutorial im Stil des gemeinsamen Handelns abgefasst ist. Ich bin ehrlich gesagt nie auf die Idee gekommen, das als "pluralis maiestatis" des Autors zu interpretieren und halte das jetzt auch für fehlinterpretiert. Sind "wir" lieber froh, dass es in der Artikelsammlung voran geht. Dran denken: Wer selber schreibt, darf selber bestimmen.
>Wie sieht der Code aus um in zu aktivieren?
TCCR0A = (1<<WGM01);
TCCR0B = (1<<CS01); // PS = 8
OCR0A = 249; // 500ms
>Sind "wir" lieber froh, dass es in der Artikelsammlung voran geht.
Ja, dagegen spricht ja auch nichts.
Ich bin halt gewöhnt, dass irgendwelche technischen Abhandlungen
"unpersönlich" geschrieben sind.
Rahul, der Trollige wrote: > Wer hat eigentlich diesen Wiki-Artikel geschrieben? Der klingt wie "So, > jetzt machen wir den Mund schön weit auf"... (Ihn zu ändern habe ich > aber keine Lust...) Du kannst ihn gerne umschreiben. :-) Ein Artikel über den ADC wäre da drinnen auch nicht schlecht. Oder eine PWM Oder wie man das Timing für ein Servo hinkriegt. All die Fragen, die hier im Forum tagtäglich anfallen. Ich wär überaus dankbar wenn mir jemand helfen würde, das Tutorial weiter voranzutreiben. (So jetzt ist die Katze aus dem Sack. Der Artikel, und ein paar Ergänzungen im LCD Teil sind von mir) Als nächstes möchte ich mir entweder einen kleinen Frequenz- generator oder 'LED dimmen per WPM' vornehmen. Mal sehen ob ich am Wochenende dazu komme. Im Ernst. Dieses 'Wir haben ..' etc. stört mich selbst. Allerdings muss man einmal in diesem winzigen Editorfenster einen Artikel eintippen. Da siehst mann nämlich gar nichts. Und hinterher ... na ja, es war schon spät.
Karl heinz Buchegger wrote: > Im Ernst. Dieses 'Wir haben ..' etc. stört mich selbst. Allerdings > muss man einmal in diesem winzigen Editorfenster einen Artikel > eintippen. Da siehst mann nämlich gar nichts. Und hinterher ... > na ja, es war schon spät. Ich nehme den Mozilla mit dem mozex-Plugin. Da kann man an die Textfelder einen Editor seiner Wahl dranklemmen.
>So jetzt ist die Katze aus dem Sack. "Tach Herr Doktor!" >Ich wär überaus dankbar wenn mir jemand helfen würde Kann ich verstehen. Ich wäre aber vermutlich zu patzig...(mal schaun).
Rahul, der Trollige wrote: >>In Deiner Rechnung fehlt die Zeit, die das Programm bei jedem Overflow >>braucht, um den Timer mit dem Startwert nachzuladen. > > Naja, bei einem Vorteiler von 128 wären 128 Takte bis zum nächsten > Erhöhen des TCNT-Registers nötig. > Das sollte man hinkriegen... Wie ist das eigentlich: Wenn ich den Timer vorlade, wird dann die interne Prescaler- Teiler-Kette ebenfalls auf 0 gesetzt?
>wird dann die interne Prescaler-Teiler-Kette ebenfalls auf 0 gesetzt? Nein, warum auch? Es sind ja zwei verschiedene Register. Wenn man CSx = 0 setzt, bleibt der TCNT-Inhalt ja auch erhalten. >Naja, bei einem Vorteiler von 128 ... Der ist aber eher selten einstellbar... >Ich nehme den Mozilla mit dem mozex-Plugin. Da kann man an die >Textfelder einen Editor seiner Wahl dranklemmen. Kann man nicht einfach einen Text-Editor (z.B. PN2) seiner Wahl nehmen und dann per Copynpaste die Sachen rüberkopieren? (Ich habe mich bisher nur "konsumierend" mit Wikis beschäftigt...)
Rahul, der Trollige wrote: >>wird dann die interne Prescaler-Teiler-Kette ebenfalls auf 0 gesetzt? > > Nein, warum auch? Es sind ja zwei verschiedene Register. > Wenn man CSx = 0 setzt, bleibt der TCNT-Inhalt ja auch erhalten. Das dachte ich mir. Dann hat man immer noch dasselbe Problem (nur etwas kleiner). Sobald der Vorteiler nicht 1 ist, kann man nicht taktgenau nach x Zyklen eine Aktion ausführen lassen.
Karl heinz Buchegger wrote: >>>wird dann die interne Prescaler-Teiler-Kette ebenfalls auf 0 gesetzt? >> Nein, warum auch? Es sind ja zwei verschiedene Register. >> Wenn man CSx = 0 setzt, bleibt der TCNT-Inhalt ja auch erhalten. > Das dachte ich mir. Bei neueren AVRs kann man den Vorteiler anhalten und gemeinsam mit dem Timer starten. > Dann hat man immer noch dasselbe Problem (nur etwas kleiner). > Sobald der Vorteiler nicht 1 ist, kann man nicht taktgenau > nach x Zyklen eine Aktion ausführen lassen. Über CTC-Mode, ggf. halt mit dem OCx-Ausgang.
Jörg Wunsch wrote: > Karl heinz Buchegger wrote: > >>>>wird dann die interne Prescaler-Teiler-Kette ebenfalls auf 0 gesetzt? > >>> Nein, warum auch? Es sind ja zwei verschiedene Register. >>> Wenn man CSx = 0 setzt, bleibt der TCNT-Inhalt ja auch erhalten. > >> Das dachte ich mir. > > Bei neueren AVRs kann man den Vorteiler anhalten und gemeinsam > mit dem Timer starten. > >> Dann hat man immer noch dasselbe Problem (nur etwas kleiner). >> Sobald der Vorteiler nicht 1 ist, kann man nicht taktgenau >> nach x Zyklen eine Aktion ausführen lassen. > > Über CTC-Mode, ggf. halt mit dem OCx-Ausgang. Ja klar. Das war ja auch der Sinn dieses Uhr-Artikels im Tutorium. Irgendwie die Kurve vom Overflow zum CTC zu kratzen. Möglichst so, dass der geneigte Leser was dabei lernt, dabei irgendwas prakisch Brauchbares rauskommt und gleichzeitig auch noch die Motivation für einen CTC rübergebracht wird :-) Ist gar nicht so einfach, das alles unter einen Hut zu kriegen. Wenn dann auch noch das Programm nicht allzulang sein soll ....
> TCCR0A = (1<<WGM01); > TCCR0B = (1<<CS01); // PS = 8 > OCR0A = 249; // 500ms Oh 2 Register ... ist das nicht nur bei dem 16-bit Timer so? OCR0A = 249; //500ms wie kommst du auf diesen Wert? Kannst du hier mal eine Rechnung machen? z.B. für den Fall das ich genau 1000ms haben will?
@Karl heinz Buchegger Ich habe jetzt die Motivation auf CTC zu wechseln ;-)
Ich finde nichts zu dem Thema. Meine Vermutung ist, dass der Prescaler wirklich nur durch Verändern der CS-Bits zurückgesetzt wird. Aber das sollte man auch in der ISR machen können... Anderseits: Wenn CTC möglich ist, braucht man kein manuelles Timer-Nachladen (in C sowieso nicht). In Assembler wäre man noch dicht genug an der Maschine...
>Kannst du hier mal eine Rechnung machen?
Muß ich?
8/4MHz sind 2µs. 2µs * 250 = 500µs
Mist! Vertippt hat er sich auch noch.
So gerade Taktfrequenzen sind leider nicht "binärsystemkompatibel"...
Ich habe mir für sowas eine (Excel-)Tabelle gebastelt.
Mal sehen, wie die zuhause in OpenOffice.org 2.0 aussieht...
> Ich finde nichts zu dem Thema.
Im Datenblatt (in diesem Fall vom Tiny2313) im Abschnitt "Timer/Counter0
and Timer/Counter1 Prescalers"...
Wie Jörg schon angedeutet hat, man kann den Prescaler über das PSR10-Bit
im SFIOR zurücksetzen. Ein Ändern der CS-Bits setzt den Prescaler aber
nicht zurück! Außerdem ist darauf zu achten, dass Timer 0 und Timer 1
(sofern vorhanden) den selben Prescaler benutzen.
Upps, ich sehe grad, beim Tiny2313 steht das PSR10 im Register GTCCR und nicht im SFIOR...
>> Ich finde nichts zu dem Thema. >Im Datenblatt (in diesem Fall vom Tiny2313) im Abschnitt "Timer/Counter0 >and Timer/Counter1 Prescalers"... Gut, dass du das gefunden hast - da brauche ich nicht weiter suchen.
> Gut, dass du das gefunden hast
Naja, ich weiß nicht, wenn ich Infos zum Prescaler haben will, dann
schau ich doch im Kapitel "Prescaler" im Datenblatt nach... Ich bin eben
kein Zauberer, der als erstes das Buch raussucht, das mit der
Fragestellung am wenigsten zu tun hat...;-) (TP, The Last Hero, wenn ich
mich recht erinnere...)
oh 500us das ist ja schnell ... Wie hoch darf OCR0A sein? Muss ja bis 1 Sek einiges drauf.
> TCCR0A = (1<<WGM01); > TCCR0B = (1<<CS01); // PS = 8 > OCR0A = 249; // 500ms mmhh da stimmt was nicht. SIGNAL(TIMER0_COMPA_vect) { countTimer0++; } TIMER0_COMPA_vect wird nicht nochgezählt :-( Hab auch sei() gemacht und TIMSK |= (1 << OCIE0A );
> Das Compare Register OCR1A wird mit dem Wert 39999 vorbelegt.
Aus dem Tutorial
Bei mir sagt der Compiler: main.c:76: warning: large integer implicitly
truncated to unsigned type
bei OCR0A = 3999; // 1 sec
Wie groß darf OCR0A sein?
ARRGG im dem Tutorial http://www.mikrocontroller.net/articles/AVR-Tutorial:_Uhr ist wirklich einiges schiff, oder ich versteh es nicht: > Timer 1, ein 16 Bit Timer, wird mit einem Vorteiler von 1 betrieben. Dadurch > erreichen wir, dass wir den Timer taktgenau arbeiten lassen können. >Zusätzlich wird noch das WGM12 Bit bei der Konfiguration gesetzt. Dadurch >wird der Timer in den CTC Modus gesetzt. Dabei wird der Inhalt des Timers >hardwaremäßig mit dem Inhalt des OCR1A Registers verglichen. Stimmen beide >überein, so wird der Timer auf 0 zurückgesetzt und im nächsten Taktzyklus ein >OCIE1A Interrupt ausgelöst. Das Compare Register OCR1A wird mit dem Wert >39999 vorbelegt. Dadurch vergehen exakt 40000 Taktzyklen von einem Compare >Interrupt zum nächsten. Wie kommt er auf 40000 Taktzuylen bis zum nächsten Compare Interrupt ??
>Wie kommt er auf 40000 Taktzuylen bis zum nächsten Compare Interrupt ?? Er hat es errechnet... >Wie groß darf OCR0A sein? Da OCR0A 8 Bit breit ist, ist grösste Wert 255. OCR1A = 40000 dürfte eine Zeitbasis von 10ms ergeben bei 4MHz Taktfrequenz. Wie er darauf gekommen ist, steht da ja beschrieben. >mmhh da stimmt was nicht. Such! Finde den Fehler!
Richard Brose wrote: > ARRGG im dem Tutorial > http://www.mikrocontroller.net/articles/AVR-Tutorial:_Uhr ist wirklich > einiges schiff, oder ich versteh es nicht: > > Wie kommt er auf 40000 Taktzuylen bis zum nächsten Compare Interrupt ?? Ich wollte eine schöne runde Zahl haben. Bei 4 Mhz möchte ist es doch naheliegend den Timer bis 40000 zählen zu lassen. Im Interrupt dann noch bis 100 zählen und 1 Sekunde ist um. Man hätte den Timer auch bis 20000 zählen lassen können und im Interrupt dann bis 200 (so wars ursprünglich sogar, bis ich kurz vor "Artikel speichern" nachmal umgedreht habe :-) Ein Timerwert von 10000 wäre nicht so gut, denn dann müsste man im Interrupt bis 400 zählen. Und 400 passt nicht mehr in 1 8-Bit Register. Ein Timerwert von 50000 wäre auch gegangen, dann müsste man halt im Interrupt bis 80 zählen. Das hätte die CPU-Last noch ein klein wenig gesenkt. 60000 hingegen ist ganz schlecht, weil 60000 kein ganzzahliger Teiler von 4 Millionen ist. Ich hab aber dann trotzdem 40000 genommen. Dadurch taucht der Interrupt alle 1/100 Sekunden auf. Vielleicht baut ja mal wer eine Erweiterung auf eine Stoppuhr, dann kriegt er die 1/100 Sekunden gratis. Vielleicht bins auch ich der das macht, nachdem ich beschrieben habe, wie man mit 4 7-Segmentanzeigen einen Multiplex macht, 2 Lichtschranken an die Ports gebaut habe und damit die Fallzeit eines Körpers gemessen habe um daraus g zu berechnen :-) So ein Tutorium soll ja auch Spass machen.
>um daraus g zu berechnen :-) So ein Tutorium soll >ja auch Spass machen. Sowas macht dir Spaß? Da kann ich mir andere Sache besser vorstellen.
...ich bin froh um solche Beiträge; es kann ja nicht jeder in die 'Elite' geboren werden....
>...ich bin froh um solche Beiträge; es kann ja nicht jeder in die >'Elite' geboren werden.... Ich meinte "um daraus g zu berechnen"... Das Wiki finde ich auch wichtig.
Rahul, der Trollige wrote: >>um daraus g zu berechnen :-) So ein Tutorium soll >>ja auch Spass machen. > > Sowas macht dir Spaß? Da kann ich mir andere Sache besser vorstellen. Physik hat mir schon immer Spass gemacht. Muss ja nicht g sein. Kann ja auch die Rundenzeit auf einer Autorennbahn sein oder ...
Danke an alle ich habs jetzt geschnallt: z.B. 4000000Mhz/128 *1 = 31250 OCR0A = 31250 = 1 Sekunde ;-) Danke
> 4000000Mhz Also mit 4 GHz kommt da höchstens ne µs raus. Vermutlich wäre der AVR aber mit der Taktfrequenz hoffnungslos überfordert...;-)
...Schulligung, sind natürlich 4 THz... (4*10^6 * 10^6 = 4*10^12)
>...Schulligung, sind natürlich 4 THz... (4*10^6 * 10^6 = 4*10^12)
Wie soll man auch rechnen, wenn der Kopf (der Voodoo-Puppe) im Schredder
steckt? ;-)
> ...wenn der Kopf (der Voodoo-Puppe) im Schredder steckt...
Ach, deswegen... Hab mich schon gewundert.
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.