Der ROBOprogy als Heulboje
Sollen Zeitspannen unter 1 ms erzeugt werden, bieten sich programmierte Verzögerungsschleifen an. Im folgenden Beispiel wird gezeigt, wie man den ROBOprogy in eine Heulboje verwandeln kann. Der Lärmerzeuger - eine kleiner Summer - ist beim Atmel MEGA32 an den Ausgang P3 angeschlossen und erzeugt je nach Pausenlänge zwischen P3ON und P3OFF unterschiedliche Frequenzen. Diese Pausenlänge kann mit folgender Funktion geändert werden:
: WART { n -- } 0 do loop ; \ Zählerendwert n per DatenStack übergeben.
Der Befehl DO holt immer zwei Werte (Endwert und Startwert) vom DatenStack. In obigem Beispiel ist der Startwert 0, der Endwert n wird vom übergeordneten Programm auf das DatenStack gelegt. Diese Wiederholung macht nichts außer Zeit zu "verbrauchen": Ein Umlauf dauert recht genau 2,0 Mikrosekunden, es werden n Umläufe ausgeführt. Wegen der hohen Verarbeitungsgeschwindigkeit des ROBOcontrollers dauert die längstmögliche Verzögerung für
255 WART
nur 510 Mikrosekunden. Die tiefste so erzeugbare Schwingungsdauer für ein Rechtecksignal beträgt also etwa 1,02 ms, entsprechend 980 Hz, wenn man nicht einige „Zeitverbraucher“ hintereinander schaltet. Die folgende Funktion mit dem Namen "TON" erzeugt 20 Schwingungen einstellbarer Periodendauer. Diese muss wieder per DatenStack übergeben werden:
: TON { n -- } 20 0 \
Wartezeit auf dem Stack liegen lassen; 20 Schwingungen beginnen
do P3ON
dup wart \ Spannung
am Beeper einschalten, Warteschleife laufen lassen
P3OFF dup wart \ Spannung ausschalten, Warteschleife laufen
lassen
loop drop ; \ Nach Schleifenende: Wartezeit n vom DatenStack
entfernen
Der Befehl DUP vor WART ist notwendig, weil der WART das oberste Byte n vom Stack entfernt, dieses Byte aber immer wieder benötigt wird.
Nun wird eine bei etwa 2600 Hz beginnende, auf 7200 Hz ansteigende Frequenzfolge erzeugt, indem der Funktion TON nacheinander die Periodendauern 90, 89, 88, 87...32, 31 übergeben werden:
: Y1 { -- } 60 0
do 90 i - ton
loop ;
Erklärung: Die Funktion bekommt den Namen Y1. 60 und 0 sind Endwert und Startwert der folgenden Wiederholung. Der Befehl i kopiert den aktuellen Wert des Wiederholungszählers (0, 1, 2, 3,...) auf das Datenstack. Die Differenz bis 90 (Sie können auch andere Werte testen) wird an die vorher definierte Funktion TON übergeben, die den Lautsprecher ein- und ausschaltet. Da die Schwingungsdauer immer kleiner wird, steigt die Frequenz.
Die folgende Funktion Y2 macht das Gegenteil von Y1, die erzeugten Frequenzen sinken von 7200 Hz auf 2600 Hz.
: Y2 { -- } 60 0
do 30 i + ton
loop ;
Nun werden immer zwei solche Folgen Y1 und Y2 nacheinander ausgeführt und das Ganze vier mal wiederholt. Fertig ist die Sirene.
: HEULBOJE { -- } 4 0 do y1 y2 loop ;
So eine Einspielung empfiehlt sich, wenn der Roboter das Ziel erreicht hat. Eine ander Variante wäre:
: CHIRP {-- } 4 0 do y1 y1 loop ;
Wenn sich jemand die Mühe macht und herausbekommt, mit welchen Schwingungsdauern man Musik machen kann, kann der ROBOprogy ganze Melodien spielen. Der Kammerton A hat 440 Hz, eine halbe Schwingung dauert also 1136 Mikrosekunden. Einige Mikrosekunden verbraucht die Ausführung der Befehle, diese Zeit muss man raten oder messen. Die Funktion TON wird geringfügig modifiziert, in TONa umbenannt und könnte so aussehen (wenn der ROBOcontroller genau 8 MHz hat):
: TONa { n -- } 0
\ Anzahl der Schwingungen per DatenStack übergeben
do p3on
255 wart 255 wart
p3off 255 wart 255 wart
loop
;
Nun ja, klingt ein bisschen schräg, weil die Hintergrundprogramme immer wieder die Zeiten verlängern. Vielleicht gilt das aber als ultimativer Kick...
© Herbert Weidner 2006-5