www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega8 36kHz erzeugen per Timer2


Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

bräuchte mal eure Hilfe bei einem kleinen Problem.

Und zwar habe ich hier einen Atmega8 bei welchem ich per Timer2 ein 
36khz Signal zur IR Modulation erzeugen möchte.Er rennt mit 16 MHz.

Die Initialisierung sieht wie folgt aus:
void timer2_init(void)
{
  TCCR2 |= (1<<WGM21)|(1<<COM20); // clear timer on compare match
  OCR2 =F_CPU / (36000 * 2) - 1;
  TCCR2 |= (1<<CS21); 
}

Mein Problem ist nun das ich nicht weis ob meine Einstellung für das 
OCR2 Register korrekt ist da ich ja einen Prescaler von 8 bei diesem 
Tackt nutzen muss soweit ich weiss.

Könntet ihr mir dabei Hilfestellung geben?

MfG
Karl

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

Bewertung
0 lesenswert
nicht lesenswert
rein logisch gedacht kann das nicht stimmen, denn in
   OCR2 =F_CPU / (36000 * 2) - 1;

kommt die Einstellung deines Vorteilers (8) gar nicht vor.

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

Bewertung
0 lesenswert
nicht lesenswert
Karl schrieb:

> Könntet ihr mir dabei Hilfestellung geben?

Einfach mal nachrechnen.
Dein Haupttakt ist 16000000 (=16 Mio) Pulse pro Sekunde
Durch den Vorteiler werden daraus 2000000 (= 2 Mio) Pulse pro Sekunde. 
Würdest du den Timer einfach laufen lassen und mal angenommen er könnte 
das, dann würde er in 1 Sekunde bis 2 Mio zählen.
Du willst ein Ereignis alle 1/36000 Sekunde
Wie weit muss daher der Timer zählen, bis 1/36000 Sekunde vergangen sind 
und er das Ereignis auslösen soll?

(Den Faktor 2 für den Pin-Toggle musst du noch berücksichtigen, aber das 
sollte kein Problem sein, wenn du den Rechengang erst mal verstanden 
hast)

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, weisst du wie ich den Teiler mit einrechnen muss?

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es müsste meiner Meinung nach dann so aussehen:

(F_CPU/8) / (36000 * 2) - 1;

Oder wie seht ihr das?

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

Bewertung
0 lesenswert
nicht lesenswert
Karl schrieb:
> Es müsste meiner Meinung nach dann so aussehen:
>
> (F_CPU/8) / (36000 * 2) - 1;
>
> Oder wie seht ihr das?

ausprobieren!
Zahlen einsetzen und es kommt 26 raus (nur das ganzzahlige Ergebnis 
zählt!).

Ein Timer der in 1 Sekunde bis 2000000 zählen könnte, benötigt

      2000000   ....    1
           27   ....    x
     ---------------------
           1 * 27
     x = -----------  = 0.0000135 Sekunden
           2000000

um von 0 bis 26 zu zählen (das sind 27 Zählvorgänge).

Den Wert nehmen wir mal 2 (weil ja nach dieser Zeit der Pin nur 
getoggelt wird, und es 2 Togglevorgänge benötigt um 1 Schwingung der 
Frequenz zu erzeugen) und wir haben 0.000027 Sekunden bis eine 
Schwingung fertig ist. Die Frequenz ergibt sich zu f = 1/T = 37037 Hz.

Interessantes Rechenbeispiel:
Was passiert, wenn du nicht den Vorteiler 8 benutzt, sondern einen 
Vorteiler von 1? Welchen OCR Wert musst du dann benutzen und welche 
Frequenz ergibt sich daraus?
Welchen Vorteiler wirst du daher benutzen?

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok ich versuches mal:

Bei einem Teiler von 1:

(F_CPU/8) / (36000 * 2) - 1=ca. 220

Das ergibt 0,00001375 Sekunden mal 2 = 0,0000275

==> 36363,63 Periode Hz

Oder ?

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da das näher an der Vorgabe ist würde ich einen Teiler von 1 nutzen.

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

Bewertung
0 lesenswert
nicht lesenswert
Karl schrieb:
> Ok ich versuches mal:
>
> Bei einem Teiler von 1:
>
> (F_CPU/8) / (36000 * 2) - 1=ca. 220

ca. ist gut.
laut Windows Taschenrechner  221

> Das ergibt 0,00001375 Sekunden mal 2 = 0,0000275
>
> ==> 36363,63 Periode Hz

36036Hz

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

Bewertung
0 lesenswert
nicht lesenswert
Karl schrieb:
> Da das näher an der Vorgabe ist würde ich einen Teiler von 1 nutzen.

Ah, siehst du.
Genau darauf wollte ich hinaus.

Aus deinem Eröffnungsposting:
> da ich ja einen Prescaler von 8 bei diesem
> Tackt nutzen muss soweit ich weiss.

Davon dürfte nach dem Nachrechnen nicht mehr viel übrig geblieben sein 
:-)

Aber ich denke, du hast jetzt verstanden wie so ein Timer funktioniert 
und wie man das rechnen kann, wenn man nicht einfach stumpfsinnig 
Formeln aus dem Datenblatt anwenden will, sondern sich die Formel aus 
der Funktion 'herleitet'.

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok dann werde ich das mal testen ,hoffentlich klappts bin nun schon ne 
weile dabei das ganze zum laufen zu bringen.

Danke für deine Hilfe

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja nun klappts ,vielen Dank, ich hab schon gedacht hier gibt es keine 
netten Menschen mehr aber ich bin froh das es noch Leute gibts wie dich.

Vielen Dank nochmal

Karl

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.