-         

Ergebnis 1 bis 5 von 5

Thema: ATMega32 Timerproblem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2004
    Ort
    Hamburg
    Alter
    54
    Beiträge
    23

    ATMega32 Timerproblem

    Anzeige

    Ich habe ein Problem mit einem 8bit Timer des ATMega32.

    Ich möcht den Timer mit einem Wert vorladen, aber der Wert wird einfach ignoriert. Ich hänge den Code mal dran, vielleicht fäll jemande etwas ein.
    Ich bin schon am verzeifeln.

    Code:
    $regfile = "m32def.dat"
    $crystal = 16000000
    
    Dim Count As Word
    Const Reload = 240
    
    '########## Timer2 ###########
    On Timer2 Ueberlauf:                                     Interrupt-Routine  Timer2
    Config Timer2 = Timer , Prescale = 64            'Takt: Quarz/64
    Enable Timer2                                               'Timer2 einschalten
    Enable Interrupts                                           'Interrupts global zulassen
    Load Timer2 , Reload                                      'Timer2 mit offset vorladen
    
    Config Portb.2 = Output                                  'Portb.2 als output
    
    '### begin loop ###
    Do
        nop                                                           'do nothing
    Loop
    '### end loop ###
    
    End                                                                 'end program
    
    '#### Label #######
    Ueberlauf:
    Incr Count                                                  'Variable count erhoehen
    If Count = 1000 then                                   'Ist der count xxx, dann
    Toggle Portb.2                                             'Toggle Portb.2 (blink LED)
    Count = 0                                                   'Variable count auf 0
    Load Timer2 , Reload                                    'Offset
    End If
    Return

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Load Timer2 , Reload 'Offset
    End If

    Das scheint das Problem zu sein. In der ISR wird der Timer nur dann wieder geladen, wenn Count=1000 ist.
    Der Timer muss aber immer in der ISR neu geladen werden. Am besten gleich zu anfang, damit es mit den errechneten Zeiten noch passt.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2004
    Ort
    Hamburg
    Alter
    54
    Beiträge
    23
    @Marco78

    Das stimmt, so soll es auch sein. Weiter oben steht die Zeile noch einmal.
    In der Interruproutine wird er dann erneut mit der Constanten Reload mit 240 vorgeladen. Aber ob in der Constanten 0 oder 240 steht ist egal. Der Timer benötigt immer die gleiche Zeit. Ich habe es auch mit der einfachen Schreibweise versucht
    timer2 = 240
    Aber auch hiermit Fehlanzeige.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Weiter oben steht die Zeile noch einmal.
    Ja, aber diese Zeile wird nach einem Reset nur einmal ausgeführt. die in der ISR jedesmal wenn sie aufgerufen wird.

    Im Moment wird der Timer ja nur beim Start und wenn count=1000 ist aufgeladen. Somit fehlt dir 999 mal das vorladen des Timer. Er fängt also 999 mal bei 0 an.

    Eine andere Erklärung sehe ich z.Zt. nicht.

    Ich würde dir auch gerne einen Link geben, aber ich weiss selbst nicht genau, wo das Programm ist. Also musst du mal im Forum oder im Internet nach RNAVR suchen. Das Programm liefert dir einen fertigen Code für die Timer. Du musst nur den Takt und Auslösezeit/Frequenz angeben.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    13.05.2004
    Ort
    Hamburg
    Alter
    54
    Beiträge
    23
    @Marco78

    Jetz habe ich es kapiert. Klar, das Vorladen muss natürlich vor der IF Klausel passieren.
    Vielen Dank de Michael aus Hamburg.

    Code:
    '#### Label #######
    Ueberlauf:
    Incr Count                                                  'Variable count erhoehen
    If Count = 1000 then                                   'Ist der count xxx, dann
    Toggle Portb.2                                             'Toggle Portb.2 (blink LED)
    Count = 0                                                   'Variable count auf 0
    Load Timer2 , Reload                                    'Offset
    End If
    Return 
    
    ##################################
    '#### Label #######
    Ueberlauf:
    Load Timer2 , Reload                                    'Offset
    Incr Count                                                  'Variable count erhoehen
    If Count = 1000 then                                   'Ist der count xxx, dann
    Toggle Portb.2                                             'Toggle Portb.2 (blink LED)
    Count = 0                                                   'Variable count auf 0
    End If
    Return

Berechtigungen

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