-
        

Ergebnis 1 bis 2 von 2

Thema: Atmel Mega128 & Timer1C als PWM Out im CTC mode

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.04.2008
    Beiträge
    18

    Atmel Mega128 & Timer1C als PWM Out im CTC mode

    Anzeige

    Hallo Leute,
    ich komme einfach ohne eure Hilfe bei meinem Problem icht weiter.
    Ich möchte den Pin B.7 als Ausgang mit einer variablen Frequenz belegen.

    Ich möchte also den Timer 1, Ausgang C im CTC Modus betreiben, doch dieser mag nicht so wie gewünscht - der gleiche Pin mit dem 8bit Timer Timer2 funzt einwandfrei.

    Code:
    Config Portb.7 = Output
    Config Timer1 = Timer , Prescale = T2prescale , Clear Timer = 1 , Compare C = Toggle       ' 2. Achse
    On Compare1c Compare_1c_int
    Enable Compare1c                                            ' Enable the use of Timer2
    Start Timer1
    Compare1c = 4200
    Ocr1ch = 42
    Tccr1a = &B00000100                                         ' Compare Output Mode for Channel C
    Tccr1b = &B00001011                                         ' 256 precaler
    Tccr1c = &B00100000
    '###### Hauptprogramm
    .
    .
    .
    If Achse2 = Halt Then
            'Start Timer1
            'Disable Compare1c
            Tccr1b = &B00001000
    
           Porta.5 = 1
         Porta.4 = 0
    
       Else
           Porta.5 = 0
           Porta.4 = 1
            Start Timer1
           If Timer1reload > 30000 Then Timer1reload = 30000
            If Timer1reload < 20 Then Timer1reload = 20
             Compare1c = Timer1reload
             Ocr1ch = Timer1reload
            'Enable Compare1c
            Tccr1b = &B00001011
      End If
    '###################
    ISR Routine   : nur zum Test , interrupt brauche ich eigentlich nicht.
    
    
    Compare_1c_int:
       Incr Test
       Toggle Porta.1
    Return
    Ich habe schon die Register vom Timer3a ausgeleden ( derfunzt im CTC Mode ) und verglichen, die entsprechenden Änderungen gemacht

    Tccr1a = &B00000100 ' Compare Output Mode for Channel C
    Tccr1b = &B00001011 ' 256 precaler
    Tccr1c = &B00100000


    ich habe mittlerweile gelesen, dass der Timer1C nicht mit High-Level Code zu erreichen ist - hab auch schon in der def - Datei geschaut - stimmt wohl.

    Ich mache wohl was in der Reihenfolge falsch oder nehme falsche Register.

    vielen dank für eure Hilfe.

    olby2

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    06.04.2008
    Beiträge
    18

    Mega 128 OC1c im CTC Mode funzt nicht PWM / CTC Mode, Timer1

    ich habe mittlerweile das Programm entkernt und auf das Wesentliche reduziert, doch das Problem hab ich noch nicht lösen können, habe aber versucht mit diesem Code zu erkennen was da passiert .
    Der Timer1 zählt runter und bleibt bei 0 einfach stehen ?!

    Code:
    $hwstack = 64
    $swstack = 64
    $framesize = 64
    
    $regfile = "m128def.dat"
    $crystal = 16000000                                         'enter the used clock of your actual microcontroller
    $baud = 38400
    
    Dim Timer1reload As Integer
    Dim Test As Integer
    
    Config Portb.7 = Output                                     ' ein paar LED´s zur Kontrolle
    
    'Config Timer1 = Timer , Prescale = 64 , Compare C = Toggle ' 2. Achse
    'On Compare1c Compare_1c_int
    'On Ovf1 Overf_1_int
    'Enable Compare1c                                            ' Enable the use of Timer2
    'Start Timer1
    
    Tccr1a = &B00000100                                         ' Compare Output Mode for Channel C
    Tccr1b = &B00001011                                         ' ctc Mode 4 , 64 * precaler
    Tccr1c = &B00000000                                         'Bit 5 – FOCnC: Force Output Compare for Channel C
    Etifr = &B00000001                                          'Bit 0 – OCF1C: Timer/Counter1, Output Compare C Match Flag
    Etimsk = &B00000001                                         ' Bit 0 – OCIE1C: Timer/Counter1, Output Compare C Match Interrupt Enable
    
    Ocr1ch = 42                                                 ' capture Register high
    Ocr1cl = 42                                                 ' capture Register low
    
    
    Config Timer3 = Timer , Prescale = 64 , Clear Timer = 1 , Compare A = Toggle       ' 1. Achse
    'On Compare3a Compare_3a_int                                 ' When Timer3 = Compare3A register
    Enable Compare3a                                            ' Disable the use of Timer3
    Start Timer3
    Compare3a = 500                                             ' Load the TimerLimit value into the Compare1A (OCR1A) register
    
    
    Timer1reload = 2000
    Enable Interrupts
    
    Do
      Ocr1ch = Timer1reload
      'Compare1c = Timer1reload
    
      Compare3a = Timer1reload
    
      Decr Timer1reload
    
    
      Print Chr(27) ; "[21;1H" ; " Timer1reload       " ; Timer1reload ; "           " ; Test
      Print Chr(27) ; "[22;1H" ; "Tccr1a    Tccr1b  Tccr1c  Ocr1ch  Ocr1cl  PwmXn     Timer"
      Print Chr(27) ; "[23;4H" ; Tccr1a ; "       " ; Tccr1b ; "        " ; Tccr1c ; "       " ; Ocr1ch ; "      " ; Ocr1cl ; "      " ; Pwm1c ; "      " ; Timer1 ; "       "
      Print Chr(27) ; "[24;4H" ; Tccr3a ; "       " ; Tccr3b ; "        " ; Tccr3c ; "       " ; Ocr3ah ; "      " ; Ocr3al ; "      " ; Pwm3a ; "      " ; Timer3 ; "       "
    
    Waitms 10
    
    
    Loop
    
    End
    
    ' interruptroutinen zum test
    Compare_3a_int:
       Incr Test
       Toggle Porta.1
    Return
    
    Overf_1_int:
       Incr Test
       Reset Etifr.0
       Toggle Porta.1
    Return
    
    Compare_1c_int:
       Incr Test
       Toggle Porta.1
    Return
    warum bleibt der Timer einfach stehen ?

    kann mir jemand einen entscheidenden Tipp geben ?

    vielen dank

    olby2

Berechtigungen

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