MorseBeeper

Spielwiese rund um eigene Projekte.
Post Reply
DL9MWE
Posts: 39
Joined: Sat 12. May 2012, 09:02

MorseBeeper

Post by DL9MWE »

Hallo Forum,

hier ist ein MSP430-Programm, das vorher festgelegte Morsezeichen über einen Beeper ausgibt.
Der Focus lag auf kleiner Codegröße und stromsparendem Betrieb.

Der verwendete Beeper ist ein einfaches Teil, das zur Tonerzeugung Ein-Ausschaltzyklen mit der Tonfrequenz erwartet.
Das wird durch Timer-Interrupts im 1ms-Rhytmus realsiert. Die Tonhöhe ist also 500Hz.
Zum Stromsparen schläft der Prozessor während der _delay_ms-Routinen.
Der hier verwendete Beeper (KSS-1201) zieht laut Datenblatt bei 3,6V 35mA Strom und ist damit mehr als laut.
Dieser Strom ist jedoch weit höher, als die im MSP430-Datenblatt angegebene maximale Dauer-Belastung von 6mA.
Ein Vorwiderstand von 680Ohm begrenzt die Lautstärke auf recht leise Werte. Mit 390 Ohm ist es laut genug.
Andere Beeper erfordern evtl. andere Werte.
Wer die Belastung des MSP430-Ports klein halten möchte, schaltet einen Transistor als Stromverstärker dazwischen.
Wird das als Emitterschaltung (Beeper und Vorwiderstand an +3V3, Transistor zieht nach Masse) realisiert, sollte allerdings das MSP430-Ausgangssignal invertiert werden, damit im Ruhezustand kein Strom fließt!

Die zentrale Funktion vMorseBeeper() setzt codierte 32Bit-Worte (unsigned long int) in Morsezeichen um.
Je zwei Bits geben Auskunft über die Länge des Elements (0=dit, 1=dah) und die Länge der Pause zum nächsten Element
(0 innerhalb eines Zeichens und 1 zwischen zwei Zeichen eines Worts). LSB first.
Mit dem 32Bit-Wort ist die Länge je Aufruf der Funktion auf 16 Elemente begrenzt.
Für längere Worte erfolgen mehrere Aufrufe der Funktion vMorseBeeper() nacheinander.
Zu dem Zweck enthält der Aufruf der Funktion die Länge der Pause am Ende der Zeichen.
Diese Länge ist 0, wenn Aufrufe kaskadiert werden sollen.
Aus dem Text "CQ DE DL9MWE PSE K" wird dann der Programmtext:
vMorseBeeper(2*8, 0x0000c591L, 5*MS_KURZ); // CQ
vMorseBeeper(2*4, 0x000000a1L, 5*MS_KURZ); // DE
vMorseBeeper(2*14, 0x0d956121L, 0*MS_KURZ); // DL9M
vMorseBeeper(2*4, 0x000000b4L, 5*MS_KURZ); // WE
vMorseBeeper(2*8, 0x0000a094L, 5*MS_KURZ); // PSE
vMorseBeeper(2*3, 0x00000031L, 5*MS_KURZ); // K
Der erste Parameter ist 2*Anzahl der Elemente (Elemente und Pausen).
MS_KURZ ist die Länge eines dits in [ms]. Diese wird in Morse_Beeper.h aus der Angabe WpM (Worte pro Minute) ermittelt.
Damit lässt sich die Aufgabe speicherplatzsparend darstellen.

Aber es ist ein mühsames Geschäft, Texte in diese 32-Bit Worte umzuwandeln.
Das Programm "MSP430_Morse.EXE" bietet hier Hilfestellung. (siehe Anhang)
Es ist eine Konsolenanwendung für Windows und erwartet Texteingaben, die in Programmcode für die CW-Ausgabe umgesetzt werden.
Das Prgramm ist "quick and dirty", na ja weniger quick aber dirty. Aber es funktioniert.
Es erzeugt C-Programmtext mit den Aufrufen der Funktion vMorseBeeper(), der direkt in das MSP430-Projekt kopiert werden kann.
Die Ausgabe erfolgt auf der Konsole und wird zugleich in einer Datei (im Default-Ordner) mit dem Namen des umgewandelten Textes gespeichert.
Die Dateiausgabe klappt natürlich nur, wenn ausschließlich Zeichen umgesetzt werden, die auch in Dateinamen vorkommen dürfen.
Ist das nicht der Fall, wird keine Datei erzeugt.
Die Software wurde erstellt mit dem freien WATCOM-Compiler.

Die ZIP-Datei enthält das MSP430-Projekt sowie das PC-Programm als .c- und .exe-Datei.

vy 73 de Matthias, DL9MWE
Attachments
Morse_Beeper.zip
(74.6 KiB) Downloaded 310 times
Post Reply