-
        

Ergebnis 1 bis 7 von 7

Thema: CTC Mode

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.11.2003
    Ort
    Alfeld (50km südl. Hannover)
    Alter
    34
    Beiträge
    237

    CTC Mode

    Anzeige

    Hi,

    so langsam bin ich hier am Verzweifeln, wahrscheinlich
    hab ich irgendwo im Datenblatt was überlesen.
    Hier meine Aufgabenstellung:

    Ich möchte mit einem Mega8 einen 56kHz Takt mit
    Timer1 im CTC Mode erzeugen.

    Also hab ich folgendes eingestellt:
    Code:
    /* "Toggle OC1A on Compare Match"*/
    TCCR1A = (1<COM1A0); 
    /* kein Prescaler, der Counter wird mit vollen
    Prozessortakt betrieben und CTC Mode aktivieren */
    TCCR1B = (1<<CS10) | (1<<WGM12);
    OCR1A = 1000;
    PB1 ist auch auf Ausgang gestellt. Wenn ich den Interrupt
    TIMER1_COMPA_vect in TIMSK aktiviere kommt der Interrupt auch vernüftig und ich kann in diesem den
    Pin Togglen, aber das sollte so doch auch automatisch gehen.

    vielen Dank schonmal für die Hilfe
    Thorsten

    edit: Die 1000 sind natürlich zu viel, hab ich erstmal zum
    Testen eingestellt.
    Open Minds. Open Sources. Open Future

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    795
    Meines Wissens nach geht das bei CTC-Mode nicht...
    CTC ist nur für "interne" Anwendung gedacht...

    Wenn der OCR1A oder so angesteuert werden soll, dann musst einen
    PWM-Mode wählen.
    Gruß,
    Franz

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.11.2003
    Ort
    Alfeld (50km südl. Hannover)
    Alter
    34
    Beiträge
    237
    Hi,

    Tabelle 36 auf Seite 97 im Datenblatt sagt eigentlich das es gehen sollte,
    oder hab ich das Falsch verstanden?
    Ich probier mal nen Pwm Mode.

    mfg
    Thorsten
    Open Minds. Open Sources. Open Future

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von robocat
    Registriert seit
    18.07.2006
    Beiträge
    935
    ich hatte neulich ein ähnliches problem, allerdings in assembler und mit 33kHz. wenn du es dir umstrickst auf c dürft es aber gehen:
    Code:
       .NOLIST                
       .INCLUDE <m8def.inc> 
       .LIST                    
    
    
       ; MCU Takt für diverse Berechnungen festlegen 
       .equ      tosc      = 1000000       
    
       ; Ausgabefreq festlegen 
       .equ      fout      = 33000 
        
       ; Timer 1 Ladewert 
       .equ      ladewert    = (tosc / (2 * fout)) - 1 
    
       .CSEG                    
       .org 0 
    
    
       ; Interupt Vektoren 
       rjmp    init             ; Reset Handler 
       reti                   ; IRQ0 Handler 
       reti                   ; IRQ1 Handler 
       reti                   ; Timer2 Compare Handler 
       reti                   ; Timer2 Overflow Handler 
       reti                   ; Timer1 Capture Handler 
       reti                   ; Timer1 CompareA Handler 
       reti                   ; Timer1 CompareB Handler 
       reti                   ; Timer1 Overflow Handler 
       reti                   ; Timer0 Overflow Handler 
       reti                   ; SPI Transfer Complete Handler 
       reti                   ; USART RX Complete Handler 
       reti                   ; UDR Empty Handler 
       reti                   ; USART TX Complete Handler 
       reti                   ; ADC Conversion Complete Handler 
       reti                   ; EEPROM Ready Handler 
       reti                   ; Analog Comparator Handler 
       reti                   ; Two-wire Serial Interface Handler 
       reti                   ; Store Program Memory Ready Handler
    
    
    init:                   
       ldi    r16,   high(RAMEND); Stackpointer initialisieren 
       out    SPH,   R16 
       ldi    r16,   low(RAMEND) 
       out    SPL,   R16 
    
       ldi    r24,   255                 
       out    DDRB,   r24         ; Port B als Ausgang 
       out    DDRD,   r24         ; Port D auch 
       out    PORTC,  r24         ; Pullups von Port C aktivieren 
                            ; (-> damit hat dieser einen definierten Pegel 
                            ; und nicht osziliert sinnfrei rum) 
    
    
    
    
       ldi    r17,   (1<<COM1A0)   ; Timer 1 konfigurieren (Mode 4 -> CTC) 
       ldi    r16,   (1<<WGM12)|(1<<CS10) 
       out    TCCR1A,   r17 
       out    TCCR1B,   r16 
    
       ldi    r16,   high(ladewert) 
       out    OCR1AH,r16 
       ldi    r16,   low(ladewert) 
       out    OCR1AL,r16 
    
    
    ;   in      r16,   TIMSK      ; Diese auskommentierten Zeilen sind hier unnötig, 
    ;   ori       r16,   (1<<OCIE1A)   ; ich habe sie nur drinne gelasen um zu zeigen, 
    ;   out    TIMSK,   r16         ; wie ich es machen würde 
    
       sei                    ; Interrupts aktivieren
    loop:                     ; hauptschleife 
       ldi    r24,   160 
       out    PORTD,   r24 
    
       ldi    r24,   0 
       out    PORTB,   r24         ; PD5+6 auf HIGH 
    
       ldi      r17,   0x09      ; delay loop, 1Hz 
    WGLOOP0:  
       ldi      r18,   0xBC 
    WGLOOP1: 
       ldi      r19,   0xC4 
    WGLOOP2: 
       dec      r19 
       brne   WGLOOP2 
       dec      r18 
       brne   WGLOOP1 
       dec      r17 
       brne   WGLOOP0 
       nop 
    
       ldi      r24,   64 
       out      PORTD,   r24         ; PD5+6 auf HIGH
    
       ldi      r24,   1 
       out      PORTB,   r24         ; PD5+6 auf HIGH
        
       ldi      r17,   0x09      ; delay loop, 1Hz 
    WGLOOP3: 
       ldi      r18,   0xBC 
    WGLOOP4: 
       ldi      r19,   0xC4 
    WGLOOP5: 
       dec      r19 
       brne WGLOOP5 
       dec      r18 
       brne   WGLOOP4 
       dec      r17 
       brne   WGLOOP3 
       nop 
    
       rjmp    loop
    in der hauptschleife werden jeweils 2 ports für eine sekunde geschalten, derweil erzeugt OC1A ( am atmega 8 ) ein 33kHz signal.

    vielleicht hilfts..(mir hat damals "Hanni" geholfen)

    gruesse von der katze

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.11.2003
    Ort
    Alfeld (50km südl. Hannover)
    Alter
    34
    Beiträge
    237
    Hi,

    ja das Hilft mir schon weiter, die Timerregister konfigurierst du ja
    genauso wie ich. Morgen werde ich wohl mal einen anderen Prozessor und
    mal ein minimal Assembler Programm testen, nicht das da noch irgendwo im
    C-Code was schiefläuft, aber alles andere geht ja. Mal abwarten.
    Zumindest weiß ich das es so gehen muss.

    Vielen Dank
    Thorsten
    Open Minds. Open Sources. Open Future

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.01.2005
    Ort
    Bayern
    Alter
    31
    Beiträge
    795
    HI,
    OK ich hab mich getäuscht, sorry... Aber eine Frage, hast du den
    entsprechenden PIN als Ausgang geschalten?
    Gruß,
    Franz

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.11.2003
    Ort
    Alfeld (50km südl. Hannover)
    Alter
    34
    Beiträge
    237
    Jup, der ist als Ausgang geschaltet, wie gesagt wenn ich den zugehörigen
    Compare Match Interrupt aktiviere gehts auch, nur nicht automatisch. Aber
    genau das möchte ich gern.
    Ich werd sobald ich heut Abend zu Hause bin mal das Miniprogramm probieren,
    wenn das nicht geht mach ich das ganze halt im Interrupt.

    mfg
    Thorsten
    Open Minds. Open Sources. Open Future

Berechtigungen

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