Konfigurierbare Morse-Baken        

von Ralf Beesner, DK5BU                
Elektronik-Labor   Projekte   AVR 




Einleitung

Bei den Morsebaken, die ich 2009 entwickelt hatte, ist der Bakentext fest einkompiliert, so dass man Bascom und ein Programmiergerät braucht, um den Bakentext zu ändern. Die im folgenden vorgestellte Variante lässt sich über eine serielle Schnittstelle konfigurieren; allerdings reicht der knappe EEPROM-Speicher des ATtiny 13 lediglich für maximal 63 Zeichen.


Hardware



Abbildung 1: konfigurierbare Morsebake




Abbildung 2: konfigurierbare Morsebake; Streifenleitungs-Platine


Die serielle Schnittstelle orientiert sich an der Lernpaket-Mikrocontroller-Hardware. TxD, RxD und DTR liegen an Pin 7 (PB2), Pin 6 (PB1) und Pin 5 (PB0/OC0A). Pin 5 wird doppelt genutzt; er wertet nicht nur das DTR-Signal des PC aus, sondern stellt auch das NF-Morsesignal bereit. Es wird über einen Koppelkondensator und einen Schutzwiderstand von 10 kOhm zur Weiterleitung an den NF- Eingang eines Senders bereitgestellt (zur Pegeleinstellung ist je nach Sender ein separater Spannungsteiler erforderlich). Ein Piezo-Buzzer dient als Mithörkontrolle.

Ein parallel zur NF getaktetes Schaltsignal liegt an Pin2 (PB3), es wird durch Q1 invertiert und passt so zum Telegrafieanschluss üblicher Amateurfunkgeräte. Soll das Sendegerät nach jedem Zyklus abgeschaltet und vor Beginn wieder eingeschaltet werden, liegt ein Schaltsignal an Pin 3 (PB4) an. Die Schaltstufe ist hier jedoch nicht bestückt.

Im Bakenbetrieb und während der Konfiguration muss die Platine extern mit 5V versorgt werden (die Platine wird nicht über RTS/DTR der seriellen Schnittstelle gespeist; hier endet die Gemeinsamkeit mit der LP-Mikrocontroller-Hardware).

Hängt die Platine an einem PC und ist ein Terminalprogramm gestartet, das die DTR-Leitung auf High zieht und wird dann die Betriebsspannung angelegt, wird in den EEPROM-Beschreib-Modus gewechselt, sofern ein Jumper oder eine Lötbrücke die Pins 1 und 2 von JP1 verbinden. Falls das Terminalprogramm kein DTR-High ausgibt, kann man den Jumper auf 2 - 3 umstecken und so ein High an PB0 erzwingen.

Der Stiftabstand der DSub-9-Buchsen liegt leider nicht im 2,54mm-Raster. Es gibt jedoch zwei Bauformen der DSUB-Buchsen für Platinenmontage; wenn man statt der geschlossenen die offene Bauform wählt, kann man die Stifte so zurechtbiegen, dass sie ins 2,5mm-Raster passen.


Software

Die Bascom-Listings sind ausführlich kommentiert; daher nur ein paar Anmerkungen:

Unmittelbar nach Anlegen der Betriebsspannung wird (nur ein mal; siehe weiter oben) geprüft, ob an PB0 High-Potential anliegt, dann verzweigt das Programm in den EEPROM-Beschreib-Modus.

Zunächst ist eine Zahl 1...9 einzugeben; aus ihr wird die Geschwindigkeit der Morseausgabe berechnet. Anschließend ist direkt der Text einzugeben. Da der Soft-UART nur in halbduplex ohne Zeichenpuffer arbeitet, müssen die Zeichen einzeln von Hand eingegeben werden, damit ausreichende Pausen zwischen den Zeichen entstehen. Werden mehrere Zeichen "in einem Rutsch" gesendet, gehen Zeichen verloren. Der Abschluss muss mit dem ASCII-Zeichen 13 erfolgen (das Terminalprogramm sollte so konfiguriert sein, dass es nur CR ohne Linefeed sendet).

Als Terminalprogramm eignet sich z.B. Mikros.exe aus dem Lernpaket Mikrocontroller; bei ihm kann man das DTR-Signal von Hand setzen. Eingabefehler lassen sich nicht mit Backspace korrigieren, das Programm muss neu gestartet werden.

