Forum: Mikrocontroller und Digitale Elektronik Berechnung Zeit/Frequenz beim Prescaler/Timer


von Achim S. (achims)


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

von spess53 (Gast)


Lesenswert?

Hi

>Habe z.B. diese umgestellte Formel gefunden. Leider verstehe ich nicht
>wo die 256 herkommen und wieso 4 x Timer.

Für welchen Controller soll die gut sein? Für AVRs ist ein Preload 
unsinnig und die möglichen Prescaler sind auch nicht für jeden Timer 
gleich.

MfG Spess

von Achim S. (achims)


Lesenswert?

Ich verwende einen AT1284p uns schreibe mit C. In einigen Projekten 
verwende ich z.B. die Entprellung von PD. Dabei arbeite ich mit 1ms und 
10ms. Leider kann ich mir nicht so richtig erklären, wie es berechnet 
wird
achim

von Karl H. (kbuchegg)


Lesenswert?

Lies mal
FAQ: Timer

Wahrscheinlich denkst du nur einfach viel zu kompliziert. Denn im Grunde 
kriegt das jeder Grundschüler hin, der bereits mit Minuten und Sekunden 
den richtigen Ansatz hat.

von Karl H. (kbuchegg)


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?

von Achim S. (achims)


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

von Karl H. (kbuchegg)


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.

von spess53 (Gast)


Lesenswert?

Hi

>Es stehem mir Prescaler mit 2,4,8,16,32,64,128 und 256

Aber nicht bei AVRs. Da gibt es 1, 8, 64, 256 und 1024 oder 1, 8, 32, 
64, 128, 256 und 1024.

MfG Spess

von Thomas E. (thomase)


Lesenswert?

Achim Seeger schrieb:
> Es stehem mir Prescaler mit 2,4,8,16,32,64,128 und 256 zur Verfügung.

Aber nicht auf deinem 1284.
Oder etwa doch? Ich ahne gerade Böses. Von dem Prescaler lässt du schön 
die Finger. Den hast du noch nie gesehen, den gibt es gar nicht.

mfg.

von Karl H. (kbuchegg)


Lesenswert?

Thomas Eckmann schrieb:
> Achim Seeger schrieb:
>> Es stehem mir Prescaler mit 2,4,8,16,32,64,128 und 256 zur Verfügung.
>
> Aber nicht auf deinem 1284.
> Oder etwa doch? Ich ahne gerade Böses.


?
(Timer 2 mit asynchronem Takt? Hab nicht im DB nachgesehen)

von Thomas E. (thomase)


Lesenswert?

Karl Heinz schrieb:
> (Timer 2 mit asynchronem Takt? Hab nicht im DB nachgesehen)
Nee.
CLKPR

mfg.

von Mullwark (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

Thomas Eckmann schrieb:
> Karl Heinz schrieb:
>> (Timer 2 mit asynchronem Takt? Hab nicht im DB nachgesehen)
> Nee.
> CLKPR

Ah. Alles klar.
Und ja. Finger weg. Das ist (in diesem Fall) der falsche Weg.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Mullwark schrieb:

> F_osc / (prescaler * OCRx) = F_isr

nitpicking.
(OCRx + 1)

Denn auch der Überlauf vom OCR Wert auf 0 ist ein Zählschritt.

: Bearbeitet durch User
von Achim (Gast)


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

von spess53 (Gast)


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

von m.n. (Gast)


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

von Achim (Gast)


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

von Achim (Gast)


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

von Achim S. (achims)


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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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.

von Karl H. (kbuchegg)


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?

: Bearbeitet durch User
von Achim S. (achims)


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

von Marc V. (Firma: Vescomp) (logarithmus)


Angehängte Dateien:

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

von Achim S. (achims)


Angehängte Dateien:

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

von Werner (Gast)


Lesenswert?

Achim Seeger schrieb:
> Timer_Erklaerung_Netz.docx (504 KB, 7 Downloads)

Warum nennst du eine Zip-Datei ".docx"?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Werner schrieb:
> Warum nennst du eine Zip-Datei ".docx"?

 Weil es ein Word Document ist.

von halbgarer Vollpfosten (Gast)


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

von Achim S. (achims)


Lesenswert?

Ich öffne meine Word Datein immer mit word. Ist einfach einfacher. Für 
zip Datein habe ich anderes Programm. Mach es einfach richtig rum, dann 
hast du auch keine Probleme mit dem Nachbarn

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

halbgarer Vollpfosten schrieb:
> 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'.

 Mit Office 2003 eingeführt.
 Seit Office 2007 ist es Standard.
 Mehr als 11 Jahre sind genug, finde ich.

von halbgarer Vollpfosten (Gast)


Lesenswert?

Achim Seeger schrieb:
> Mach es einfach richtig rum, dann
> hast du auch keine Probleme mit dem Nachbarn

Du hast doch gefragt. Eine einfaches .doc nachzuschieben kommt Dir nicht 
in den Sinn?

von 0815 (Gast)


Lesenswert?

Achim Seeger schrieb:
> Ich öffne meine Word Datein immer mit word.

Ich versuche es immer mit OpenOffice, mit dem Ergebnis, dass völlig 
unmotiviert mitten auf vielen Seiten ein Strich mit "Board 1 Teil 3" 
auftaucht, was vermutlich in den Seiten-Header gehört.

von Achim S. (achims)


Angehängte Dateien:

Lesenswert?

Kein Problem, kommt in der anderen Version. Für die Zukuft, sage es mir 
einfach mit ein paar einfachen Worten ...

von Thomas E. (thomase)


Angehängte Dateien:

Lesenswert?

Achim Seeger schrieb:
> Kein Problem, kommt in der anderen Version. Für die Zukuft, sage
> es mir
> einfach mit ein paar einfachen Worten ...

Nein, so auch nicht.

mfg.

von Achim S. (achims)


Angehängte Dateien:

Lesenswert?

Irgendwie ist da der Wurm drin. Habe es noch mal als PDF eingestellt. 
Hoffe das es richtig kommt
achim

von Achim S. (achims)


Lesenswert?

Bei mir wird alles richtig dargestellt

von Thomas E. (thomase)


Lesenswert?

Achim Seeger schrieb:
> Irgendwie ist da der Wurm drin.
Funktioniert nicht? Ich kann es öffnen. Deins aber auch.

In deinem ist aber der Fehler auf Seite 1 wieder drin:

>( 0 – 65536 Schritte sind 65537 )

( 0 – 65535 Schritte sind 65536 )

ist richtig.

mfg.

von Achim S. (achims)


Lesenswert?

Danke. ist mir gar nicht aufgefallen, Habe es sofort korrigiert und noch 
einige andere Stellen im Text mit gleichen Fehler
achim

von Alex D. (allu)


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

von Marc V. (Firma: Vescomp) (logarithmus)


Angehängte Dateien:

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.

von Achim S. (achims)


Lesenswert?

Habe dein Programm getestet. War leider nicht so überzeugt. Hatte 
parallel dazu das AVR Timer ausprobiert. Es geht einfacher und zeigt 
mehr an. Besonders die möglichen Prescaler und Fehler. Werde auch das 
neu anschauen.
achim

von Achim S. (achims)


Lesenswert?

Sorry, bei basic passe ich,

von Alex D. (allu)


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

von halbgarer Vollpfosten (Gast)


Lesenswert?

Marc Vesely schrieb:
> Hier, habe die Excel-Datei etwas erweitert, um die Berechnung für Timer
>  und Baud zu erleichtern.

Sicherlich genial aber nicht lesbar. Wohl so eine Art Standarte.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

halbgarer Vollpfosten schrieb:
> Sicherlich genial aber nicht lesbar.
 Sicherlich lesbar.

> Wohl so eine Art Standarte.
 Soll heissen ?

von halbgarer Vollpfosten (Gast)


Angehängte Dateien:

Lesenswert?

Marc Vesely schrieb:
>> Wohl so eine Art Standarte.
>  Soll heissen ?

Das ist im Anhang sehr gut beschrieben.

von Karl H. (kbuchegg)


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.

von Achim (Gast)


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

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

halbgarer Vollpfosten schrieb:
> Das ist im Anhang sehr gut beschrieben.

 Troll dich mal irgendwo anders herum, OK ?

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.