Konfigurierbare Morse-Baken
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