Anders als beim Original kann nun
die Beep-Frequenz in weiten Grenzen geändert werden. Eine grobe
Einstellung ist im TestLab möglich. Mit der Spezialfinktion Call 241
kann man die PWM-Frequenz des Ausgangs auch feiner einstellen. Die
maximale Frequenz ist 187,5 kHz. Sie ergibt sich aus der Taktfrequenz
von 48 MHz und der PWM-Auflösung von 256 Stufen. 48000 / 256 = 187,5.
Mit dem Poti im Baukasten lässt sich die Frequenz zwischen 735 Hz und
187,5 kHz einstellen.
Rem Sound1
0x1164 PWM2 = 100
L1:
0x3C00 A = AD0
0x21F1 Call L241:
0x1964 Delay ms = 100
0x2001 Jmp L1:
Dieses kleine Programm reicht schon, um die Hörgrenze mehrerer
Personen zu vergleichen. Hörst du noch was? Wenn man es genauer wissen
will, muss die aktuelle Frequenz ausgegeben werden. Die Frequenz in
ganzen kHz ist 188 / A.
Rem Sound2
0x1164 PWM2 = 100
L1:
0x3C00 A = AD0
0x21F1 Call L241:
0x1A01 Delay s = 1
0x3400 B = A
0x01BC A = 188
0x2D00 A = A / B
0x4200 Print A
0x2001 Jmp L1:
Wenn das Programm auch ohne den PC laufen soll, muss man etwas mehr
Aufwand treiben und das kleine Display mit einsetzen. Nun wird die
Frequenz automatisch von 20 kHz bis 2 kHz heruntergefahren. Sobald man
etwas hört. kann man die Taste drücken, um die Anzeige und den Ton
anzuhalten. Das Programm wurde am Ende ins EEPROM gebrannt und steht
nun immer bereit. Wer jetzt ins Elektronik-Labor kommt, kann sich
diesem einfachen Hörtest unterziehen.
Rem Sound3
0x09FE Pdir = 254
0x0A01 Pullup = 1
0x1164 PWM2 = 100
0x0108 A = 8
0x0200 B = 0
0x3B00 [B+] = A
L1:
0x0200 B = 0
0x3A00 A = [B+]
0x21F1 Call L241:
0x3400 B = A
0x01BC A = 188
0x2D00 A = A / B
0x04FA D = 250
0x2117 Call L2:
0x0201 B = 1
0x4000 A = Pin0
0x2406 If A<B JMP L1:
0x0200 B = 0
0x3A00 A = [B+]
0x2800 A = A + 1
0x0200 B = 0
0x3B00 [B+] = A
0x2006 Jmp L1:
L2:
0x3600 C = A
0x020A B = 10
0x2D00 A = A / B
0x3400 B = A
0x3100 A = A Shl 1
0x1320 A = A OR 32
0x1301 A = A OR 1
0x4500 Pout = A
0x1901 Delay ms = 1
0x3500 A = B
0x020A B = 10
0x2C00 A = A * B
0x3400 B = A
0x3700 A = C
0x2B00 A = A - B
0x3100 A = A Shl 1
0x1301 A = A OR 1
0x4500 Pout = A
0x1901 Delay ms = 1
0x3700 A = C
0x2617 D*Jmp L2:
0x0202 B = 2
0x222F If A=B Jmp L3:
0x4800 Ret
L3:
0x0109 A = 9
0x0200 B = 0
0x3B00 [B+] = A
0x4800 Ret
Augenreaktionstest von Michael Moske
Entsprechend dem Gehörtest könnte man noch einen Augentest programmieren.
Gemeint ist dabei zu testen, bis zu welcher Bildwechsel-Frequenz das Flimmern einer Anzeige
wahrgenommen wird (LED, Bildschirm oder Digitalanzeige). Es gibt nach meiner
Erfahrung Menschen, die bei 50 Hz bereits kein Flimmern mehr sehen und andere,
wie ich z.B. erst ab ca. 70 Hz. Sehr gut eignet sich die Wiederholfrequenz der
Digitalanzeige des Kosmos-Baukastens, wobei die Digitalanzeige gleichzeitig die
gewählte Frequenz auch als Zahlenwert anzeigt. Ich teste das Flimmern durch
leichte Hin- und Herbewegungen der Augen oder Blickrichtung knapp neben die
Beleuchtung. Gut testen kann man das an PKW-Brems- oder Rücklichtern, die
digital getaktet sind.
In Anlehnung an den KOSMOS-Gehörtest habe ich ein Script entworfen, das
dies nun
realisieren sollte. Lange habe ich versucht, eine passende und
einfache Subroutine zu programmieren, die Frequenzen in Latenzzeiten
umrechnet
(Digits An - Digits aus), also in der Art "A = 1000/Frequenz". Das
ist in TLScript nicht so einfach möglich, da nur Zahlen bis 255
verarbeitet
werden können und auch Carry und Divisionsrest nicht vorhanden sind.
Mit einem
"Kniff" geht es aber trotzdem mit relativ wenigen Befehlen und ohne
"endlose" Subtraktionen. Um eine Zahl zu teilen, die größer als 255
ist, wird die Zahl so lange nach rechts geshiftet, bis sie kleiner als
256 ist. Beispiel im Dezimalsystem: 1054/17. Eine Stelle nach rechts
(also geteilt durch 10) ergibt die Ganzzahl 105. Teilt man die 105
durch 17, so erhält man das Ergebnis 6 mit Rest 3. Wieder mit 10
zurückmultipliziert lautet das Ergebnis jetzt 60 mit Rest 30. Die
letzte vorher entfallene Ziffer ist die 4, die noch zum Rest
hinzuaddiert werden muss. Die abschließende Division. (30 + 4)/17
ergibt 2 ohne weiteren Rest. Beide Ergebnisse zusammengefasst ergeben
62. Also ist mathematisch 1054/17 = 62.
Genau dasselbe Verfahren kann im Binärsystem angewendet werden.
Beispiel 1000/22. Um einen Zähler kleiner 256 zu erhalten wird 2 mal
nach rechts geshiftet (entspricht Teilung durch 4). Nun kann 250 durch
22 geteilt werden: 250/22 ergibt 11 Rest 8. Wieder mit 4
zurückmultipliziert ergibt 44 Rest 32. Die letzten beiden Bits der Zahl
1000 sind 0, daher braucht in diesem Fall nichts zum erhaltenen Rest
hinzuaddiert werden. 32/22 ist 1 Rest 10.Beide Ergebnisse
zusammengefasst sind 44+1 = 45. Also ist 1000/22 = 45 Rest 10. Alles
zusammen dauert die Berechnung ca. 70 µs. Hingegen dauert die
standardmäßige fünfzigmalige Subtraktion im Falle von 20 Hz ca. 600 µs
und wird wegen den Überträgen recht umständlich.
Anmerkung B.K.: Genau ab 51 Hz sehe ich kein Flimmern
mehr. Zweimal getestet, genau das gleiche Ergebnis
Rem Eye reaction test
Rem Initialize pins
0x09FE Pdir = 254
0x0A01 Pullup = 1
Rem Initialize frequency
0x0114 A = 20
Rem Main loop
L1:
Rem Store frequency
0x0200 B = 0
0x3B00 [B+] = A
Rem Calc digit delay
0x2138 Call L5:
Rem Store digit delay
0x0201 B = 1
0x3B00 [B+] = A
Rem Load frequency
0x0200 B = 0
0x3A00 A = [B+]
0x3800 D = A
Rem Display digits
0x4200 Print A
0x2116 Call L2:
Rem Increase frequency
0x0200 B = 0
0x3A00 A = [B+]
0x2800 A = A + 1
0x0200 B = 0
0x3B00 [B+] = A
Rem Frequency limit?
0x0251 B = 81
0x2403 If A<B Jmp L1:
Rem Repeat new run
0x0114 A = 20
0x2003 Jmp L1:
L2:
Rem Subroutine digits
0x3600 C = A
Rem Calc high digit
0x020A B = 10
0x2D00 A = A / B
0x3400 B = A
0x3100 A = A Shl 1
0x1320 A = A OR 32
Rem Show high digit
0x4500 Pout = A
Rem Store high digit
0x3500 A = B
0x0202 B = 2
0x3B00 [B+] = A
Rem Load delay value
0x0201 B = 1
0x3A00 A = [B+]
L3:
Rem Delay loop
0x18EB Delay µs = 235
0x2900 A = A - 1
0x0201 B = 1
0x2322 If A>B Jmp L3:
Rem Load high digit
0x0202 B = 2
0x3A00 A = [B+]
Rem Calc low digit
0x020A B = 10
0x2C00 A = A * B
0x3400 B = A
0x3700 A = C
0x2B00 A = A - B
0x3100 A = A Shl 1
Rem Show low digit
0x4500 Pout = A
Rem Load delay value
0x0201 B = 1
0x3A00 A = [B+]
L4:
Rem Delay loop
0x18EB Delay µs = 235
0x2900 A = A - 1
0x0200 B = 0
0x2331 If A>B Jmp L4:
Rem Display loop
0x3700 A = C
0x2616 D*Jmp L2:
Rem Next frequency
0x4800 Ret
L5:
Rem Calc freq -> delay
0x0203 B = 3
0x3B00 [B+] = A
0x3400 B = A
0x01FA A = 250
0x2D00 A = A / B
0x3600 C = A
0x3100 A = A Shl 1
0x3100 A = A Shl 1
0x3800 D = A
0x3700 A = C
0x2C00 A = A * B
0x3400 B = A
0x01FA A = 250
0x2B00 A = A - B
0x3100 A = A Shl 1
0x3100 A = A Shl 1
0x3600 C = A
0x0203 B = 3
0x3A00 A = [B+]
0x3400 B = A
0x3700 A = C
0x2D00 A = A / B
0x3400 B = A
0x3900 A = D
0x2A00 A = A + B
0x3100 A = A Shl 1
0x3100 A = A Shl 1
Rem Return delay val
0x4800 Ret