- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 4 von 4

Thema: präziese Warteschleife

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.01.2004
    Alter
    35
    Beiträge
    121

    präziese Warteschleife

    Anzeige

    Praxistest und DIY Projekte
    Gibt es eigentlich eine Möglichkeit in Bascom Wartezeiten von 300 - 1000 µs genau abzumessen? Mit Waitus scheint dies nicht zu funktionieren und schon gar nicht, wenn man noch andere Interrupts hat.
    Ich hab versucht mir mit einem Timer selbst eine Wait Funktion zu schreiben, aber habe keinen großen Erfolg gehabt, da alleine das inkrementieren von Variablen in der Warteschleife zu viiiel zu großen ungenauigkeiten führt. Hab dann einfach in der Warte funktion eine Schleife gebaut die nur eine Variable mit dem Wert der zu wartenden µs dekrementiert, damit kriege ich immerhin die Wartezeit auf ~33 µs genau abgemessen, aber das ist mir zu ungenau. Außerdem funktioniert das auch nicht mehr, wenn die interrupts anders kommen.

    Es geht darum die Wartezeit zwischen den einzelnen Schritten eines Schrittmotors genau hinzubekommen, damit ich die Geschwindigkeit berechnen kann.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    35
    Beiträge
    967
    Ich bin mir nicht sicher, aber ich wage zu behaupten, dass wenn Interrupts auftreten, und zwar unbestimmt lang und zu irgenteiner Zeit, du es nicht genauer hinkriegst, wie oben beschrieben. Ohne Interrupts sieht die Sache anders aus...aber mit glaub ich nicht, dass man es so genau hinkriegst, wie dus haben willst.
    Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124

    Re: präziese Warteschleife

    Hallo Static,

    dürfte kein größeres Problem sein. Du musst das nur so realisieren, das die AVR-Hardware das alleine, also möglichst ohne Software-Unterstützung macht.

    Also z.B. die Compare Funktion von Timer 1 verwenden, oder Timer1 so vorbesetzen, das der Timer nach der geforderten Zeit einen Overflow-Interrupt auslöst. Die Zeit für den Interruptaufruf ist konstant, die kannst Du also vorher abziehen.
    Einzig Du must sicherstellen, das der AVR beim erreichen der gewählten Zeit nicht mit einem anderen Interupt beschäftigt ist.


    > Ich hab versucht mir mit einem Timer selbst eine Wait Funktion zu
    > schreiben, aber habe keinen großen Erfolg gehabt, da alleine das
    > inkrementieren von Variablen in der Warteschleife zu viiiel zu großen
    > ungenauigkeiten führt.

    bei 300 bis 1000 µs eine Variable hochzählen? 1000µs passen selbst bei 16 MHz Takt problemlos in Timer 1.

    > Es geht darum die Wartezeit zwischen den einzelnen Schritten eines
    > Schrittmotors genau hinzubekommen, damit ich die Geschwindigkeit
    > berechnen kann.

    Dann würde ich die Compare-Variante wählen. Hierbei kannst Du den Timer gleich auch den Portpin zur Schittmotoransteuerung bedienen lassen.
    Das lässt sich soweit in die Hardware-Funktionen packen, daß Du nur noch die Frequenz vorgibst, das exakte Recheck-Signal dazu erzeugt rein die Hardware. Das dürfte also nichmal durch andere Interrupts aus dem Tritt gebracht werden. Die Genauigkeit dürfte dabei bei 1-2 Takten liegen. Also bei +- 0,13µs bei 16 MHz Prozessortakt.

    'nen fertigen Code hab ich leider nicht dazu. Auch ausprobiert hab ich es nicht. Aber vom prizipellen Ablauf her ...

    Schrittmotorsteuerung an OC1A Pin

    CONFIG TIMER1 = TIMER
    PRESCALE= 1
    CLEAR TIMER = 1
    COMPARE A = TOGGLE

    und dann mit
    Compare1a = W
    die benötigte Zeit in Timer1 laden.

    Da ich es selbst nicht ausprobiert habe, keine Gewähr das da nicht noch diverse Fallstricke drin versteckt sind.
    Viel Glück!

    Ciao,
    Werner

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    02.09.2004
    Beiträge
    124
    Hallo,

    Gestern abend mal nachgeschaut. Rowalt hat 'nen Beispiel zur exakten Frequenzerzeugung via OC1A in seinem Buch.
    Das Programm enthält neben der Hardwarekonfiguration und dem Setzen des Compare Registers ganze zwei Zeilen Code

    Do
    Loop

    Das mit den Fallstricken sollte sich also in Grenzen halten.

    Ciao,
    Werner

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad