Berechnung Zeit/Frequenz beim Prescaler/Timer

#3891028
Lesenswert?

Hallo Gemeinde
Ich suche einen vernünftigen und nachvollziebaren Weg zur Berechnung der 
Freueunz/zeit beim Timer.

Gegeben:
16 MHz / 8 MHz Quarz
CTC

Gesucht:
Zeit/Impuls 1ms  10ms  25ms

Notwendig:
Prescaler
Preloader

Im Netz habe ich schon verschiedene Methoden zur Berechnung gefunden. 
Leider sind die wenigsten einfach nach zu vollziehen.

                    Fosc
 Prescaler = ------------------------------
              4 x Timer x (256 - Preload)

Habe z.B. diese umgestellte Formel gefunden. Leider verstehe ich nicht 
wo die 256 herkommen und wieso 4 x Timer. Woher kommt Preload?
Einige Klarheit hat FAQ Timer gebracht, leider nicht alles.
Könnte es mir jemand erklären?
achim
#3891102
Lesenswert?

Achim Seeger schrieb:

>
>                     Fosc
>  Prescaler = ------------------------------
>               4 x Timer x (256 - Preload)
>
> Habe z.B. diese umgestellte Formel gefunden.

Die ist auch Quatsch.
Denn den Prescaler kannst du auf einem AVR nicht einfach ausrechnen.
DIe Prescaler sind dir aufs Auge gedrückt. Du kannst dir einen aus den 
verfügbaren aussuchen, mehr aber auch nicht.

> Leider verstehe ich nicht
> wo die 256 herkommen

Wenn in der Informatik irgendwo 256 auftaucht, dann kannst du deinen 
Allerwertesten darauf verwetten, dass das in irgendeiner Form was mit 8 
Bit bzw. der Tatscache zu tun hat, dass 2 hoch 8 die 256 ergibt.

> und wieso 4 x Timer.

Lass mich raten. Das ist für einen anderen Prozessor und nicht für einen 
AVR

> Woher kommt Preload?

Preload willst du nicht. Dazu gibt es ja den CTC Modus.

> Einige Klarheit hat FAQ Timer gebracht, leider nicht alles.

Was ist denn unklar?
#3891119
Lesenswert?

Gut, versuchen wir mal einfach zu denken.
Der Prescaler ist vorgegeben. Muss mir nur den richtigen aussuchen.
Nehmen wir mal an, ich will bei einem Quarz von 8 MHz und 16 MHz einen 
Impuls von 1ms haben.
Es stehem mir Prescaler mit 2,4,8,16,32,64,128 und 256 zur Verfügung.
Ich kann meine Q-frequenz damit teilen in Abhängigkeit von 8 oder 16. Da 
muss ich dann solange probieren bis ich in meinen Bereich komme. Geht 
das nicht einfacher?
Werde mir den FAQ Timer noch mal vornehmen. Wahrscheinlich sehe ich 
alles zu kompliziert, bin aber neugierig
achim
#3891129
Lesenswert?

Achim Seeger schrieb:
> Gut, versuchen wir mal einfach zu denken.
> Der Prescaler ist vorgegeben. Muss mir nur den richtigen aussuchen.
> Nehmen wir mal an, ich will bei einem Quarz von 8 MHz und 16 MHz einen
> Impuls von 1ms haben.
> Es stehem mir Prescaler mit 2,4,8,16,32,64,128 und 256 zur Verfügung.
> Ich kann meine Q-frequenz damit teilen in Abhängigkeit von 8 oder 16. Da
> muss ich dann solange probieren bis ich in meinen Bereich komme. Geht
> das nicht einfacher?

ja.
Du hast ganze 8 mögliche Teiler zur Verfügung.
1 wird es nicht sein. Denn ein 8 Bit Timer kann nur bis 255 zählen. 
Treibst du den mit 8Mhz an, dann brauch ich gar nicht rechnen um zu 
wissen, dass der wesentlich schneller bei 256 angelangt ist, als in 1ms.

Aber ich kann ja zurückrechnen.
Um wieviel muss ich die 8Mhz (8 Millionen Pulse pro Sekunde) 
'untersetzen', damit 256 Pulse 1 Millisekunde dauern?

