Etwas Musik-Theorie

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 f ´ 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.

 

Zurück