-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Sehr kleine Wartezeiten mit Timer realisieren

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253

    Sehr kleine Wartezeiten mit Timer realisieren

    Anzeige

    Tagchen. Ich brauch sehr kleine Wartezeiten im µs-Bereich. In Bascom gibts ja WAITUS, aber der nimmt als Argumente nur Konstanten. Und meine Wartezeiten würden variieren. Kann ich das irgendwie mit nem Timer machen? Bei den Bascom Samples ist nen Timer0.bas dabei, da hab ich mir mal eine Schleife angesehen wo der Timer als Counter benutzt wird und ein Do Loop erst verlassen wird wenn er einen bestimmten Zählerwert erreicht hat. Der Wert ist bei mir aber immer 1. Was zählt der da? Flanken vom Prozessortakt? Benutze den internen Taktgeber. Wie kann ich das mit den Wartezeiten machen? Hab noch nie mit Timern gearbeitet...

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    $regfile = "m16def.dat"
    $crystal = 8000000


    Dim A As Word

    Waitus A

    End

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    fuck, da hat der alte flamer wohl doch mal recht. er hatte mir nur bei waitms(255-x) wobei x nen byte war nen fehler gegeben und in der hilfe stand das mit der konstante.... weiss der teufel....

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo Goblin,
    da hat der alte flamer wohl doch mal recht.
    hat er nicht.
    Waitus läßt sich nicht mit einer Variable aufrufen.
    steht auch in der Hilfe: ...must be a constant. Not a variable!
    Kleinere Wartezeiten kannst du mit einem Unterprogramm realisieren.
    Dort steht z.B. nur Waitus 100.
    Rufst du es in einer For-Next Schleife auf, kannst du mit dem Schleifenzähler die Wartezeit beeinflussen.

    Gruß, Michael

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    $regfile = "m16def.dat"
    $crystal = 8000000


    Dim A As Word
    Dim B As Word
    A = 500
    B = 1000

    Waitms A
    Waitms B
    Waitus A
    Waitus B

    End

    erste sahne.....

    mit fastavrbasic 16bitvariable (8mhz), 1us geht für den sprung und rücksprung verloren :

    Sub wait_us(wait_wert_us as word )

    $Asm
    lds R19,wait_wert_us+1
    dec R19
    brmi weiter
    inc R19
    WGLOOP2:
    ldi r18,255
    WGLOOP1:
    ldi R17, $01
    WGLOOP0:
    Nop
    Nop
    dec R17
    brne WGLOOP0
    dec R18
    brne WGLOOP1
    dec R19
    brmi weiter
    brne WGLOOP2
    weiter:
    lds R18,wait_wert_us
    WGLOOP4:
    ldi R17, $01
    WGLOOP3:
    Nop
    Nop
    dec R17
    brne WGLOOP3
    dec R18
    brne WGLOOP4
    $EndAsm
    End Sub

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Michael
    Registriert seit
    17.01.2004
    Ort
    Karlstadt
    Alter
    48
    Beiträge
    1.254
    Hallo pebisoft,
    pebisoft schrieb:
    Dim A As Word

    Waitus A
    das funktioniert nunmal nicht.
    Waitms ist was anderes...
    Gruß, Michael

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    20.06.2004
    Beiträge
    1.941
    Rufst du es in einer For-Next Schleife auf, kannst du mit dem Schleifenzähler die Wartezeit beeinflussen. ..

    geht nur ab 15us, und 8tersprüngen weil in der forschleife der rest verbraten wird.

  8. #8
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2004
    Ort
    Potsdam
    Beiträge
    190
    Waitus ist wie Waitms meines Erachtens nach viel zu ungenau.
    Lade doch den Timer am Anfang der Interruptroutine einfach mit dem nächsten Wert vor.

    Interruptroutine:
    Timerx = A
    w
    e
    i
    t
    e
    r
    e
    r
    C
    o
    d
    e
    Return

    Dadurch das der Timer ab einem vorgegebenen Wert weiterzählt verringert sich die Zeit, die bis zum nächsten TimerCounter overflow vergeht, nach den Vorgaben der Variablen und Du kannst Dir (fast) jede Frequenz erzeugen die Du brauchst. Ich mach das so weil ich für ne bestimmte Anwendung recht genaue 50Hz brauche. Mit nem 8Bit-Timer lieg ich bei 10MHz nur 0.18Hz neben meinem Ziel. Mit nem 16Bit-Timer gehts logischer Weise noch genauer.
    Allerdings kommst Du nicht dran vorbei die genauen Werte im Simulator empirisch zu ermitteln wenn Du eine exakte Frequenz brauchst. Das geht aber recht schnell.

  9. #9
    Erfahrener Benutzer Roboter Experte Avatar von Rage_Empire
    Registriert seit
    10.03.2005
    Ort
    Pforzheim
    Beiträge
    710
    Zitat Zitat von pebisoft
    mit fastavrbasic 16bitvariable (8mhz).........
    und ich dachte, wir sind hier im Bascom-Forum. Oder sind wir?


  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    09.05.2004
    Ort
    Bielefeld / Paderborn
    Beiträge
    1.253
    hehe eben. der bascom-compiler frisst das von pebisoft in überarbeiteter form, aaaber: das ergebnis ist nicht so wie es sein sollte. ich hab mal zum test nen pwm gemacht:

    Code:
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Portd = Output
    Dim Counters As Integer
    Dim Threshold As Integer
    Dim Eins As Word
    Dim Zwei As Word
    
    
    Let Threshold = 10000
    Let Eins = 0
    Let Zwei = 100
    
    
    Do
       Portd = 255
       Waitus Eins
       Portd = 0
       Waitus Zwei
       Incr Counters
       If Counters > Threshold Then Gosub Setter
    Loop
    
    
    Setter:
    
      Let Counters = 0
      Let Eins = Eins - 10
      Let Zwei = Zwei + 10
    Return
    ergebnis: leds immer auf volle pulle an. seltsam. aber das was michael meinte mit der for/next-schleife und dem schleifenzähler ist überhaupt die lösung. voll einfach und müsste funktionieren. probier ich heute nach der arbeit erstmal aus.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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