Oder anders ausgedrückt: Wenn ich dem Timer zugestehe, in 1 Millisekunde 
bis 255 zählen zu dürfen, wie weit kommt er dann in 1 Sekunde?
Easy. 256 mal 1000 (weil ja 1 Sekunde 1000 Millisekunden hat). Das sind 
256000.
So schnell darf der Timer also zählen, damit sich meine Zeitvorgabe 
erfüllt.
Tatsächlich zählt er aber 8000000 Pulse pro Sekunde. Um wieviel muss ich 
ihn daher untersetzen. Um einen Faktor 8000000 / 256000. Die 0-en Kürzen 
und es bleibt 8000 / 256. Ausgerechnet ist das 31.25
Das wäre also mein idealer Teilerfaktor (Prescaler). Wenn es den gäbe, 
dann würde dieser Timer in genau 1 Millisekunde bis 255 zählen.
Nur blöderweise gibt es den nicht.
Ein kleinerer Teilerfaktor ist sinnlos, dann dann zählt der Timer ja 
schneller. Also nehm ich den nächst größeren. Das ist 32. Super.

Jetzt rechnen wir in die umgekehrte Richtung. Bei einem Prescaler von 1 
würde der Timer 8000000 Pulse pro Sekunde zählen. Mit einem Prescaler 
von 32 schafft er nur noch 8000000/32 = 250000

Schön. Wenn der Timer also in 1 sekunde bis 250000 zählen würde, wie 
weit kommt der dann in 1/1000 davon, in 1 Millisekunde? Na bis 
250000/1000 = 250.

D.h. Ich muss den Timer so einstellen, dass er jeweils nur bis 250 
zählt. Dann hab ich bei 8Mhz Taktfrequenz und einem Vorteiler von 32 es 
so eingerichtet, dass dieses 250 Pulse abzählen genau 1 Millisekunde 
dauert.

Was ist da jetzt schwer drann? Das ist nicht mehr als rechnen auf 
Grundschulnniveau und (wie immer) ein bisschen Dreisatz.
Gast #3891141
Lesenswert?

So schwer ist das nicht:

du hast deine Taktquelle, die wird durch den Prescaler geteilt, dann 
hast du deine Zählerfrequenz. Diese wird dann noch durch die Zählergröße 
(8-bit-Zähler 2^8= 256, 16-bit eben 2^16) geteilt und dann hast du deine 
überlauffrequenz, mit der z.B. eine ISR aufgerufen wird.
Im CTC-Mode nimmst du nicht die Zählergröße sondern den Wert, den du ins 
OCRx-Register schreibst (maximal Zählergröße). Gerade deswegen eignet 
sich der CTC-Mode für solche Timing-Geschichten.

Demnach ist die Formel

F_osc / (prescaler * OCRx) = F_isr

dann nur nach OCRx umstellen, denn F_isr ist gegeben.

Ich leg mir da eine Excel-Tabelle an, sodaß OCRx für jeden Prescaler 
berechnet wird. dann einfach schauen, bei welchen Prescalerwerten OCRx 
in deine Zählergröße passt. Das sind die möglichen Prescaler, die du 
nutzen kannst. Bei mehreren kannst du noch überlegen, welcher 
geschickter ist, manchmal spielt die Genauigkeit eine Rolle.
Gast #3891445
Lesenswert?

Guten morgen, alle Fit?
Da habe ich gestern wohl die falsche Tabelle gesehen. Sorry
Der richtige Prescaler ist 8,32,64,128,256 und 1024
Diese unterscheiden sich die den einzelnen Timern:

Timer 0 / 8 Bit
CS02 CS01 CS00
 0    0    0   kein Clock
 0    0    1   no prescaling
 0    1    0   8
 0    1    1   64
 1    0    0   256
 1    0    0   1024

Timer 1/3 / 16 Bit
CSn2 CSn1 CSn0
 0    0    0   kein Clock
 0    0    1   no prescaling
 0    1    0   8
 0    1    1   64
 1    0    0   256
 1    0    1   1024