Ist der Text komplett, sendet das Programm 3 Sekunden Dauerton, anschließend den Bakentext, fügt 10 Sekunden Pause an und startet den nächsten Sendezyklus.


Mehr EEPROM-Speicher

Das Programm läuft mit minimalen Änderungen auch auf einem ATtiny 45 (nach Änderung der Definitionsdatei auf ATtiny45, Ändern der Taktrate auf 1 MHz und Erweiterung der beiden Zählschleifen-Obergrenzen von 63 auf 255). Da auch mehr Flashspeicher zur Verfügung steht, könnte man den Anfangs-Dialog etwas "aufbohren" und neben der Geschwindigkeit auch die Längen von Dauerton und Pause sowie die Tonhöhe konfigurierbar machen.

Download: konfigurierbare-morsebake-soft.zip



Quellcode:
'
' Morsebake für max. 63 Zeichen Speichertext
' Der Text wird über die serielle Schnittstelle (9600 bit/s) eingeschrieben; so lässt sich der Bakentext ändern,
' ohne den ATtiny neu flashen zu müssen. Der Text wird im EEprom gespeichert.
' Sprache: Bascom-AVR-Basic Version 2.0.7.5 Demo
'
' Pin PB0 wird als Timer0-Ausgang OC0A verwendet, Ton wird durch Umschalten des Pins als Eingang / Ausgang ein- und
' ausgeschaltet.
'
' Liegt beim Einschalten ein "High" an PB0 (Auswertung des DTR- Signals des Terminalprogramms), startet der Speicher-
' einschreibmodus. Daher ist ein externer Pulldown-Widerstand an PB0 erforderlich
'
' PB3 wird als Keyer-Ausgang verwendet.
' PB4 schaltet PTT bzw. die Stromversorgung für den Sender
'
' Pin PB1 und PB2 bilden einen Software- UART (eingegebene Zeichen werden als Echo auf das Terminal zurückgesendet)
'
' Der Bascom- Software- UART hat keinen Zeichenpuffer; die Zeichen dürfen nicht zu schnell eingeschrieben werden
'
' Bei 4a hinzugekommen: Terminal- Dialog
' Bei 4b: Datazeilen einsparen
' Bei 5 hinzugekommen: Speed-Abfrage   1 ... 9    45 zpm ... 100 Zpm

'------------------------------------------------------------------------------



$regfile = "ATtiny13.dat"
$crystal = 1200000
$hwstack = 8                                                ' reicht für 4 Unterprogramme, spart SRAM
$swstack = 0                                                ' wird nicht gebraucht, spart SRAM
$framesize = 0                                              ' dito


Dim I As Byte                                               'Für temporären Gebrauch als Schleifenzähler
Dim N As Byte
Dim Recbyte As Byte
Dim M As Byte                                               ' Index des aktuellen Morsebuchstabens in unserer Tabelle
Dim L As Byte                                               ' für niederwertigstes Bit beim bitweisen Erzeugen des Morsezeichens

Dim Punktlaenge As Word
Dim Strichlaenge As Word
Dim Wortpause As Word

Const Tonhoehe = 20                                         ' Tonhöhe


' Morseton mit Timer0 erzeugen:
'
' Timer0 zählt das Register TCNT0 hoch. Es wird mit Register OCR0A verglichen.
' Wenn TCNT0 = OCR0A, wird Output OC0A/PB0 umgeschaltet (getoggled)
' Timer0 erzeugt so Dauerton; er wird jedoch nur an den Ausgangspin durchgeschaltet,
' wenn das Datenrichtungs- Register DDRB.0 = 1 ist. Bei 0 wird der Ton unterdrückt.
'

Config Timer0 = Counter , Prescale = 64 , Compare A = Toggle , Clear Timer = 1
Ocr0a = Tonhoehe

Acsr.acd = 1                                                ' Analog-Komparator ausschalten, spart etwas Strom
Portb = &B00000010                                           ' PB1 Pullup, PB0 Eingang ohne Pullup (externer Pulldown)
Ddrb = &B00011000                                           ' PB3 und PB4 Ausgang; Rest Eingang


Open "comb.2:9600,8,n,1,inverted" For Input As #1           ' Software- UART Input an PortB.2
Open "comb.1:9600,8,n,1,inverted" For Output As #2          ' Software- UART Output an PortB.1


