Denkfehler Timer ?

achim S.

Mitglied
Premium Benutzer
16 Jan 2010
561
8
18
Nähe Basel
Sprachen
ANSI C
Habe bei der Berechnun oder Versändnis einen Denkfehler drin. Takt ist 16MHz und Prescaler 1024.

"Der Systemtakt sei 16000000 Hz. Dann wird der Timer in 1 Sekunde 16000000 / 1024 = 15625 mal erhöht. Da der Timer wieder jedes Mal bis 65537 zählen muss bis ein Overflow auftritt, bedeutet dies, dass in 1 Sekunde 15625 / 256 = 61,035 Overflows auftreten."

Da hab ich wohl verrechnet. Etwas vom 8 und 16 Bit Timer durcheinander gebracht.
Bei einem Takt von 16MHz und einem Prescaler von 1024 und Timer 16 Bit wieviel Overflows pro Sekunde?
achim
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.376
61
48
Marwitz
Sprachen
BascomAVR, Assembler
Bei einem Takt von 16MHz und einem Prescaler von 1024 und Timer 16 Bit wieviel Overflows pro Sekunde?
Achtung, single-slope!

Frequenz der Timer-Schritte:
16MHz/1024=15,625kHz

Frequenz der Timer-Überläufe:
8bit entsprechen 2^8=256
15,625kHz/256=61,0352Hz

16bit entsprechen 2^16=65536
15,625kHz/65536=0,2384Hz (also etwa alle vier Sekunden ein Überlauf)

P.S.: falls Du ein Android-Gerät hast, kannst Du ja mal schauen ob die hier noch geht...

Edit: Komma eingefügt...
 
Zuletzt bearbeitet:

achim S.

Mitglied
Premium Benutzer
16 Jan 2010
561
8
18
Nähe Basel
Sprachen
ANSI C
Eigentlich hatte ich so was ähnliches Ausgerechnet doch dem Wert nicht getraut.
Danke für deine Hilfe
achim
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.376
61
48
Marwitz
Sprachen
BascomAVR, Assembler
Stimmt das mit 2^16 = 65536
Ja, der Zähler kann von 000016 = 00000000000000002 = 010 bis FFFF16 = 11111111111111112 = 6553510 zählen.
Der 65536te Schritt ist dann der Überlauf zurück auf die 0.
Also TopWert+1 Schritte.

Das betrifft aber den single slope. Wird der Timer im dual slope betrieben, zählt er zwischen 0 und dem Top-Wert hin und her - also 65535-Schritte von 0 bis 65535 hoch und weitere 65535-Schritte wieder runter zur 0 (beim erreichen der Null wird der TOV ausgelöst).
Also 2xTopWert Schritte.
 

addi

Mitglied
2 Sep 2013
118
4
18
Hamminkeln
Sprachen
BascomAVR, ANSI C, Assembler
Hmmm....
Die dimensionsangabe stimmt nicht.
Wenn man 16mhz ÷ 1024 rechnet erhält man hz und nicht khz...ausser man würde das komma in der khz angabe richtig setzen

Der einwurf ist nur was für nickelige :)
73 addi
 

addi

Mitglied
2 Sep 2013
118
4
18
Hamminkeln
Sprachen
BascomAVR, ANSI C, Assembler
Hmmm...ich habe nicht auf gross/kleinschreibung geachtet...und werde es auch nicht tun.
 

achim S.

Mitglied
Premium Benutzer
16 Jan 2010
561
8
18
Nähe Basel
Sprachen
ANSI C
Das betrifft aber den single slope. Wird der Timer im dual slope betrieben, zählt er zwischen 0 und dem Top-Wert hin und her - also 65535-Schritte von 0 bis 65535 hoch und weitere 65535-Schritte wieder runter zur 0 (beim erreichen der Null wird der TOV ausgelöst).
Also 2xTopWert Schritte.
Bin langsam total verwirrt. Sorry welche Angabe stimmt den jetzt, 65535 oder 65536 oder 65537? Geht ja von 0 bis 16 Bit
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.376
61
48
Marwitz
Sprachen
BascomAVR, Assembler
Ein sechzehn-Bit-Timer besitzt ein Zählregister mit (*Trommelwirbel*) sechzehn Bit (*Tusch*) (diese sind also in zwei Byte-Registern untergebracht - TCNTnL und TCNTnH oder so).
Mit sechzehn Bits sind die Zahlen 0..65535 darstellbar (eben, genau 65536 zahlen, 2^16).
0000000000000000..1111111111111111

Genau das hatte ich in #5 schon geschrieben.

Im Single Slope zählt er direkt nach einem Überlauf auf null ...
von null nach eins -> erster Schritt
von eins nach zwei -> Zweiter
von zwei nach drei -> Dritter
...
von 65534 nach 65535 -> 65535ter
von 65535 nach null -> 65536ter -> Überlauf

Der Top-Wert ist 65535, 2^16-1, klar? Und alle 65536 Schritte erfolgt ein Überlauf (Topwert+1).

