-         

Ergebnis 1 bis 4 von 4

Thema: Probleme mit Timer0

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    07.06.2007
    Ort
    Dresden
    Alter
    33
    Beiträge
    29

    Probleme mit Timer0

    Anzeige

    Hallo,

    ich hab mir heute ein kleines Programm zusammen geschrieben, welches mit Timer0 laufen soll. Ausgabe soll über OC0 und Terminalprogramm laufen.
    Ich sitze jetzt hier schon ne ganze Weile dran, kann aber den Fehler nicht finden, wäre nett wenn sich jemand von euch das mal anschaut.

    Hier der Code:
    Code:
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    
    
    $crystal = 16000000                                         'Quarzfrequenz
    $baud = 9600
    
    Sreg.7 = 1
                                                      'Interruptsglobal zulassen
    On Timer0 Timerisr
    
    Tccr0.foc0 = 0                                              'force output compare deaktiv
    Tccr0.wgm00 = 0                                             'CTC-Mode
    Tccr0.wgm01 = 1                                             'clear timer on compare
    Tccr0.com00 = 1                                             'OC0 umschalten sobald
    Tccr0.com01 = 0                                             'TCNT0 = OCR0
    Tccr0.cs02 = 1                                              'clk/1024   Prescaler
    Tccr0.cs01 = 0
    Tccr0.cs00 = 1
    
    Timsk.ocie0 = 1                                             'aktiv compare match interrupt
    Timsk.toie0 = 1                                             'aktiv Timer0 Overflow interrupt
    
    Ocr0 = 100
    Ddrb.3 = 1
    
    Do
     Print "lebe noch"
     Print Tccr0
     Print Timsk
     Print Ocr0
     Wait 2
    Loop
    End
    
    
    Timerisr:
    
    Print Ocr0
    
    Return
    1. zwischen OC0 und GND müsste ich doch jetzt etwa 2v messen können?
    2. es müsste mir sehr oft der wert von OCR0 übers terminalprogramm ausgegeben werden

    Extra-Frage: im handbuch hat der Timer0 2 interrupt, bei Bascom hab ich aber immer nur den IR: Timer0 gefunden was ist mit dem 2.?

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    53
    Beiträge
    1.080
    ist enable interrupts eingeschaltet?

    was macht das prog denn, bzw. welche spannung kannst du messen?
    Mein Hexapod im Detail auf www.vreal.de

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    es ist besser das Register als ganzes zu setzen, und nicht jedes Bit einzeln, denn in der Zeit macht der Timer evtl. schon allesmögliche, bis alle 8Bit durch sind. Etwa so:
    Code:
    Tccr0 = &B00110101
    Zum nächsten Register, es werden beide IRQs aktiviert, aber nur für einen die ISR angelegt, deswegen wird der AVR innerhalb kürzester Zeit einen Reset ausführen wenn der nicht benutzte IRQ auftritt.

    In der Hilfe zu On stehen ein paar Möglichkeiten der ISR-Namen, ich denke COMPARE0 sollte hier passen, oder auch OC0, ist dasselbe.

    Und wie im anderen Thread schon angemerkt, statt Sreg.7 "Enable Interrupts" verwenden, dann kennt sich gleich jeder aus.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    07.06.2007
    Ort
    Dresden
    Alter
    33
    Beiträge
    29
    Ok hab das programm umgeschrieben, dass die ISR nicht gestartet ist lag daran dass die mit IR von Timer0 verbunden war. und ich wollte ja OC0 nutzen.
    Und zum 2. Problem ich wollte ja eine veränderliche Spannung am Ausgang
    Und diese ist ja abhängig von der relativen Einschaltdauer, das Problem bei CTC mit Toggle OC0 ist, dass die Einschaltdauer immer bei 50% ist.
    Zum Sreg.7 das liegt daran, dass ich heute mit dem Handbuch gearbeitet habe und mit den Befehlen von Bascom noch nicht so vertraut bin. Ich werds aber versuchen hier im Forum zubeachten.

    So und als Beweiß mein PWM-Programm:
    die Ocisr ist nicht nötig und hat im Fast-PWM-Modus die selbe Periodendauer wie die Timerisr, nur um OCR0 phasenverschoben.

    Code:
    $regfile = "m32def.dat"
    $framesize = 32
    $swstack = 32
    $hwstack = 32
    
    
    $crystal = 16000000                                         'Quarzfrequenz
    $baud = 9600
    Dim I As Integer
    Dim J As Integer
    
    
    Enable Interrupts                                           'interrupts global zulassen
    
    
    On Oc0 Ocisr                                                'Interrupt bei compare match OCR0=TCNT0
    'On Timer0 Timerisr
    Tccr0 = &B01101101
    'FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00
    'WGM=3 Fast PWM
    'COM=2 Clear OC0 on compare match
    'CS0=5 prescaler 1024
    
    Timsk.ocie0 = 1                                             'aktiv compare match interrupt
    Timsk.toie0 = 0                                             'deaktiv Timer0 Overflow interrupt
    
    Ocr0 = 200
    Ddrb.3 = 1
    
    Do
    
    Loop
    End
    
    Ocisr:
    J = J + 1
    J = J Mod 1000
    
    If J = 0 Then
       Print "interrupt oc"                                     'ausgabe aller 2^8*1000*1024/16Mhz
    End If
    
    Return
    
    
    'Timerisr:
    'I = I + 1
    'I = I Mod 1000
    'If I = 0 Then
    '   Print "interrupt timer"
    'End If
    'Return
    danke für eure Hilfe

Berechtigungen

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