Timer 2 / 16 Bit
CS22 CS21 CS20
 0    0    0   kein Clock
 0    0    1   no prescaling
 0    1    0   8
 0    1    1   32
 1    0    0   64
 1    1    0   256
 1    1    1   1024

Habe mal die Daten für die Timer zusammengesucht. Unterschieden sich 
alle ein bischen.
achim
Gast #3891471
Lesenswert?

Hi

>Timer 2 / 16 Bit
>CS22 CS21 CS20
> 0    0    0   kein Clock
> 0    0    1   no prescaling
> 0    1    0   8
> 0    1    1   32
> 1    0    0   64
> 1    1    0   256
> 1    1    1   1024

Hier fehlt noch

1    0    1   128

>Unterschieden sich alle ein bischen.

Bei drei Bit für CS gibt es acht Möglichkeiten. Timer2 hat, da kein 
externer Takt möglich ist, halt zwei Prescalerstufen mehr.

Bei ATTinys mit PLL gibt es auch Timer mit 15 verschiedenen (+ Stop) 
Prescalerstufen.

MfG Spess
Gast #3891495
Lesenswert?

Achim Seeger schrieb:
> Ich suche einen vernünftigen und nachvollziebaren Weg zur Berechnung der
> Freueunz/zeit beim Timer.
>
> Gegeben:
> 16 MHz / 8 MHz Quarz
> CTC
>
> Gesucht:
> Zeit/Impuls 1ms  10ms  25ms

Eine ganz einfache Lösung ist, einen 16-Bit Zähler mit /8 Vorteiler zu 
verwenden. Bei 8 MHz wird der Zähler mit 1µs getaktet und muß bis 1000, 
10000 oder 25000 zählen, um genau die gewünschten Zeiten zu erhalten.
Bei 16 MHz verdoppeln sich die Werte für den Zähler.
Man kann auch einen Basistakt mit 1 kHz erzeugen und bei längeren Zeiten 
per Software jede gewünschte (auch ganz lange) Zeit durch Abzählen einer 
Variable im 1 ms Raster erhalten.

Um den Zähler für andere Anwendungen nicht zu blockieren, läßt man ihn 
frei durchlaufen und verwendet ein Output-compare-Register, um zum 
gewünschten Zeitpunkt einen Interrupt zu erhalten. Im Interrupts selbst 
wird dann OCRx um die neue Periode erhöht. Überläufe sind dabei egal.

ein kurzes Beispiel:

#define MS_TEILER 1000              // bei 8 MHz mit /8 Vorteiler
ISR(TIMER1_COMPA_vect)              // wird mit 1000 Hz aufgerufen
{
  OCR1A += MS_TEILER;
  ....
}
Gast #3891569
Lesenswert?

Hallo Spess
Du hast recht. Habe die 128 nicht eingetragen. Wenn ich alle 3 Tabellen 
nebeneinander lege, sehe ich den Unterschied recht deutlich
Es geht dabei nicht um mich, sondern wie man Anfängern es plausibel 
erklären kann. Es gibt viele Beschreibungen im Netz. Bei einigen muss 
man schon einen Dr Titel haben, um es zu verstehen. Es soll einfach und 
plausibel sein, je einfacher etwas erklärt wird um si weniger Rückfragen 
gibt es.

Hallo mn
Genau so mache ich es auch bei meinen Timern. KH hat mich schon in diese 
Richtung geleitet. Ist eine einfache Lösung und gut. Denn Rest muss ich 
da zu noch formulieren.

achim
Gast #3891731
Lesenswert?

Hallo Karl Heinz
habe deinen Text durchgelesen. Ist einfach erklärt und verständlich. Es 
geht mir dabei nur um das einfache daran. Kompliziert erklären es auch 
andere. Es soll kurz und bündig und verständlich sein. Werde es so 
nehmen und noch ein bischen anpassen. Dann kann ich mich an das nächste 
Problem dazu machen.
Danke an alle
achim
#3901489
Lesenswert?

