CTC Modus - irgendwo muss doch ein Fehler sein

Thema: CTC Modus - irgendwo muss doch ein Fehler sein

  1. wisda.noobie:

    CTC Modus - irgendwo muss doch ein Fehler sein

    Hallo,

    ich habe gerade ein kleines Programm geschrieben, um den CTC-Modus für einen Schrittmotor zu nutzen. Leider verändert sich die Frequenz bei Verschiedenen werten von OCR0A nicht. Kann mir jemand weiter helfen?
    Das Board ist ein Arduino Mega

    Code: [Ansicht]
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    
    int step = 13;
    
    
    
    
    
    
    
    
    void setup() {                
      pinMode(step, OUTPUT);  
      // Timer 0 konfigurieren
      TCCR0A = 0b01000000; // CTC Modus, OC0 wird getoggelt
      TCCR0B = 0b00000011; // Prescaler 64
      OCR0A = 24; //Obergrenze auf 24 festgelegt
    }
    
    
    void loop() {
    
    
    }
     
  2. MagicWSmoke:
    Zitat Zitat von wisda.noobie Beitrag anzeigen
    Code: [Ansicht]
      TCCR0A = 0b01000000; // CTC Modus, OC0 wird getoggelt
      TCCR0B = 0b00000011; // Prescaler 64
    CTC? So, so. Die Konfigurierung über Binärwerte ist übrigens 'ne Zumutung.
     
  3. wisda.noobie:
    Habe das erstmal binär gemacht weil ich da am schnellsten erkenne, wie ich die register konfiguriere. Wo ist denn jetzt der Fehler?
     
  4. MagicWSmoke:
    Schau' Dir TCCR0A nochmal genau an.
     
  5. wisda.noobie:
    ich hatte es so verstanden, dass ich bei den ersten 2 stellen (01) angebe, dass OC0 getoggelt wird und mit den letzten beiden (00) die pwm-betriebsart deaktiviere

    - - - Aktualisiert - - -

    ahh manchmal ist es hilfreicher, sich die mühe zu machen, statt bei mikrocontroller.net ins datenblatt zu schauen.

    Code: [Ansicht]
      TCCR0A = 0b01000010; // CTC Modus, OC0 wird getoggelt
      TCCR0B = 0b00001101; // Prescaler 1024
    funktioniert soweit ich weis
     
  6. Avatar von oberallgeier

    oberallgeier:
    ... binär gemacht weil ich da am schnellsten erkenne, wie ich die register konfiguriere. Wo ist denn jetzt der Fehler?
    Er hat ja nicht von Fehler sondern von Zumutung geschrieben. Wenn Du es im Binärcode so schnell erkennst, dann ist das schon ne Sache - ich bin langsam, ich brauche da hilfen . . . und initialisiere meine CTC z.B. so (mega164-1284, 20MHz):
    Code: [Ansicht]
    // ============================================================================== =
    // ==   Timer  Aufgabe: Servo mit Soft-PWM ansteuern auf wählbarem Port
    // - - - - - - - - - - - - - - - -
      void TC1TMR_init(void)        // Init Timer/Counter 1 für 2 ms Servoperiode
      {                             //
        TCCR1B  |= (1<<WGM12);      // WGM12 => CTC, TOP = OCR1A                   S135
        TCCR1B  |= (1<<CS11);       // CS11+10 <=> clk/8 => 2,500 MHz              S136
        OCR1A    = OCR1AV;          // 10x OCR1AV = 63990=> alle 25,60 ms ein Interrupt
                                    //     Interrupt zählt bis 6400 !
        OCR1B    = OCR1BV;          // OCR1B = {???} => 1-2 ms Rampe
    // - - - - - - - - - - - - - - - -
      }                                
    // ============================================================================== =
    Geändert von oberallgeier (23.06.2013 um 19:08 Uhr) Grund: Nachtrag: Controllertyp
    Ciao sagt der JoeamBerg
     
  7. MagicWSmoke:
    Ja, DB ist recht hilfreich Einerseits musst Du dem OCn Pin erklären, wie er sich verhalten soll, andererseits muss der Mode eingestellt werden, was Du nicht gemacht hast. Deshalb taugt auch die Bit-Konfiguration nichts, denn bei Angabe der Bits in Klarnamen fällt ein Fehler leichter auf.
     
  8. wisda.noobie:
    das ist sicherlich eine elegantere lösung, die notation beherrsche ich noch nicht
    Werde die mir aber auf jeden Fall noch anschauen, das scheint ja deutlich einfacher zu sein. Im endeffekt lag der Fehler jetzt nur noch im WGM02-Bit
    Danke für die Antworten!