- LiFePO4 Speicher Test         
Ergebnis 1 bis 5 von 5

Thema: Timer1- Probleme mit timer Startwert

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    5

    Timer1- Probleme mit timer Startwert

    Anzeige

    Praxistest und DIY Projekte
    Hallo
    Ich brauche mal wieder eure Hilfe:
    Ich will, dass ich die Abstände, in denen das Interrupt ausgeführt wird, ändern kann.
    Das Problem ist jetzt, dass wenn ich den Taster langsam und regelmäßig drücke, der Wert auch erhöht wird, wie ich im Terminal gut sehen kann. Manchmal passiert es aber, dass der Wert plötzlich wieder bei 0 ist, oder krummer Werte wie 1045 kriegt, was eigentlich nicht sein kann. Hat jemand ne Idee?
    Code:
    $regfile = "m16def.dat"
    $crystal = 16000000
    $hwstack = 100
    $swstack = 100
    $framesize = 100
    
    'LEDs konfigurieren
    Config Pind.5 = Output
    Led1 Alias Portd.5
    Config Pind.6 = Output
    Led2 Alias Portd.6
    
    'Taster konfigurieren
    Config Pind.2 = Input
    Config Pind.3 = Input
    Taster1 Alias Portd.2
    Taster2 Alias Portd.3
    
    'Pieper
    Config Pind.7 = Output
    
    'Timer einstellen
    Config Timer1 = Timer , Prescale = 1024
    On Timer1 Timer_irq
    Timer1 = 30000
    Enable Timer1
    Enable Interrupts
    
    'Variablen
    Dim Tempo As Word
    
    '#######################
    'Hauptprogramm         #
    '#######################
    Do
    'schalter entprellen
    Debounce Pind.2 , 1 , Langsammer , Sub
    Debounce Pind.3 , 1 , Schneller , Sub
    
    Loop
    End
    
    'Interruptroutine
    Timer_irq:
    Timer1 = Tempo
    Print "Piep"
    Print Tempo
    
       Toggle Led1
    
      Portd.7 = 1
      Portd.7 = 0
       Return
    
    
       'entprell routinen
       Schneller:
       Tempo = Tempo + 1000
       Return
    
       Langsammer:
       Tempo = Tempo - 1000
       Return
    Mfg und Danke fürs ansehen

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.113
    Ich könnte mir vorstellen, dass die Timer_Isr die Debounce Sub unterbricht, während die Variable Tempo geändert wird. Das wird bei Word Operationen (braucht 16 Takte) möglich sein. Besonders bei schnell aufeinanderfolgenden Timer Overflows steigt die Wahrscheinlichkeit.
    Du könntest mal das Addieren bzw. Subtrahieren durch Disable Interrupts schützen. Also so:

    Disable Interrupts
    Tempo = Tempo + 1000
    Enable Interrupts

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    5
    Hallo
    Danke für den Tipp, hilft aber leider nichts.
    Noch wer Ideen?
    Ich werd mal probieren die Taster mit einem Timer-Interrupt abzufragen, vielleicht hilft das.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    "Krumme" Werte könnten auch dadurch entstehen, dass der Wert von Tempo beim Addieren irgendwann mal größer als 65535 wird und überläuft (oder analog dazu beim Subtrahieren kleiner wird als 0). Das könntest Du vermeiden, indem Du in den Subroutinen die Addition bzw. Subtraktion nur dann ausführen lässt, wenn Tempo kleiner als 64535 bzw. größer als 1000 ist:

    Code:
    Schneller:
     If Tempo < 64535 then
     Tempo = Tempo + 1000
     End if
    Return
    
    Langsamer:
     If Tempo > 1000 then
     Tempo = Tempo - 1000
     End if
    Return
    Btw.: Du fragst die Eingangspins nach "1" ab - gehen die Taster denn auch nach (+)? Und hast Du ordentliche PullDown-Widerstände angeschlossen?

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    01.10.2009
    Beiträge
    5
    Hallo
    Hardwaremäßig passt alles.
    @Sauerbruch
    Mit den krummen Werten beim Überlauf hast du recht.
    Allerdings klappt dass erhöhen immer noch nicht, es wird immer wieder zurückgesetzt.
    mfg

Berechtigungen

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

12V Akku bauen