-         

Ergebnis 1 bis 6 von 6

Thema: Timer 1 stoppen...?

  1. #1
    Moderator Roboter Genie
    Registriert seit
    26.08.2004
    Beiträge
    1.228

    Timer 1 stoppen...?

    Anzeige

    Hallo!
    Ich möchte für einen US-Sender 16 Impulse bei 40kHz Ausgeben. Die 40kHz ausgeben ist kein Problem, aber die 16 Impulse nach einen Tastendruck zu beginnen und dann nach den 16 Impulsen Automatisch abschalten...das bereitet mir Sorgen!

    Hier mal das Programm:
    Code:
    $regfile = "m8def.dat"
    $crystal = 3686400
    
    Dim A As Integer
    
    Tccr1a = &B01000000
    Tccr1b = &B00001001
    Compare1a = 45
    
    Stop Timer1
    
    Config Int0 = Low Level
    
    Ddrb.1 = 1
    
    Ddrd.2 = 0
    Portd.2 = 1
    
    Ddrb.0 = 0
    Portb.1 = 1
    
    On Compare1a X1
    On Int0 X2
    
    Enable Interrupts
    
    Do
    
    If A = 16 Then
       Stop Timer1
    End If
    
    Loop
    
    X2:
    
    Start Timer1
    
    Return
    
    
    X1:
    
    Incr A
    
    Return
    Kann mir vllt. jemand sagen wo da der Fehler liegt? Ich hab schon einiges probiert (Clock abgeschaltet, Timer in Normal-Modus versetzt, etc...)

    Wäre nett wenn ihr mir helfen könntet!

    MfG
    Basti

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    03.12.2005
    Alter
    51
    Beiträge
    31
    Mal eine Frage (kenne mich da auch noch nicht so aus mit Bascom):


    „A“ hat keinen Anfangswert, also keinen definierten Zustand
    (hab aber keine Ahnung ob man das in Bascom überhaupt voraussetzt)

    Und dann:
    Wer/Wann/Wo inkrementiert „A“?

    Demnach kommst Du in die Schleife und wirst dort versauern, denn die
    Bedingung zum verlassen wird nie eintreffen.

    Aussagen ohne Gewähr – ich habe keine Ahnung von Bascom

    Gruß
    Codejoker

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.08.2004
    Ort
    Stuttgart
    Alter
    42
    Beiträge
    849
    Servus Basti!

    Versuchs doch einfach anders zu lösen. Ich würde den Int0 beibehalten wenn du den so willst und das Ganze einfach als Pattern machen ohne Compare. So in etwa:

    Code:
    $Regfile = "m8def.dat" 
    $Crystal = 3686400 
    
    Dim AnzBursts  As Byte
    
    PinB.1 = 1    ' Burst-Ausgang
    
    DdrD.2 = 0    ' Start-Taste mit internem Pull-Up
    PortD.2 = 1   ' INT0
    
    DdrB.0 = 0    ' Echo-Eingang mit internem Pull-Up
    PortB.1 = 1 
    
    Config Int0 = Low Level 
    On Int0 Int_StartTaste
    
    Enable Interrupts 
    Do
      ' Dein Programm oder sonst noch was....
      If PinB.1 = 0 Then
        ' Das was bei Echo passieren soll...
      End If
    Loop
    End
    
    ' Interrupt-Laufzeit ca. 400µs (1 Burst)
    Int_StartTaste:
      For AnzBursts = 1 To 32 ' 16xHigh + 16xLow
        Toggle PortB.1
        WaitUs 12
      Next AnzBursts
      Return
    Have much fun!

    Grüße Wolfgang

  4. #4
    Erfahrener Benutzer Begeisterter Techniker Avatar von H.A.R.R.Y.
    Registriert seit
    15.09.2005
    Beiträge
    306
    Um dem Ausgang das Toggeln abzugewöhnen kannst Du nach den erforderlichen Burst-Impulsen das TCCR1A auf 0b10000000 umstellen. Beim nächsten Timeout wird dann OC1A auf '0' gehalten bis wieder der Toggle-Modus aktiviert wird. An OC1A erscheint dann der Burst. Geht natürlich auch mit '1' an OC1A. Und im Gegensatz zum Anhalten des Timers läuft das alles schön synchron mit 40kHz, so das auf dem Burst auch keine Störungen auftauchen.
    a) Es gibt keine dummen Fragen, nur dumme Antworten
    b) Fehler macht man um aus ihnen zu lernen
    c) Jeder IO-Port kennt drei mögliche Zustände: Input, Output, Kaputt

  5. #5
    Moderator Roboter Genie
    Registriert seit
    26.08.2004
    Beiträge
    1.228
    Hallo!
    Danke für eure Tips, es lag am "Enable"...wer weiß denn schon das man den "Compare"-Interrupt extra dazuschalten muss *grrr*. Jetzt tut's auch mit Start/Stop Timer1!
    Jetzt muss ich es nurnoch schaffen den Port B1 vor und nach dem Burst auf High zu legen.

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von H.A.R.R.Y.
    Registriert seit
    15.09.2005
    Beiträge
    306
    wer weiß denn schon das man den "Compare"-Interrupt extra dazuschalten muss
    Jeder der im Datenblatt nachgesehen hat. Die Register sind wirklich alle deutlich beschrieben - halt in Englisch, aber was soll's.
    a) Es gibt keine dummen Fragen, nur dumme Antworten
    b) Fehler macht man um aus ihnen zu lernen
    c) Jeder IO-Port kennt drei mögliche Zustände: Input, Output, Kaputt

Berechtigungen

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