mikrocontroller.net

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


Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 Moderator
Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Valentin Buck (nitnelav) Benutzerseite
Datum:
Angehängte Dateien:

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

mit freundlichen Grüßen,
Valentin Buck

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.