Hallo
so weit ist mir alles (viel) klar geworden.
Bin jetzt aber auf eine kleine Lücke gestossen.
Unterschied 8 Bit Timer und 16 Bit Timer
Wenn ich ein Impuls von 1ms erzeugen will ist der 8 Bit Timer für mich 
am besten.
Will ich aber einen Impuls von 10ms erzeugen könnte ich ja den 8 Bit 
oder 16 Bit Timer nehmen. Wie kann ich am besten ausrechnen welchen 
Timer ich nehme oder halt nicht?
Gehe dabei nach dem Text von KH.
achim
#3901516
Lesenswert?

Achim Seeger schrieb:
> Hallo
> so weit ist mir alles (viel) klar geworden.
> Bin jetzt aber auf eine kleine Lücke gestossen.
> Unterschied 8 Bit Timer und 16 Bit Timer

Unterschied vom Zählen mit 5 Fingern versus dem Zählen mit 10 Fingern.

> Wenn ich ein Impuls von 1ms erzeugen will ist der 8 Bit Timer für mich
> am besten.

Kann man so nicht sagen.

> Will ich aber einen Impuls von 10ms erzeugen könnte ich ja den 8 Bit
> oder 16 Bit Timer nehmen. Wie kann ich am besten ausrechnen welchen
> Timer ich nehme oder halt nicht?

Falscher Ansatz.
Du nimmst das was du hast und was gut passt ohne dass du dich verrenken 
musst. Wenn du den 16 Bit Timer nicht anderweitig inkompatibel benutzt 
UND es sich mit den Zahlen gut ausgeht, dann nimmst du den auch.

Wenn du absehbar in deinem Programm noch eine Funktionalität brauchst, 
bei der du den 16 Bit Timer gut gebrauchen kannst UND du dich mit den 
gewünschten 10ms nicht allzusehr in der Timerverwendung binden willst, 
dann nimmst du eben den 8 Bit Timer, wenn es sich mit den Zahlen 
einigermassen gut ausgeht, ohne dass du im Programm Verrenkungen machen 
musst.

Rechnen ist schon wichtig. Aber manchmal entscheidet dann auch eben das 
Bauchgefühl und das Wissen, dass bei viel AVR der Timer 0 als 8 Bit 
Timer ein paar Dinge eben nicht kann. Ob das so ist und welche Dinge das 
sind, steht im Datenblatt. Geht es mir nur um ca 10ms für zb eine 
Entprellung UND geht sich mein Zahlenwerk bei 11.0592Mhz Taktfrequenz so 
aus, dass ich damit locker auf 8.5ms komme, dann werd ich wahrscheinlich 
auf einem Mega 8 den 8 Bit Timer 0  nehmen und mir den 'kostbareren' 
Timer 1 mit seinen PWM Möglichkeiten für was anderes aufheben. Brauch 
ich absehbar nichts anderes, oder reicht mir die banale PWM Möglichkeit 
des Timer 0, ist es gehupft wie gehatscht welchen ich nehme.

Und ja. Es kommt durchaus auch vor, dass man zuerst mit einem Timer 
anfängt und es sich dann im Lauf der weiteren Entwicklung rausstellt, 
dass man keine gute Entscheidung getroffen hat, weil man bestimmte 
Fähigkeiten genau dieses Timers jetzt gut brauchen könnte. Dann 
disponiert man eben um und baut das vorhandene auf einen anderen Timer 
um.

Du machst da jetzt Raketentechnik draus. Letzten Endes geht es um die 
Fragestellung: Fahr ich mit dem Smart oder mit dem Peugeot?
#3901571
Lesenswert?

