Forum: Compiler & IDEs 8Bit Timer keine genaue Sekunde?


von Richard Brose (Gast)


Lesenswert?

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.

von Rahul, der Trollige (Gast)


Lesenswert?

Uhren programmiert man nicht per Timer-Reload sondern per CTC. Damit ist 
(fast) jede beliebige Zeitbasis erzeugbar.

von johnny.m (Gast)


Lesenswert?

> 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?

von Rahul, der Trollige (Gast)


Lesenswert?

>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...

von Rahul, der Trollige (Gast)


Lesenswert?

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...)

von Christoph Kessler (db1uq) (Gast)


Lesenswert?

Hoffen wir das beste lieber Leser für unseren Titelhelden - Forts folgt
das ist pluralis maiestatis, Wir dero Gnaden verfügen...

von Richard Brose (Gast)


Lesenswert?

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?

von Stefan (Gast)


Lesenswert?

> 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.

von Rahul, der Trollige (Gast)


Lesenswert?

>Wie sieht der Code aus um in zu aktivieren?

TCCR0A = (1<<WGM01);
TCCR0B = (1<<CS01); // PS = 8
OCR0A = 249; // 500ms

von Rahul, der Trollige (Gast)


Lesenswert?

>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.

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Rahul, der Trollige (Gast)


Lesenswert?

>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).

von Karl H. (kbuchegg)


Lesenswert?

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?

von Rahul, der Trollige (Gast)


Lesenswert?

>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...)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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 ....

von Richard Brose (Gast)


Lesenswert?

> 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?

von Richard Brose (Gast)


Lesenswert?

@Karl heinz Buchegger

Ich habe jetzt die Motivation auf CTC zu wechseln ;-)

von Rahul, der Trollige (Gast)


Lesenswert?

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...

von Rahul, der Trollige (Gast)


Lesenswert?

>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...

von johnny.m (Gast)


Lesenswert?

> 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.

von johnny.m (Gast)


Lesenswert?

Upps, ich sehe grad, beim Tiny2313 steht das PSR10 im Register GTCCR und 
nicht im SFIOR...

von Rahul, der Trollige (Gast)


Lesenswert?

>> 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.

von johnny.m (Gast)


Lesenswert?

> 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...)

von Richard Brose (Gast)


Lesenswert?

oh 500us das ist ja schnell ...
Wie hoch darf OCR0A sein? Muss ja bis 1 Sek einiges drauf.

von Richard Brose (Gast)


Lesenswert?

> 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 );

von Richard Brose (Gast)


Lesenswert?

> 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?

von Richard Brose (Gast)


Lesenswert?

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 ??

von Rahul, der Trollige (Gast)


Lesenswert?

>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!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Rahul, der Trollige (Gast)


Lesenswert?

>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.

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

...ich bin froh um solche Beiträge; es kann ja nicht jeder in die 
'Elite' geboren werden....

von Rahul, der Trollige (Gast)


Lesenswert?

>...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.

von Karl H. (kbuchegg)


Lesenswert?

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 ...

von Richard Brose (Gast)


Lesenswert?

Danke an alle ich habs jetzt geschnallt:

z.B.

4000000Mhz/128 *1 = 31250


OCR0A = 31250 = 1 Sekunde

;-)

Danke

von johnny.m (Gast)


Lesenswert?

> 4000000Mhz
Also mit 4 GHz kommt da höchstens ne µs raus. Vermutlich wäre der AVR 
aber mit der Taktfrequenz hoffnungslos überfordert...;-)

von johnny.m (Gast)


Lesenswert?

...Schulligung, sind natürlich 4 THz... (4*10^6 * 10^6 = 4*10^12)

von Rahul, der Trollige (Gast)


Lesenswert?

>...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? ;-)

von johnny.m (Gast)


Lesenswert?

> ...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
Noch kein Account? Hier anmelden.