-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: Alternative zu "Wait"-Befehl

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175

    Alternative zu "Wait"-Befehl

    Anzeige

    Hallo Leute,

    ich bin auf der Suche nach einer Alternativ-Programmierung zum "Wait"-Befehl. Irgendwie stehe ich da vorm Scheunentor.

    Die Suchfunktion hat mir da auch nichts Hilfreiches verraten können - ehrlich gesagt, weiß ich auch gar nicht, wonach genau ich da suchen sollte...

    Ein kleines Beispiel, um die Problematik zu verdeutlichen.
    Mit folgendem Programmcode bekommt man ganz leicht eine Blinkfunktion an Portd.6 und Portd.7 in Abhängigkeit von Pinc.0 bzw. Pinc.1 realisiert:

    Code:
    Do
    
    If Pinc.0 = 0 then
    
      Portd.6 = 0 'LED an
    
      Wait 5
    
      Portd.6 = 1 'LED aus
    
      Wait 5
    
    end if
    
    If Pinc.1 = 0 then
    
      Portd.7 = 0 'LED an
    
      Waitms 500
    
      Portd.7 = 1 'LED aus
    
      Waitms 500
    
    end if
    
    loop
    
    end
    Das blinkt zwar nett und munter vor sich hin, aber der Nachteil ist natürlich, das während der Wartezeit (Wait 5) das weitere Programm nicht durchlaufen wird. Eine Blinksequenz kann erst starten bzw. stoppen, wenn die andere Sequenz abgeschlossen ist.

    Logische Folge: Die Blinker arbeiten unregelmäßig.

    Die Interrupts wollte ich gerne für andere Zwecke nutzen, und außerdem muß es ja auch nicht immer ein Pin-Status als Startbedingung für die Blinker sein.

    Ich würde mich freuen, wenn ihr mir ein paar Ideen liefern könntet, wie die beiden Blinker unabhängig voneinander abgearbeitet werden können.

    Sorry für die Banal-Frage, aber ich bin noch ziemlicher Anfänger mit Bascom.

    Ach so: Als Chip verwende ich den Mega 8

    Besten Dank und viele Grüße

    Torsten

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Hallo,

    was ich von SPS Programmen her weiss, macht man sich einen Blinker-Merker der alleine vor sich hin irgendein Bit toggelt,
    wenn man jetzt irgendwo was blinkendes braucht, einfach diesen Blinker-Merker in der Schleife mit verknüpfen.
    Da der Mega8 mit mind. 8MHz läuft, sollte die Schleife oft genug durchlaufen werden um das Blinken als solches erkennen zu können.

    Muster:
    mfG
    HK
    /* Linux user #98697 */

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Abgesehen von Timer-Routinen, die asynchron ablaufen, kannst du noch folgendes tun
    In der Main schleife eine einzigen Wait in des kleinsten sinnvollen Einheit,
    bei dir, sagen wir, 100ms
    Dann hast du zwei Zähler, einer zählt bis 5, blinkt, und fängt wieder bei 1 an, der andere bis 50 .
    Code:
    dim count1 as byte
    dim count2 as byte
    do 
       incr count1
       if count1 = 5 then
             count1 = 0
             if Pinc.0 = 0  then 
                  toggle Portd.6
             end if
       end if   
       incr count2
       if count2 = 50 then
             count2 = 0
             if Pinc.1 = 0  then 
                  toggle Portd.7
             end if
       end if   
       waitms 100
    loop
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    29.12.2004
    Ort
    Bayern
    Alter
    38
    Beiträge
    90
    Hi,
    warum im "Hauptprogramm" die LED blinken lassen...?
    Es geht auch mit dem 16bit timer2. Der ist so zu konfigurieren, dass alle naja, wie man es will 1,2,5.. sec. ein Interrupt ausgelöst wird. In dieser Routine wird dann der LED Port geschaltet, oder weiterer Zähler laufen lassen um Imp.-Dauer/Imp.Pause zu beeinflussen...
    Bei "robotikhardware.de" gibts da eine software zum Download glaub ich rnAVr.... Die erzeugt den richtigen Programmcode, der dann sogar 1:1 übernommen werden kann...

    Grüße Ralf

  5. #5
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    @rapo: Solange du für das, was du timen willst, genug Timer bei der Hand hast, würde ich dir folgen. Aber wenn dein Board einiges zu tun hat überlegst du dir, ob du in eine blinkende Led einen Timer reinbutterst.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Hallo miteinander,

    vielen Dank für Eure Ideen. So banal, wie ich dachte, scheint die Problematik gar nicht zu sein...

    @PicNick:
    Genau, darum gings mir. Ich möchte nicht wegen so einem dummen Rumgeblinke gleich Timer, Counter und Interrupts verbraten, die brauche ich noch für andere Zwecke. Stichwort: PWM...

    Die Idee mit dem Zählen gefällt mir, allerdings kommt Dein Beispiel noch nicht ohne den Wait-Befehl aus und der µC liegt satte 100ms auf der faulen Haut. Das reduziert zwar das Problem, löst es aber nicht.
    Und rumgelungert wird bei mir schon gleich gar nich - in den 100ms gibt es immer noch genug zu tun für den Krabbelkäfer.

    Aber das Prinzip an sich scheint mir erfolgversprechend.
    Würde es funktionieren, eine Variable bei jedem Programmdurchlauf um Eins hochzuzählen und den Blinktakt mit einem Vergleich auf die Variable aufzubauen?

    Das hätte zwar den Nachteil, das der Blinktakt von Przessor-Takt und Durchlaufzeit des Programms abhängt, aber damit könnte man ja möglicherweise leben?

    Danke und Grüße

    Torsten

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    22.05.2005
    Ort
    12°29´ O, 48°38´ N
    Alter
    48
    Beiträge
    2.731
    Zitat Zitat von Torsten_G
    Würde es funktionieren, eine Variable bei jedem Programmdurchlauf um Eins hochzuzählen und den Blinktakt mit einem Vergleich auf die Variable aufzubauen?

    Das hätte zwar den Nachteil, das der Blinktakt von Przessor-Takt und Durchlaufzeit des Programms abhängt, aber damit könnte man ja möglicherweise leben?
    sag ich doch: Blinker-merker
    irgendwo im Programm zählst Du jeden scheifendurchlauf, da man meistens vorher auch weiss mit wieviel Mhz der Käfer läuft, kann man auch die anzahl der schleifendurchläufe bestimmen bis der zähler überläuft, danach eine Variable die als Blinker-merker funktioniert toggeln,
    wenn Du nun einen Blinker brauchst diese Variable verwenden um das Lamperl ein oder auszuschalten jenachdem ob der Blinker-merker grad an oder aus ist

  8. #8
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.836
    Ich mach das so, daß ich den Timer0 für eine Zeit einstelle, die für alle zeitabhängigen funktionen zweckmäßich ist. Dort findet auch diese Zählerei statt. da komm ich meistens mit 1 - 10 mS aus.
    (ganz genau genommen ist da eine TImer-queue, in die irgendwelche Funktionen zur runtime dann Entries machen, mit anzahl ticks, wann ein Callback erfolgen soll. Fast wie im Windows)
    Die eigentliche Hauptschleife strudelt ohne wait ihre übrigen states ab und tut halt, was sie tun soll.)
    Das "Wait" in der vorgeschlagenen Form ist nur, weil ja im Beispiel sonst nix zu tun ist.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    29.12.2004
    Ort
    Bayern
    Alter
    38
    Beiträge
    90
    Hallo,
    das mit dem Blinken und Timer "verbraten" war mir schon klar, war ja auch nur ein Gedanke...

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Hallo Leute,

    euch allen vielen Dank, ich hab´s jetzt mal - versuchsweise - mit Zählvariablen gemacht, das wird prima reichen, um eine Status-LED flashen zu lassen.

    Letztendlich ist es wohl eine Frage der Genauigkeit - wenn der Programmdurchlauf mehr Zykluszeit braucht, wird ein "Zähl-Blinker" natürlich entsprechend langsamer.

    Für genaue Zeitimpulse unabhängig von der Zykluszeit geht dann wohl kein Weg an den eingebauten Timern vorbei.

    Viele Grüße

    Torsten

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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