-         

Ergebnis 1 bis 3 von 3

Thema: CTC - mache ich einen Fehler oder wer ? Eine einfache Frage.

  1. #1
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551

    CTC - mache ich einen Fehler oder wer ? Eine einfache Frage.

    Anzeige

    Schönen Abend,

    ich bin verunsichert. Es war die einfache Frage, wie ich zu meinem OCR2A-Wert komme:
    Zitat Zitat von beginner1101
    ... @Joe:
    hab mir mal deinen Code angeschaut. Wie kommst du auf deinen OCR2A Wert von 125? Laut Datenblatt ist die Formel doch (OCR2A=(fCLK/(2*N*fOCR))-1= 61.5 (bei deinen gewählten Werten) ...
    Mein Code
    Code:
    /* ============================================================================== */
    /* ===  Initialisierung fuer Timer2 mega168 ===================================== */
    void TC2TMR_init(void)                  // Init Tmr/Cntr 2, 8-Bit auf 20 kHz = 50 µs
    {	     
        TCCR2A |= (1<<WGM21);               // Timer im CTC-Mode, Top=OCR2A   doc S 157
        TCCR2B |= (1<<CS21);                // Prescaler 1/8 / Clock <- CP    doc S 158
        OCR2A   = 125;                      // Preset 125 für 50µs bei 20Mhz  
        TIMSK2 |= (1<<OCIE2A);              // Tmr/Cntr2 CompareA interrupt enabled
    }     
    /* ============================================================================== */
    
    
    /* ============================================================================== */
    /* ===  Nicht unterbrechbare ISR für timer2 ===================================== */
    /* Routine zählt hoch im Takt 20 kHz = 50 µs.                                     */
    ISR(TIMER2_COMPA_vect)          // Vektor 7
    {
        if (Izeit_1 < 60000)        //Timer bis 60 000 - 3 sec Datenerfassung möglich
          Izeit_1 ++;               //   alle drei Sekunden wird 60000 erreichterreicht 
                                    //   und Izeit_1 bleibt in der uint16-Grenze 
        else
        {   
            Izeit_1 = 0;            // ansonsten: Rückstellen auf Null
            PORTC ^= (1<<PC5);      // Zur Anzeige gLED am PC5/SCL toggeln
        }            
    }         
    /* ============================================================================== */
    erzeugt mit OCR2A=125 aus 20 MHz bei meinem mega168 einen 50-µs-Takt, obwohl beginner1101 die Formel im Datenblatt richtig anwendet und für meine Zielfrequenz mit 61,5 etwa den halben Wert berechnet - ich komme mit der Formel natürlich zum gleichen niedrigen Ergebnis.

    Wie komme ich auf die 125? Beim Durchlesen der CTC-Funktionen hatte ich mir nach meinen Begleitnotizen ein Excelblatt gemacht, damit ich einfach herumprobieren kann, um schnell verschiedene Parameterpaarungen für Prescaler und Preset zu finden. Da die 50 µs mit dem vorgestellten Code wohl stimmen weil der Quarz mit der Aufschrift 20,000 MHz hoffentlich richtig läuft und sowohl meine Stoppuhr als auch mein Oszilloskop den 50µs-Takt bzw. die 20 kHz bestätigen, ist irgendwo ein Fehler. Dabei bestätigt mir auch meine Milchmädchenrechnung die "125":
    20 MHz / 8 (prescaler) = 2,5 MHz und da der Timer von unten nach oben zählt, gilt :
    2,5 MHz / 125 (preset) = 20 kHz.

    Meine Frage: Habe ich den Timer falsch verstanden? Ist das kein CTC? Versteh ich das ATMEL-doc nicht? Habe ich noch immer null Ahnung von C? Oder ... ich trau mich nicht wirklich die nächste Frage zu stellen
    Ciao sagt der JoeamBerg

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Die Konfusion resultiert daraus, dass ihr nur die Formel betrachtet habt, nicht aber den dazugehörigen Text:
    For generating a waveform output in CTC mode, the OC2A output can be set to toggle its logical
    level on each compare match by setting the Compare Output mode bits to toggle mode
    (COM2A1:0 = 1). The OC2A value will not be visible on the port pin unless the data direction for
    the pin is set to output. The waveform generated will have a maximum frequency of fOC2A =
    fclk_I/O/2 when OCR2A is set to zero (0x00). The waveform frequency is defined by the following
    equation:
    Du vermischt "Ereignishäufigkeit" und "Signalfrequenz". Du möchtest eine bestimmte Ereignishäufigkeit, nämlich ein Ereignis alle 50 µs. Das fOCR in der Formel aber ist die Frequenz eines Signals, das entsteht, wenn der Timer in einem speziellen CTC-Modus benutzt wird, bei dem bei jedem OCR-Ereignis der Ausgang toggelt.
    Oder ganz konkret:
    Bei "Init Tmr/Cntr 2, 8-Bit auf 20 kHz = 50 µs" meinst du 20 kHz im Sinne von 20k Ereignisse/s. Wenn du aber bei jedem Ereignis einen Ausgang toggelst (so wie es der beschriebene Timermodus automatisch macht), hat das an diesem Ausgang entstehende Signal eine Periodendauer von 100 µs, also eine Frequenz von 10 kHz. Und diese 10 kHz ist das fOCR in der Formel.

    PS: Deine Berechnungen stimmen übrigens nicht ganz. Wenn du in OCR2A 125 lädst, dann teilst du den Takt durch 126 (nicht 125).
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.551
    Hallo Stefan, danke! Ein Jammer wenn man mal wieder sagen muß "..hab die Stelle im Handbuch gefunden, wo das steht..". Ok, ich habe das verstanden, es ist dort ja auch ein Bildchen dazu gemalt und noch "Period" dazu geschrieben worden. Ich hatte mich bei "waveform frequency" wohl von Sägezahn und Rechteck verwirren lassen. Übrigens habe ich die falsche Rechnung mit 125 gestern nacht sogar schon selbst bemerkt. Es hilft halt immer wieder, seine Gedanken niederzuschreiben . . . auch wenn man dabei seine Fehler bekannt macht.

    Danke
    Ciao sagt der JoeamBerg

Berechtigungen

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