Home Navigationspfeil Elektronik Navigationspfeil Bascom AVR Sound-Befehl

Tonerzeugung mit dem Sound-Befehl von Bascom Avr

Für die Ausgabe einfacher Töne stellt der Bascom AVR Compiler den Befehl „Sound“ zu Verfügung. Dieser Befehl ist allerdings nicht sehr genau, sollen Töne mit genauer Frequenz ausgegeben werden so müssen andere Methoden angewendet werden, auf die ich hier aber nicht eingehen werde. Die folgenden Information zum Sound-Befehl finden sich in der Bascom Hilfe

Action
Sends pulses to a port pin.

Syntax
SOUND pin, duration, pulses

Remarks

Pin Any I/O pin such as PORTB.0 etc.
Duration The number of pulses to send. Byte, integer/word or constant.
Pulses The time the pin is pulled low and high. This is the value for a loop counter.
Hilfe 1: Bascom Hilfe zum Sound-Befehl

Weiter Informationen sind nicht verfügbar, also musste ich weiter recherchieren. Die Frage die sich dabei stellte, wie kann eine definierte Frequenz für eine Note ausgegeben werden ? Diese Frage lies sich nach einigem suchen beantworten, sie kann mit den folgenden Formeln berechnet werden. (Schön wäre es wenn die Bascom Hilfe dazu einen Hinweis geben würde.)

`"pulses" = int(f_"Quarz" / {(12 * f_"Note")}) `

`"duration" = int( {T * f_"Quarz"} / {12 * "pulses"})`

`f_"Quarz" - "Taktfrequenz des Mikrokontroller"`

`f_"Note" - "Frequenz der auszugebenden Note"`

`T - "Ton Dauer in Sekunden"`

`12 - "ist die Anzahl Takte für eine Periode"`

Mit diesen Informationen allein können wir jedoch noch nichts anfangen es fehlt noch ein entscheidender Teil nämlich die Frequenz der zu verwendenden Note. Dazu werfen wir eine Blick auf die Informationen zur „chromatische Tonleiter“ (i). Bei einer gleichtemperierten Stimmung wird jede Oktave in zwölf identische Halbton-Schritte aufgeteilt, die Schrittweite zwischen den Halbnoten beträgt `root{12}{2} approx 1,0594630943593`. Mit diesem Wissen lässt sich für jede Grundfrequenz die komplette Oktave und auch die folgenden Oktaven berechnen, siehe Tabelle.

Tonname reine Stimmung (ii) gleichstufige Stimmung (iii)

Verhältnis Frequenz in Hz Intervall Frequenz in Hz
c' 1/1 264 `root12{2^0}` 261,63
cis' 25/24 275 `root12{2^1}` 277,18
d' 9/8 297 `root12{2^2}`

293,67

es' 6/5 317 `root12{2^3}`

311,13

e' 5/4 330 `root12{2^4}` 329,63
f' 4/3 352 `root12{2^5}` 349,23
fis' 25/18 367 `root12{2^6}` 369,99
g' 3/2 396 `root12{2^7}` 392,00
as' 8/5 422 `root12{2^8}` 415,31
a' 5/3 440 `root12{2^9}` 440,00
b' 9/5 475 `root12{2^10}` 466,16
h' 15/8 495 `root12{2^11}` 493,88
c'' 2/1 528 `root12{2^12}` 523,25
Tabelle 1: Verhältnisse und Intervalle für eine reine- und gleichstufige Stimmung

Grundfrequenz der Oktave
Kammerton A

Die Grundfrequenz der Oktave beträgt immer das doppelte der vorhergehenden Oktave z.B. `c' = 264; c'' = c' * 2`

Da wir nun wissen wie die Frequenzen der Oktaven berechnet werden können wir die o.g. Formeln für den Bascom Sound-Befehl auflösen, dazu ein Beispiel in dem wir die Werte für den Kammerton a' berechnen. Der Kammerton a' ist mit 440 Hz sicherlich einer der bekanntesten Töne, aber das nur am Rande.

Los geht's

In dem Beispiel werde ich die Frequenz für den gesuchten Ton nach dem beschriebenen Verfahren herleiten.

Es soll, wie bereits erwähnt, der Kammerton a' als 1/4 Note erklingen. Der Mikrocontroller wird mit einer Frequenz von 4 MHz getaktet, der Ausgabe Pin soll PORTD.6 sein.

Die Frequenz von c' für die gleichstufige Stimmung ist gegeben zu 261,63 Hz daraus berechnen wir nach der Formel aus Tabelle 1 die Frequenz für den Kammerton a'

`a' = root{12}{2^{9}} * c'`

zuerst einmal lösen wir die Wurzel auf, und erhalten

`root{12}{2^{9}} = root{12}{512} = 512^{{1} / {12} } = 512^{0,08overline {33} } = 1,681792831` für das Intervall

nun noch eine simple Multiplikation und wir erhalten die Frequenz für den Kammerton a':

`a' = "Intervall" * "Grundfrequenz" = 1,681792831 * 261,63 = 440,0074584 Hz`

Damit ist auch die Plausibilität der Berechnung bewiesen.

Im nächsten Schritt berechnen wir die Anzahl der High/Low Übergänge (pulses) des Signals, hier nehme ich, wie bereits erwähnt, eine Taktfrequenz des Mikrocontrollers von 4 MHz an, natürlich ist auch jede andere Taktfrequenz möglich.

Die Formel verlangt die Angabe der Frequenzen in Hz. Das Ergebnis ist eine Ganzzahl für den pulses Wert des Bascom Befehls (siehe Bascom Hilfe zum Sound-Befehl).

Bevor wir weiter rechnen, möchte ich noch etwas zu den Notenwerten (iv) sagen. Sicherlich ist bekannt das Noten unterschiedliche Längen haben können, damit ist gemeint wie lange die Note ertönt, diese Zeit wird in Sekunden angegeben. In Tabelle 2 habe ich Notenwerte und Zeiten in Sekunden aufgeführt, die für T verwendet werden können.

Note 1/1 1/2 1/4 1/8 1/16 /32 1,64
Dauer Sek. 2 1 0,5 0,25 0,125 0,0625 0,03125
Tabelle 2: Standardnotenwerte und ihre Zeiten in Sekunde

Wir lösen also die folgende Formel mit den bekannten Werten.

`duration = int( {T * f_"Quarz"} / {12 * "pulses"}) = int( {0,5 * 4000000} / {12 * 757}) = 220,1673272 = 220`

Damit ist die Berechnung beendet und es bleibt nur noch den Sound-Befehl mit diesen Werten auszuführen, für das Beispiel würde der Befehl wie folgt lauten:

Sound PORTD.6 , 757 , 440

Ich hoffe, das ich mit dieser kurzen Anleitung etwas Licht in die Dunkelheit um den Bascom Sound-Befehl bringen konnte. In diesem Sinne wünsche ich viel Spaß beim experimentieren mit dem Sound-Befehl.

Das Programm zur Parameterberechnung für den Bascom AVR Sound-Befehl; benötigt .NET Framework 2

Das Programm zur Parameterberechnung für den Bascom AVR Sound-Befehl habe ich, nach der Verbannung von Windows auf allen meinen Rechnern, neu geschrieben der Vorteil es steht nun sowohl für die Win32 Plattform als auch für die 64 Bit Linux Plattform zur Verfügung. Es kann hier geladen werden.

( i ) Wikipedia – Chromatische Tonleiter
( ii ) Wikipedia – Reine Stimmung
( iii ) Wikipedia – Gleichstufige Stimmung
( iv ) Wikipedia – Notenwerte
( v ) Datenblatt zum Sound Chip des C64, MOS Technology 6581 SID, Rev 25.02.1986

Da die dargestellten Schaltungen und Programme nur dem Grundverständnis dienen sollen, kann ich für die Funktion keine Gewähr übernehmen.
Wie üblich kann ich für Schäden die durch die Verwendung der hier veröffentlichten Schaltungen und Programme entstehen keine Haftung übernehmen.

Alle genannten und durch Dritte geschützten Marken- und Warenzeichen unterliegen uneingeschränkt den Bestimmungen des jeweils gültigen Kennzeichenrechts und den Besitzrechten der jeweiligen eingetragenen Eigentümer. Allein aufgrund der bloßen Nennung ist nicht der Schluss zu ziehen, dass Markenzeichen nicht durch Rechte Dritter geschützt sind!