In der klassischen abendländischen Instrumenten-Stimmung wird eine Oktave( z.B. c'...c'' ) in acht Tonschritte geteilt, deren Frequenzen sich wie folgt verhalten:
Ton | c´ | d´ | e´ | f ´ | g´ | a´ | h´ | c´´ |
Intervall | Prime | Sekunde | Terz | Quarte | Quinte | Sexte | Septime | Oktave |
f / Hz | 264 | 297 | 330 | 352 | 396 | 440 | 495 | 528 |
f / f0 | 1/1 | 9/8 | 5/4 | 4/3 | 3/2 | 5/3 | 15/8 | 2/1 |
T / T0 | 90 / 90 | 80 / 90 | 72 / 90 | 67 / 90 | 60 / 90 | 54 / 90 | 48 / 90 | 45 / 90 |
f = 264 Hz entspricht einer Schwingungsdauer von etwas T = 3731 µs. Diesen Ton realisiert man am besten durch eine Rechteckschwingung, die für 1865 µs den Ausgebe-Port an und für dieselbe Zeit wieder ausschaltet. Um die obige Tonleiter spielen zu können, sind die Verhältnisse der entsprechenden Schwingungsdauern auf denselben Nenner gebracht worden: Man programmiert eine Verzögerungsschleife von 1865 µs : 90 = 21 µs. Den Ton c´ erhält man, indem man diese Schleife 90x, den Ton d´ 80x usw.... durchlaufen läßt.
Die folgende Verzögerungsschleife erzeugt eine Verzögerung von etwa verz2 x 21 Prozessor-Zyklen, was bei einem 4 MHz-Quarz einer Zeit von verz2 x 21 µs entspricht. Der Wert von verz1 wird als Parameter im Work-Register an die Prozedur verz übergeben.
verz
movwf verz2 ;1µs
verzloop1
movlw 6 ; 1 µs
movwf verz1 ; 1 µs
verzloop2
decfsz verz1,f ; 1 µs ( 2 µs beim Sprung)
goto verzloop2 ; 2 µs
decfsz verz2,f ; 1 µs ( 2 µs beim Sprung)
goto verzloop1 ; 2 µs
return
Das Hauptprogramm besteht dann nur noch aus dem Aufruf von verz mit verschiedenen Parametern verz1.
main
bcf portb,0
movlw 5a
; tonhöhe laden ( 90 = $5a)
call verz
movlw 5a
bsf portb,0
call verz
goto main
Diese Prozedur kann man jetzt erweitern und verschiedene verschiedene Parameter in verz1 übergeben und nacheinander aufrufen. Um nun auch die Tonhöhe beeinflussen zu können, muß man eine weitere Verzögerungsschleife programmieren: Damit kann man sowohl die Tonhöhe als auch die Tondauer beeinflussen.
main
movlw 80
movwf tondauer ; tondauer laden
ton1
bcf portb,0
movlw 5a ; tonhöhe laden
call verz
movlw 5a
bsf portb,0
call verz
decfsz tondauer,f
goto ton1
; usw
goto main
Beim
PIC kann man aus einem Ausgangspin eines Ports max. 50 mA Strom gegen
Masse ziehen, schaltet man allerdings gegen Plus, so sind das maximal 20
mA. Um größere Verbraucher anzuschließen, benötigt
man eine 'Treiberstufe', die im einfachsten Fall aus einem
Schalttransitsor (z.B. BC 107) besteht. Der Lautsprecher wird in den
Kollektorkreis geschaltet. Die Spannungsversorgung erfolgt über die
mitgeführten Masse- bzw. 5-V-Leitungen. Mit dem Trimmer (regelbarer
Widerstand im Basiskreis) kann der Ton mehr oder weniger barmherzig
eingestellt werden.
Andere Verbraucher, wie Relais o.ä. können entsprechend geschaltet werden. |
Aufgabe:
1. Berechne für die übrigen Töne den Wert des Parameters, den man an die Prozedur verz übergeben muß, um die c-Dur-Tonleiter (nicht sehr schön) aber doch annähernd spielen zu können.
2. Dadurch, daß die Verzögerungsschleifen immer kürzer werden, wird die Tondauer auch immer kürzer, wenn man nicht dafür sorgt, daß tondauer*verzdauer = konstant bleibt. Berechne die Werte für das Register Tondauer, so daß die Dauer des Tones annähernd konstant bleibt.
3. Schreibe das Programm tonleit.asm , das die Aufgabe erfüllt: Spiele eine c-Dur-Tonleiter mit konstanter Tondauer.