'------------------------------------------------------------------------------


Main:

 If Pinb.0 = 1 Then                                         ' ser. Schnittstelle angeschlossen, DTR = High
    Print #2 , "Speed (1-9), dann Bakentext. Ende mit "
For N = 0 To 63
Get #1 , Recbyte ' einlesen
Put #2 , Recbyte ' Echo auf Terminal zurücksenden
Writeeeprom Recbyte , N
If Recbyte = 13 Then
Exit For
End If
Next
End If

Readeeprom I , 0 ' 48 ....57
Punktlaenge = 63 - i ' 15 ... 6
Shift Punktlaenge , Left , 3 ' entspricht *8
Strichlaenge = Punktlaenge
Shift Strichlaenge , Left , 1 ' entspricht *2
Strichlaenge = Strichlaenge + Punktlaenge ' nun *3
Wortpause = Punktlaenge
Shift Wortpause , Left , 2 ' enstpricht *4
Wortpause = Wortpause + Punktlaenge ' nun *5


Do

Portb.4 = 1 ' Stromversorgung Sender an
Ddrb.0 = 1 ' Ton an
Portb.3 = 1 ' PTT an
Wait 3 ' Dauerton 3 sec
Ddrb.0 = 0 ' Ton aus
Portb.3 = 0
Wait 1

For N = 1 To 63 ' max. Msg_laenge 63
Readeeprom Recbyte , N
If Recbyte = 13 Then
Exit For
End If
If Recbyte > 90 Then ' in Kleinbuchstaben wandeln
Recbyte = Recbyte - 32
End If
Recbyte = Recbyte - 32 ' Morsetabelle faengt ert bei 32 an
M = Lookup(recbyte , Morsetabelle) ' Morsezeichen aus Tabelle holen
Gosub Morse
Next N


Portb.4 = 0 ' Stromversorgung Sender aus
Wait 10 ' Pause

Loop


Morse:

If M = 0 Then ' Sonderfall: Leerzeichen;
Waitms Wortpause
Goto Zeichenende
End If

For I = 1 To 8
If M = 1 Then ' Das Byte hat nur noch den Wert 1; Zeichenende!
Goto Zeichenende
End If
L = M And &B00000001 ' niederwertigstes Bit lesen
Ddrb.0 = 1
Portb.3 = 1
If L = 1 Then
Waitms Strichlaenge ' ist das Bit 1 -> dah
Else
Waitms Punktlaenge ' ist das Bit 0 -> dit
End If
Ddrb.0 = 0
Portb.3 = 0
Waitms Punktlaenge ' Pause innerhalb des Morsezeichens
Shift M , Right , 1 ' Bits um eine Stelle nach rechts shiften
Next I

Zeichenende:
Waitms Strichlaenge ' Pause zwischen Morsezeichen

Return

End


'------------------------------------------------------------------------------

Morsetabelle:


' Ascii 32 - 47 -> _!"#$%&'()*+,-./
Data 0 , 0 , &B01010010 , 0 , 0 , 0 , &B00101010 , 0 , &B00101101 , &B01101101 , 0 , &B00101010 , &B01110011 , &B01100001
Data &B01101010 , &B00101001

' Ascii 48 - 57 -> 0123456789
Data &B00111111 , &B00111110 , &B00111100 , &B00111000 , &B00110000 , &B00100000 , &B00100001 , &B00100011 , &B00100111 , &B00101111

'Ascii 58 - 64 -> :;<=>?@
Data &B01000111 , &B01110011 , &B00101101 , &B00110001 , &B01101101 , &B01001100 , 0

' Ascii 65 - 90 ABCDEFGHIJKLMNOPQRSTUVWXYZ
Data &B00000110 , &B00010001 , &B00010101 , &B00001001 , &B00000010 , &B00010100 , &B00001011 , &B00010000 , &B00000100
Data &B00011110 , &B00001101 , &B00010010 , &B00000111 , &B00000101 , &B00001111 , &B00010110 , &B00011011 , &B00001010
Data &B00001000 , &B00000011 , &B00001100 , &B00011000 , &B00001110 , &B00011001 , &B00011101 , &B00010011




Elektronik-Labor   Projekte   AVR