Wenn allerdings ein Modus mit dual Slope (=Phasenkorrekter PWM) gewählt ist, zählt der Timer immer zwischen null und dem Topwert hin und her (rauf und runter).
Also (wenn der maximal mögliche Topwert=65535 gewählt ist)...
0 -> 1 -> 2 -> 3 -> ... -> 65533 -> 65534 -> 65535 -> 65534 -> 65533 -> ... -> 3 -> 2 -> 1 -> 0 -> 1 -> 2 -> ...
Also 65535 Schritte rauf und 65535 Schritte runter. Zwei mal Topwert.
Das Überlauf-Flag wird dann jedesmal gesetzt, wenn der Timer die Null erreicht.

Stimmt das mit 2^16 = 65536 oder muss das 65537 sein? Von 1 bis 65536 und 0?
(*Zaunpfahl ausgrab*)… 2^16=0x1_00_00 bzw 1_00000000_00000000 binär. Bit siebzehn wäre gesetzt ;) Das wird aber nicht mehr dargestellt (da eben nur sechzehn Bit. Genau da erfolgt der Überlauf (im single slope).
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.376
61
48
Marwitz
Sprachen
BascomAVR, Assembler
Ich beiß hier gleich 'n Stück aus' m Tisch...
Der Topwert eines 16bit-Timers ist 2^16-1=65535.
Überlaufen tut er im Single slope dann alle 2^16=65536 Schritte.
 

achim S.

Mitglied
Premium Benutzer
16 Jan 2010
561
8
18
Nähe Basel
Sprachen
ANSI C
Nicht gleich in den Tisch beissen. Das selbe hab ich auch gesagt. Der Überlauf erfolgt alle 65536 Schritte. Sorry wenn ich es unklar ausgedrückt habe.
Noch was zum klären dabei. Wenn ich die Zeit in einem 16 Bit Timer berechnen will, rechen ich dann mit 65535 oder 653536?
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.292
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Noch was zum klären dabei. Wenn ich die Zeit in einem 16 Bit Timer berechnen will, rechen ich dann mit 65535 oder 653536?
Du meinst die Zeit, die der Timer von 0 bis zum Überlauf (wieder auf 0) benötigt? Bei der letzten Zahl hast du dich wahrscheinlich verschrieben, ich kann mir die nämlich sonst nicht erklären. Also @LotadaC hat dies ja schon mehrfach erklärt: Überlauf nach 65536 Takten.

tOV = 65536 * tCLK
tOV ist die Zeit des Überlaufs. Wenn der Timer frei läuft und du einen Overflow Interrupt aktiviert hast, dann tritt der alle tOV auf.
tCLK ist der Takt für den Timer, also ggf. noch einen PRESCALER berücksichtigen.
 

LotadaC

Sehr aktives Mitglied
22 Jan 2009
3.376
61
48
Marwitz
Sprachen
BascomAVR, Assembler
Nein, hast Du nicht...
Es sind also 65536. das sind 2^16 + 1 im single slope
65536=2^16. Ohne plus eins.
Im Dezimalsystem hast Du zehn Ziffern: Null bis Neun. Der Topwert einer Deezimalstelle ist die Neun, nicht die Zehn. Ein Überlauf erfolgt alle zehn Schritte, und zwar vom Topwert ( = 9 ) zur Null.

Wenn ich die Zeit in einem 16 Bit Timer berechnen will
Welche Zeit?

Du hast an oder in Deinem Controller irgendeine Taktquelle gewählt, zB 'nen externen Quarz mit 16MHz.
Deren Takt kann durch den Main Clock Prescaler runtergeteilt werden (zB durch acht auf 2MHz -> CLKDIV8 Fusebit) - wir nehmen aber mal 'n Teiler von eins an: Der effektive Systemtakt ist also auch 16MHz.
Das ist auch gleichzeitig der IO-Takt, der unter anderem die Timer bedienen kann.

Die Timer besitzen je eigene Vorteiler, die diesen Takt nochmal runterteilen können - wenn hier zB ein Teiler von 64 gewählt wurde, wird der Timer selbst mit 250kHz getaktet. Also die Frequenz, mit der der Timer inkrementiert.
Mit welcher Frequenz er überläuft hängt davon ab, wieviele Schritte er pro Überlauf macht (Timer-Schrittfrequenz durch Schrittanzahl).
Im singleSlope sind es Topwert+1 Schritte.
Im dualSlope sind es 2xTopwert Schritte.

Der maximale Topwert eines 16bit-Timers ist 2^16-1=0xFFFF=65535.
Die Anzahl der Schritte pro Überlauf also dann 2^16=0x10000=65536.
Folglich hätten wir 'ne Überlauffrequenz von 250000Hz/65536=3,815Hz.
Das entspricht einer Durchlaufzeit von 0,26s.

Warum reite ich so auf dem Topwert rum?
Weil Du den Timer je nach gewähltem Modus auch als 8, 9 oder 10 Bit Timer einstellen kannst, bzw den Topwert selbst auf einen beliebigen Wert (zwischen 0..65535) festlegen kannst (Stichwort CTC etc)
Wenn Du den Topwert auf 42 festlegst, läuft der Timer im singleSlope alle 43 Schritte über, im dualSlope erreicht er alle 84 Schritte die null.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)