-
        

Ergebnis 1 bis 9 von 9

Thema: Frequenz für OCR2 ausrechnen

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384

    Frequenz für OCR2 ausrechnen

    Anzeige

    Hi,
    ich hab mal ne Frage zur Berechnung von Frequenzen, die dann an OCR2 zum Beispiel ausgegeben werden können. Ich kann nämlich keinen zusammenhang zwischen der Frequenz und der Bit initialisierung des registers finden.
    Hier mal ein paar Programmbeispiele dazu:
    Code:
    TCCR2 = (1 << WGM21) | (1 << CS20);
    OCR2 = 0x64;
    In dem Beispiel wird das Register OCR2 auf 40 kHz gesetzt aber wie kommt man da auf den wert 64 bzw. binär 01100100. Danke schonmal im vorraus.

    mfg
    Erik

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    31.08.2005
    Ort
    bei Graz
    Alter
    27
    Beiträge
    225
    Hi,
    ein blick ins Datenblatt wirkt oft wunder. . .
    um dir das ganze genau zu erklären benötige ich aber noch die Frequenz mit der dein µC betrieben wird und eventuell den Controller

    Ich nehme jetzt mal den Timer2 von Atmega32 an.

    Bei dem stehen im Datenblatt auf Seite 118 ein paar Daten zu der von dir verwendeten Betriebsart. (ich schätz mal CTC)

    Auch zu finde ist die Formel f=fquarz/(2*prescale*(1+OCR2))

    Herausfinden wie die gewünschte Frequenz erzeugt werden kann kann man nun durch umformen auf OCR2, das ist der Wert bei dem der interrupt ausgelößt wird. Nun muss man die verschiedenen prescaler einsetzen und schauen wann ein Wert für OCR2 herauskommt der größer 0 ist.

    Der Timerfrequenz ist also die Quarzfrequenz geteilt durch den Prescaler, und wenn nun die Timervariable die in genau dieser Frequenz erhöht wird den im Register OCR2 gespeicherten Wert erreicht wird der Interrupt ausgeführt, der Timer wieder von 0 gestartet und das ganze beginnt von neuem.

    An dieser Stelle erklärt sich auch der Betriebsartenname CTC, dieser bedeutet nämlich Clear Timer on Compare Match.

    So, hoffentlich hab ich das verständlich erklärt bzw. die Frage richtig verstanden.

    lg MoFe

    ps: ich weiß nicht ob du das weißt (du hasts oben nicht geschrieben) aber das 64 ist hexadezimal 64, nicht dezimal.
    (wahrscheinlich hasts eh verstanden, aber da du dann später bei dem 01100100 noch binär dazugeschrieben hast und vorher eben nicht hexadezimal dachte ich das ichs nochmal erwähne)

    so ich hoffe ich hab das verständlich erklärt

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384
    Hi,
    danke erstmal für deine Anwort, ist sehr gut Verständlich. Meine Kontrollrechnungen passten ziemlich genau zu dem Beispiel. \/

    mfg
    Erik

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    Um die Werte für bestimmte Frequenzen zu berechnen, gibts nen praktisches Tool:
    http://www.roboternetz.de/phpBB2/dlo...le&file_id=123

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    26.11.2006
    Ort
    Hamburg
    Alter
    25
    Beiträge
    384
    Hi uwegw,

    das tool ist echt hilfreich, danke!

    mfg
    Erik

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36
    hmmm ich bekomm bei dem Programm aber nen anderen wert raus als bei der Formel
    also ATmega 8 und ich möchte eine Frequenz von 36KHz
    ohne Prescaler mit Toggel OC2
    Formel:
    36036.03..=8000000/(2*(1+110))

    also muss doch 110 in Hex 6E in den OCR2
    das prog sagt mir bei diesen einstellungen 6F

    was bedeuted das überhaubt wenn ich den Com20 setze also Toggel OC2 on compare match

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    31.08.2005
    Ort
    bei Graz
    Alter
    27
    Beiträge
    225
    Hallo,
    schau dir mal die Zahlen (6E=110 und 6F=111) genau an. Da is genau 1 Unterschied. Is also nicht sehr tragisch. Allerdings ist der mit Formel berechnete Wert etwas genauer. Wahrscheinlich liegt der unterschied in einem Rundungsfehler des Programmes.

    Toggle OC2 on compare match bedeutet das wenn der Zähler des Timers den gleichen Wert hat wie das Vergleichsregister, der Zustand am Pin OC2 "umgedreht" wird. Also aus 1 wird 0 und aus 0 wird eins.

    lg MoFe

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    07.08.2007
    Beiträge
    36
    also funzt das prog ja so wie es soll das gut zu wissen
    ich war nur leicht verwirrt ob ich vlt ein berechnugns fehler gemacht habe
    naja hmm jetzt hab ich dabei noch ein Fehler passt eig nicht ganz ins Topic aber wenn wir schon bei dem Programm sind

    Bei der Baudrate wollte ich 2400 mit einem 16MHz

    Die Formel dafür ist ja UBBR=Frequenz/(16*Baudrate)-1
    Ergebnis ist 415.66 gerundet 416

    Fehler sind bei mir 0,08%
    Das prog zeigt aber ? in beiden Feldern an warum?
    UBRR hat Low und High Register also ist 416 kein Problem eigentlich

  9. #9
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    31
    Beiträge
    4.255
    Das Programm ist schon etwas älter. Die ersten AVRs (die 90S...-Serie) hatten nur einen 8bit-Baudratenteiler. Daher ließen sich mit schnellen Quarzen manche langsamen Baudraten nicht einstellen. [edit: sie liefen aber auch nur mit 8MHz] Aber da dein Mega8 ja nen 16bit-Register dafür hat, sind deine 416 der richtige Wert für deinen Fall.

    Das war mir an dem Programm bisher noch gar nicht aufgefallen. Liegt wohl daran, dass die übliche Baudrate 9600 ist, und die kriegt man selbst bei 20MHz noch in 8bit unter...

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •