Gehörtest

Elektronik-Labor  Projekte  Mikrocontroller  TLScript  




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



Elektronik-Labor  Projekte  Mikrocontroller  TLScript