- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Problem mit Timer1 und Compare...

  1. #1
    Murus
    Gast

    Problem mit Timer1 und Compare...

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,
    ich verwende einen Mega8, intern getaktet.
    Dazu den Timer1 mit Prescale=8

    Ich habe zwei Compare drinnen.
    Compare1a und Compare1b.

    So sieht der Timer1-spezifische Code in meinem Programm aus:
    Config Timer1=Timer, Prescale=8
    Enable Timer1
    Enable Interrupts
    On Compare1a Interrupteins
    On Compare1b Inzerruptzwei
    D=85
    Y=1250
    Compare1a=D
    Compare1b=Y

    Interrupteins:
    D=D+85
    Compare1a=D
    .
    .
    .
    Return
    Interruptzwei:
    Y=Y+1250
    Compare1b=Y
    .
    .
    .
    Return

    In den jeweiligen Interrupt-Routinen werden die entsprechenden Werte zum Wert des Compare-Registers dazuaddiert, damit nach der richtigen Zeit der Interrupt wieder kommt...

    Nur: Der Code funktioniert irgendwie nicht...
    Hab ich was vergessen? In meinen Augen sollt er gehen..
    Herzlichen Gruss
    Mario

  2. #2
    Gast
    du solltest mal den interrupt disablen wenn du die comparewerte änderst.
    mfg psft

  3. #3
    Murus
    Gast
    Ok, Interrupts hab ich disabled, geht trotzdem nicht!
    Ich hab mal schnell ein Testprogramm geschrieben, mit dem ich mit dem Bascom-Simulator das Ganze testen will:

    Code:
    Config Timer1 = Timer , Prescale = 8                        ' Timer 1 für Zeit und Array
    Enable Timer1
    Enable Interrupts
    
    
    On Compare1a Eins
    On Compare1b Zwei
    
    Dim X As Long
    Dim Y As Long
    X = 1
    Y = 6
    Compare1a = X
    Compare1b = Y
    Start Timer1
    Cls
    Locate 2 , 1
    Lcd "Hello World"
    Do
    Loop
    
    Eins:
    
    X = X + 5
    Compare1a = X
    Cls
    Locate 1 , 1
    Lcd "Eins"
    
    
    Return
    
    Zwei:
    
    Y = Y + 5
    Compare1b = Y
     Cls
    Locate 1 , 1
    Lcd "Zwei"
    
    Return
    
    End
    Aber:
    Auch das funktioniert nicht! Deshalb meine Frage: Kann das Bascom überhaupt? In der Hilfe und den Samples steht nirgends etwas, bei dem der Timer1 in dieser Funktion verwendet wird....

    Herzlichen Gruss
    Mario

  4. #4
    Gast
    ....Der Wert im Output Compare Register wird ständig mit dem aktuellen Wert im Datenregister TCNT1H/TCNT1L verglichen. Stimmen die beiden Werte überein, so wird ein sogenannter Output Compare Match ausgelöst. Die entsprechenden Aktionen werden über die Timer/Counter 1 Control und Status Register eingestellt.

    Zum Auslesen des Registers wird von der CPU ein internes TEMP-Register verwendet. Das gleiche Register wird auch verwendet, wenn auf OCR1 oder ICR1 zugegriffen wird. Deshalb müssen vor dem Zugriff auf eines dieser Register alle Interrupts gesperrt werden, weil sonst die Möglichkeit des gleichzeitigen Zugriffs auf das Temporärregister gegeben ist, was natürlich zu fehlerhaftem Verhalten des Programms führt.. Zudem muss zuerst OCR1L und erst danach OCR1H ausgelesen werden.

    Wenn in das Register geschrieben werden soll, müssen ebenfalls alle Interrupts gesperrt werden. Dann muss zuerst das OCR1H-Register und erst danach das OCR1L-Register geschrieben werden, also genau die umgekehrte Reihenfolge wie beim Lesen des Registers.....

    ein interessanter auszug.
    mfg psft

  5. #5
    Murus
    Gast
    Ok, also wenn der Interrupt kommt
    "disable Interrupts" schreiben, und dann vor "return" wieder enablen...

    Nur: Wie geht das mit dem OCR1? (Bascom-Befehl) Muss ich die im Dualsystem beschreiben? Wie läuft das jetzt? Welches Byte zuerst?
    Ich muss zuerst eine Zahl ins OCR1H stecken und dann eine Zahl ins OCR1L. Nur: Wie? Wenn ich z.B. 100 da reintun möchte.. ?

    Herzliche Grüsse und Danke für deine Unterstützung!
    (Was meinst du mit interessanter Auszug? Ist doch ein etwas falscher Code.. ?)

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    71
    Beiträge
    277
    Zitat Zitat von Murus
    Ok, also wenn der Interrupt kommt
    "disable Interrupts" schreiben, und dann vor "return" wieder enablen...
    Genau.
    Nur: Wie geht das mit dem OCR1? (Bascom-Befehl) Muss ich die im Dualsystem beschreiben? Wie läuft das jetzt? Welches Byte zuerst?
    Ich muss zuerst eine Zahl ins OCR1H stecken und dann eine Zahl ins OCR1L. Nur: Wie? Wenn ich z.B. 100 da reintun möchte.. ?
    Ganz einfach. Bascom erledigt das sortieren der Reihenfolge selbst, Du brauchst Dich also nicht darum zu kümmern.

    COMPARE1A = var
    var = COMPARE1A TIMER1 COMPARE A register
    COMARE1B = var
    var = COMPARE1B TIMER1 COMPARE B register

    So steht es auch in der Hilfe.

    Pebisoft macht die Dinge eben gerne etwas komplizierter, als sie sind.

    Grüße
    Henrik

  7. #7
    Gast
    wenn Bascom dein "disable interrupt" nicht annehmen/verarbeiten tut,
    kannst du die register nicht beschreiben.
    mfg psft

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.12.2004
    Alter
    71
    Beiträge
    277
    Zitat Zitat von Anonymous
    wenn Bascom dein "disable interrupt" nicht annehmen/verarbeiten tut,
    kannst du die register nicht beschreiben.
    Warum sollte Bascom "disable interrupts" nicht ausführen? Das tut es bei mir -und nicht nur bei mir- völlig problemlos. Wäre schön, wenn Du Dich an Deine Schreibsperre halten würdest.

    Henrik

  9. #9
    Gast
    der gast ist pebisoft und nicht anonymous . hast wohl probleme oder.


    --------------------DELETED ------------------ (PicNick)

  10. #10
    Gast
    dann kann ich dir das proggen und die interna von Bascom mal beibringen.
    mfg psft

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen