Wer die vorherigen Tuts von mir gelesen hat, weiß durch die Interrupts was Unterprogramme sind.
Denn man kann auch selber Unterprogramme erstellen und diese dann aufrufen.
Eine kurze Erklärung was Unterprogramme sind:
Wenn ein Unterprogramm aufgerufen wird, wird das Hauptprogramm sofort unterbrochen und das ausgewählte Unterprogramm wird ausgeführt. Nach dem das Unterprogramm durchgelaufen ist, kehrt es an der Stelle des Hauptprogramms zurück, an der es vorhin unterbrochen worden ist.
Die Unterprogramme werden unter dem Hauptprogramm geschrieben. Mit dem Befehl wird das Unterprogramm aufgerufen:
Code: Alles auswählen
Gosub Name
Code: Alles auswählen
$regfile = "m8def.dat"
$crystal = 1000000
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.2 = Input
Taster1 Alias Portd.2
Led1 Alias Portd.5
Led2 Alias Portd.6
Do
Gosub Wechsel
Gosub Wechsel
Gosub Wechsel
Gosub Blinken
Gosub Blinken
Gosub Blinken
Loop
Wechsel: 'Unterprogramm Wechsel
Led1 = 1
Waitms 1000
Led1 = 0
Waitms 1000
Led2 = 1
Waitms 1000
Led2 = 0
Waitms 1000
Return
Blinken: 'Unterprogramm Blinken
Led1 = 1
Led2 = 1
Waitms 1000
Led2 = 0
Led1 = 0
Waitms 1000
Situation 2
Nun kommen wir zum nächsten Beispiel.
Wir möchten die oberen Effekte/Ansteuerung (sprich 3 x abwechseln blinken und 3 x gemeinsamblinken) beibehalten und ergänzen. Und zwar soll jetzt die Pause pro Durchlauf eines Unterprogramms verkürzt werden.
Dadurch sollen die Leds schneller blinken bzw. unterschiedlich schnell.
Nun könnte man einfach das ein/ausschalten Leds mit den Pausen einfach hintereinanderschalten und die Pausen verkürzen, sprich nicht mehr in Unterprogrammen unterteilen, dadurch hätte wir aber einen sehr langen Code. :
Einfache / Billige Lösung:
Code: Alles auswählen
'3 x Wechselblinken:
Led1 = 1
Waitms 1000
Led1 = 0
Waitms 1000
Led2 = 1
Waitms 1000
Led2 = 0
Waitms 1000
Led1 = 1
Waitms 600
Led1 = 0
Waitms 600
Led2 = 1
Waitms 600
Led2 = 0
Waitms 600
Led1 = 1
Waitms 300
Led1 = 0
Waitms 300
Led2 = 1
Waitms 300
Led2 = 0
Waitms 300
'3 x blinken:
Led1 = 1
Led2 = 1
Waitms 1000
Led2 = 0
Led1 = 0
Waitms 1000
Led1 = 1
Led2 = 1
Waitms 600
Led2 = 0
Led1 = 0
Waitms 600
Led1 = 1
Led2 = 1
Waitms 300
Led2 = 0
Led1 = 0
Waitms 300
Bessere / Professionellere Lösung
Man löst das Ganze über Zuweisung der Pausen durch Variabel.
Bevor ein Unterprogramm gestartet wird, weist man der Variabel die gewünschte Pausezeit zu und die Pausen in Unterprogrammen nehmen die Variabel als "Pause-Zeit".
Das ganze würde dann folgender Maßen aussehen:
Code: Alles auswählen
$regfile = "m8def.dat"
$crystal = 1000000
Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.2 = Input
Taster1 Alias Portd.2
Led1 Alias Portd.5
Led2 Alias Portd.6
Dim Pause As Integer
Do
Pause = 1000
Gosub Wechsel
Pause = 600
Gosub Wechsel
Pause = 300
Gosub Wechsel
Pause = 1000
Gosub Blinken
Pause = 600
Gosub Blinken
Pause = 300
Gosub Blinken
Loop
Wechsel: 'Unterprogramm Wechsel
Led1 = 1
Waitms Pause
Led1 = 0
Waitms Pause
Led2 = 1
Waitms Pause
Led2 = 0
Waitms Pause
Return
Blinken: 'Unterprogramm Blinken
Led1 = 1
Led2 = 1
Waitms Pause
Led2 = 0
Led1 = 0
Waitms Pause