Hallo KH
Das mir dem kostbaren Timer habe ich mir im Moment gespart. Für den 
Anfänger ist das eine andere Sache. Es geht dabei wieder um das 
Grundlegende. Wenn ich z.B. für die Entprellung einen 10ms oder 20ms 
Timer nehme möchte ich es anpassen. Es geht auch die Version, von einem 
1ms Timer alles andere ausrechen (mache ich jetzt). Deinen Text (weiter 
oben) habe ich umgesetzt in einen Text mit Formeln. Noc ein bischen dazu 
schreiben, dann stelle ich es hier rein. Doch wie stelle ich fest 
welcher am besten geeignet ist oder welchen ich nicht verwenden kann. 
Ein teil kann ich dazu ausrechen mit den Prescalern und den Wert 
ausreche. Dann kommt die Stelle, wo es mit beiden geht und dann die 
Stelle nur mit 16 Bit. Daraus resultieren die 3 Bereiche. Welcher wann 
verwenden oder eine Gegenrechnung dazu.
Das mit Exel ist nicht schlecht. Möchte es aber zu Anfang alles per Fuss 
machen um das Verständnis zu bringen. Es gibt auch alle Möglichen 
Programme dazu. Man gibt die Werte ein, der Rest wird berechnet und 
angezeigt. Nach welchem Ansatz erfolgt die Berechnung?
Das mit dem PWM kommt später, alles nach einander. Erst eine Sache 
verstehen, dann das nächste.
achim
(Firma: Vescomp) #3901582
Lesenswert?

Marc Vesely schrieb:
> Achim Seeger schrieb:
>> Will ich aber einen Impuls von 10ms erzeugen könnte ich ja den 8 Bit
>> oder 16 Bit Timer nehmen. Wie kann ich am besten ausrechnen welchen
>> Timer ich nehme oder halt nicht?
>
>  Indem du Excel benutzst.

 Damit es nicht beim nutzlosen Kommentar bleibt...
Angehängte Dateien:
#3904910
Lesenswert?

Hallo Forum
nach der zahkreichen Hilfe, besonders von KH, möchte ich euch die 
einfache Erklärung zum Timer nicht vorenthalten. Habe versucht alles so 
einfach wie möglich darzustellen. Vielleicht kann jemand drüber schauen 
und es noch mal kontrollieren. Bestimmt sind einige Fehler drin oder 
falsch dargestellt. Bitte mal kontrollieren.
Sorry, habe es als Text angehängt, damit jeder seine Änderungen 
anschreiben kann
achim
Angehängte Dateien:
Gast #3905077
Lesenswert?

Marc Vesely schrieb:
> Werner schrieb:
>> Warum nennst du eine Zip-Datei ".docx"?
>
>  Weil es ein Word Document ist.

Ich zitiere aus der nagelneuen c't 26/2014 S.10 aus dem Leserbrief 
"Nicht die x-Formate nehmen":
"Wer eine Standardistallation einer neueren Version von MS Office 
durchführt, erhält als Voreinstellung docx, xlsx und pptx sowie 
Schriftarten wie Cambria, die nicht freigegeben wurden und daher in 
anderen Office-Paketen nicht zu Verfügung stehen."

Ich denke, hier ist es aus Unwissenheit passiert, aber eine für Alle 
lesbare Form wäre besser gewesen. Persönlich lehne ich es ab, anderen 
Dateiformaten 'hinterher zu rennen'.
#3905619
Lesenswert?

Zur Berechnung des CTC-Timers (1)verwende ich folgende Berechnung 
(Bascom, _xtal ist die Quarzfrequenz):

'#######################################################################
'***********************************************************************
'   *****   Initialisierung  des CTC-Timers                       ******
'***********************************************************************

'   Abstand der IRQ-Impulse
'
'   Const _irq_abstand = s_mmm_µµµ_nnn    Muster
    Const _irq_abstand = 0_020_000_000  ' in nsec, HIER ZEIT EINTRAGEN

'   Stufenweise die Timerzeit verlängern

'   Const _irq_stufe_1 = sss_mmm          Muster
    Const _irq_stufe_1 = 001_000        ' in msec, HIER ZEIT EINTRAGEN

    Dim Ticker As Byte
'----------------------------------------------------------------------*

'    Gesamten Wert Berechnen Für Timer1
Const _irq_teiler_max = Int((_xtal * _irq_abstand /(1000000000)) + 0.5)

'    Prescaler Einstellung für Timer1 bestimmen
'    Const _irq_vorteiler -> Einstellmöglichkeiten: 1/8/64/256/1024
#if _irq_teiler_max > &H00FF_FFFF
   Const _irq_vorteiler = 1024
#elseif _irq_teiler_max > &H003F_FFFF
   Const _irq_vorteiler = 256
#elseif _irq_teiler_max > &H0007_FFFF
   Const _irq_vorteiler = 64
#elseif _irq_teiler_max > &H0000_FFFF
   Const _irq_vorteiler = 8
#else
   Const _irq_vorteiler = 1
#endif

'     Aus Prescaler-Wert die Einstellung des Timer-Registers berechnen
Const _irq_teiler = Int((_xtal * _irq_abstand / _
                    (1000000000 * _irq_vorteiler )) + 0.5) -1

'     Aus _irq_abstand Einstellung für die 1. Stufe berechnen
Const _irq_wert_1 = Int((1000000 * _irq_stufe_1 / _irq_abstand ) + 0.5)

'     Initialisiere timer1
Config Timer1 = Timer , Prescale = _irq_vorteiler , Clear Timer = 1 , _
                        Compare A = Disconnect

Ocr1a = _irq_teiler
On Oc1a Irq_ctc_timer

'     Timer1 freigeben und starten
Enable Oc1a
Enable Interrupts                       ' Interrupts freigeben

'  zur Überpüfung der Einstellwerte mit Simulator
'  PRINT NUR IM SIMULATOR FREIGEBEN
'  Print "Prescaler = " ; _irq_vorteiler
'  Print "Timerregister (max 65535) = " ; _irq_teiler
'  Print "_irq_wert_1 (max 255) = " ; _irq_wert_1


Gruß  Alex
(Firma: Vescomp) #3905661
Lesenswert?

Achim Seeger schrieb:
> Danke. ist mir gar nicht aufgefallen, Habe es sofort korrigiert und noch
> einige andere Stellen im Text mit gleichen Fehler
Alex D. schrieb:
> Zur Berechnung des CTC-Timers (1)verwende ich folgende Berechnung

 Hier, habe die Excel-Datei etwas erweitert, um die Berechnung für Timer
 und Baud zu erleichtern.
Angehängte Dateien:
#3905708
Lesenswert?

Achim Seeger schrieb:
> Sorry, bei basic passe ich,

Die Berechnung macht der Compiler, nicht das Basic-Prg. , das wird doch 
in C oder anderen Sprachen vermutlich ähnlich sein. Vorgegeben wird nur 
die Quarzfrequenz und die gewünschte Interruptzeit (Const _irq_abstand = 
in nsec) , fertig. Habe lange daran gebastelt, bis es so einfach 
einzustellen war.

Nur die Übertragung der Werte in die Timeregister übernimmt Bascom.

Gruß  Alex
#3906058
Lesenswert?

1
Ich muss den 8-Bit Timer so einstellen, dass er jeweils nur bis 156 zählt.
2
Dann hab ich bei 16 MHz Taktfrequenz und einem Vorteiler von 156 es so
3
eingerichtet, dass diese 256 Pulse abzählen genau 10 Millisekunden dauern.

Nope. Du hast es eben nicht so eingerichtet, dass dieses Timersetup zu 
'genau' 10ms führt.

Das Ergebnis deiner OCR-Wert Berechnung war keine ganze Zahl, damit 
kriegst du auch die Zeit nicht exakt hin, wenn du nicht mehr tust, als 
diese ins OCR zu laden.

Ich hab mir die Zahlen nicht weiter angesehen. Aber manchmal kann es 
sich lohnen, auch mal andere Vorteiler zu untersuchen, ob man damit 
einen besseren OCR Wert hinkriegt. Besser in dem Sinne, dass man näher 
an eine ganze Zahl rann kommt.
Gast #3906082
Lesenswert?

Hallo Karl Heinz
Danke für deine Hilfe. Hatte die Stelle noch nicht so ernst genommen. In 
der Tabelle unten habe ich die Daten angegeben,dort steht bei 16 MHz 
Quarz, 10ms, 8 Bit Timer ein Prescaler mit 1024 ergibt Compare von 155. 
Ergibt einen Fehler von -16 us. Ist deutlich zu sehen das die es die 
einzige Möglichkeit ist.
Sorry, bin ich garnicht von dir gewöhnt. Kaum Fehler gemacht, man ist 
das komisch. Ist hoffentlich so, wenn man vom besten lernt.
Mir geht es nur darum, das es verständlich ist.
achim

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren