Forum: PC-Programmierung CTC-Timerrechner programmiert. Bitte um Überprüfung


von Valentin B. (nitnelav) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hallo,
nachdem ich mein Java-Projekt nun abgeschlossen habe,
hatte ich wieder Zeit für AVRs und hab mir eine zweite Binäruhr gebaut 
(endlich).
Im Zuge dessen habe ich in Visual Basic ein kleines Programm 
geschrieben, um mir die Werte für die Timer des verwendeten ATMEGA-8 aus 
zu rechnen.

Nun würde ich gerne wissen, ob die Werte so auch korrekt sind (Ich 
benutze die Formeln aus dem Datenblatt des ATMEGA-8, sind die bei einem 
anderen AVR anders?).
mit freundlichen Grüßen,
Valentin Buck

von Karl H. (kbuchegg)


Lesenswert?

Valentin Buck schrieb:

> Nun würde ich gerne wissen, ob die Werte so auch korrekt sind

Ist falsch.
Mit deinen Werten hast du eine CTC Frequency von 2 Hz

> (Ich
> benutze die Formeln aus dem Datenblatt des ATMEGA-8, sind die bei einem
> anderen AVR anders?).

Nein.
Denn das Prinzip nach dem ein Timer funktioniert ist immer gleich. Ein 
Baustein bekommt einen Zähltakt vorgeworfen und zählt vor sich hin. Bei 
bestimmten Zählerständen passiert etwas.

Hat man dieses simple Prinzip erst einmal verstanden, braucht man auch 
die Formeln im Datenblatt nicht mehr und macht auch nicht die dummen 
Fehler, dann die falschen Formeln zu verwenden.

Was im übrigen nicht heißen soll, dass so ein Rechner unpraktisch ist.

von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

Im Datenblatt steht:
fOCnA = fclk_I/O / (2*N*(1+OCRnA))

scilab meint dazu:

-->x = 32768 / (2* 256 * (1+63))
 x  =

    1.

Warum sollte die CTC-Frequenz dann 2Hz sein?

Mit freundlichen Grüßen,
Valentin Buck

von Karl H. (kbuchegg)


Lesenswert?

Valentin Buck schrieb:
> Im Datenblatt steht:
> fOCnA = fclk_I/O / (2*N*(1+OCRnA))

Wo genau steht das im Datenblatt (unter welcher Überschrift)?

>
>     1.

Das ist die Frequenz mit der ein Pin toggeln würde, wenn er jedesmal in 
einer ISR um geschaltet wird.

> Warum sollte die CTC-Frequenz dann 2Hz sein?

Weil für mich der Begriff CTC Frequenz impliziert, das mich interessiert 
wie oft ein CTC in der Sekunde ausgelöst wird.

Dein Timer würde in 1 Sekunde von 0 bis 32767 zählen.
Nicht ganz. Denn durch den Vorteiler, kann er in 1 Sekunde nur von
0 bis 32768/256 = 128 zählen.

Bei einem Compare Wert von 63 bedeutet das, dass der Timer genau 1/2 
Sekunde benötigt um von 0 bis 63 zu zählen.
Ergo erfolgt jede Sekunde genau 2 CTC Ereignis, bei dem der Zähler auf 0 
zurückgesetzt wird. 2 Ereignis pro Sekunde ist aber 2 Hz

: Wiederhergestellt durch User
von Valentin B. (nitnelav) Benutzerseite


Lesenswert?

@Karl heinz Buchegger:
Ich habe ein kleines Verständnisproblem:

Karl heinz Buchegger schrieb:
> Wo steht das?

Auf Seite 89 im Datenblatt des ATMEGA-8.

Karl heinz Buchegger schrieb:
> Denn das wären dann 0.5 Hz und nicht 2Hz

Wo habe ich 2Hz geschrieben?

Karl heinz Buchegger schrieb:
> 1 Ereignis pro Sekunde ist aber 1 Hz

Das habe ich doch die ganze Zeit errechnet???

EDIT: Durch die Korrektur ist mir das jetzt klar geworden!

Ich meine auch nicht die Toggle-Frequenz,
sondern die Frequenz, bei der die Timer Compare Interrupts aufgerufen 
werden.

mit freundlichen Grüßen,
Valentin Buck

von Karl H. (kbuchegg)


Lesenswert?

Valentin Buck schrieb:
> @Karl heinz Buchegger:
> Ich habe ein kleines Verständnisproblem:
>
> Karl heinz Buchegger schrieb:
[Zusammengefasst]

Ich habe zwar am Taschenrechner korrekt die 128 Timrtakte ausgerechnet, 
mich aber beim Zusammenstellen des Postings vertan und stattdessen 64 
eingesetzt und damit weiter gerechnet. Nach dem Posting bin ich drauf 
gekommen und habs korrigiert. Daher waren die ersten Zahlen ganz einfach 
falsch.

>> Wo steht das?
>
> Auf Seite 89 im Datenblatt des ATMEGA-8.

Du musst im Datenblatt immer genau aufpassen wie die Kapitelüberschrift 
lautet und wovon die Rede ist.
Wird vom Timer ein Pin getoggelt oder ist es die Interrupthäufigkeit 
selber, die ausgerechnet wird. Timer toggeln ist logischerweise immer 
halb so häufig wie die ISR Häufigkeit, weil es ja 2 ISR Aufrufen bedarf 
um den Timer 2 mal zu toggeln (und so die 'Schwingung' vollständig zu 
machen)


>
> EDIT: Durch die Korrektur ist mir das jetzt klar geworden!

Sorry für die Konfusion.
Das Endergebnis so wie es jetzt angegeben ist stimmt aber.

Der CTC tritt mit 2Hz auf.


32768/256/64  = 2

von Valentin B. (nitnelav) Benutzerseite


Angehängte Dateien:

Lesenswert?

So.
Ich glaube ich habe es verstanden:
1.
Die Formel aus dem Datenblatt ist schon richtig, berechnet aber nur die 
Toggle-Frequenz eines Pins.
Da ein Pin nicht in jeder ISR EIN und AUS geschaltet wird, halbiert 
sich die Frequenz.
Wenn man also die Formel zu
fOCnA = fclk_I/O / (N*(1+OCRnA))
umformt, dann stimmt das Ergebnis.

2.
Ein Zähler funktioniert im Grunde genommen immer gleich.
Wenn er getaktet wird, so ist der Grundtakt durch den Vorteiler zu 
teilen.
Da ein Zähler nullbasiert zählt, muss man von dem Compare-Teiler 1 
abziehen.


DANKE!!!

Also:

x = (32768 / 256) / (1+127)
 x  =

    1.n

Wenn jemand noch Verwendung für das nun korrigierte Programm hat, es 
steht unter der Creative Commons 
Attribution-NonCommercial-ShareAlike-Lizenz
(http://creativecommons.org/licenses/by-nc-sa/3.0/) und ist somit frei 
für die Nutzung, solange der Hinweis auf mich verbleibt, es nicht 
verkauft wird und bei Änderungen die selbe Lizenz oder die 
NonCommercial-Lizenz benutzt wird.

Mit freundlichen Grüßen,
Valentin Buck

von Karl H. (kbuchegg)


Lesenswert?

Valentin Buck schrieb:

> Da ein Pin nicht in jeder ISR EIN und AUS geschaltet wird, halbiert
> sich die Frequenz.

Ganz genau.
Daher wäre es in deinem Programm vorteilhaft, wenn man das zb mit einer 
Checkbox einstellen könnte, ob man die Pin Toggle Frequenz haben möchte 
oder die ISR-Frequenz

> Ein Zähler funktioniert im Grunde genommen immer gleich.
> Wenn er getaktet wird, so ist der Grundtakt durch den Vorteiler zu
> teilen.
> Da ein Zähler nullbasiert zählt, muss man von dem Compare-Teiler 1
> abziehen.

Jetzt hast du es.
Eigentlich ganz simpel :-)

von Valentin B. (nitnelav) Benutzerseite


Angehängte Dateien:

Lesenswert?

Soo.
Noch die wirklich gute Anmerkung von Karl Heinz Buchegger umgesetzt.
Lizenz bleibt die gleiche!

mit freundlichen Grüßen,
Valentin Buck

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.