Morse-Telegraphie für den Sparrow
Zwar hat sich die binäre Telegraphie bei der Eingabe von Zahlen
bewährt, aber wenn es um Textzeichen geht, hat die Morse-Telegraphie
weiterhin ihre Bedeutung. Und da der Sparrow gleich auch sein eigener
Hochfrequenzsender ist, ist diese Art der Datenübertragung eine
praktische Sache. Das grundlegende Verfahren der Zeichenerkennung und
-Kodierung wurde bereits mit anderen AVR-Controllern vorgestellt: Morsedecoder
Der Sparrow-Morse-Sputnik
Das
Programm erzeugt ein mit ca. 1 kHz moduliertes HF-Signal bei ca.
520 kHz. Wie beim ersten Sparrow-Sputnik kann das Signal auch auf
Oberwellen bei ca. 1 MHz und bei 1,5 MHz gehört werden. Das
Morsesignal hat eine Geschwindigkeit von etwa 60 BpM. Es werden
zufällige Fünfergruppen erzeugt, wie man sie gern beim Üben
verwendet. Der Sparrow wird dazu einfach auf ein Mittelwellenradio
gelegt und koppelt dann induktiv auf die Ferritantenne. Es werden alle
gesetzlichen Grenzwerte für die induktive Übertragung eingehalten,
und die Nachbarn hören nichts davon.
Download: Sparrow_Morse-Sputnik.zip
Direkt laden: http://tiny.systems/categorie/cheepit/MorseSputnik.html
'Sparrow_Morsen_Sputnik.bas
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 8
$swstack = 4
$framesize = 4
Led1 Alias Portb.1
Led2 Alias Portb.3
S1 Alias Pinb.0
S2 Alias Pinb.2
Config Portb = &B000011010
Dim D As Byte
Dim T As Byte
Dim B As Byte
Dim C As Byte
Dim N As Byte
Dim M As Byte
Dim I As Byte
Dim J As Byte
Clkpr = 128 '9,6 MHz
Clkpr = 0
Clkpr = 0
Declare Sub Receivemorse
Declare Sub Sendmorse
Do
For I = 1 To 5 'Zufällige Fünfergruppen A...Z
C = Rnd(24)
C = C + 2
If C = 19 Then C = 27
If C = 21 Then C = 28
Sendmorse
Waitms 300
Next I
Waitms 1500
Loop
Sub Receivemorse
C = 0
Do
Do
Loop Until S1 = 0
T = 0
Do
For M = 1 To 10
For N = 1 To 250 'ca. 520 kHz
Led1 = 1
Led1 = 0
Next N
Waitms 1 'ca 1 kHz AM
Next M
T = T + 1
Loop Until S1 = 1
Waitms 10
If T > 15 Then
C = C + B
End If
Shift B , Left
T = 0
Do
Waitms 10
T = T + 1
Loop Until S1 = 0 Or T > 25
Loop Until T > 25
End Sub
Sub Sendmorse
J = 1
Do
Shift C , Left
B = C And 128
J = J + 1
Loop Until B = 128
Do
Shift C , Left
J = J + 1
B = C And 128
If B = 128 Then
For T = 1 To 240
For N = 1 To 250 'ca. 520 kHz
Led1 = 1
Led1 = 0
Next N
Waitms 1 'ca 1 kHz AM
Next T
Else
For T = 1 To 80
For N = 1 To 250 'ca. 520 kHz
Led1 = 1
Led1 = 0
Next N
Waitms 1 'ca 1 kHz AM
Next T
End If
Waitms 100
Loop Until J = 8
End Sub
Sparrow-Morse-Memory
Da
möchte man sich etwas notieren, aber der Bleistift ist abgebrochen.
Dann bleibt nur der Sparrow, was sonst. Die Notiz wird einfach
hineingemorst und kann nach einem Reset wieder abgerufen werden. Auch
hier geht es wieder um echte Morsezeichen (nicht um Zahlen im binären
Telegraphie-Code). Aber trotzdem sucht man die Morsezeichentabelle im
Programm vergeblich. Eigentlich kann der Sparrow gar nicht morsen, er
merkt sich einfach nur Punkte und Striche sowie Zeichenpausen, und die
gibt er dann wieder. Mit einer Ausnahme, er kennt das Ende-Zeichen
.-.-. und setzt dann eine 255 in das EEPROM. So weiß er im
Abspielmodus, dass die Nachricht an ihr Ende gekommen ist.
Der
Sparrow gibt alles wieder, mit allen Sonderzeichen, die man
vielleicht gerade erst erfunden hat, und mit allen Fehlern, die man
eventuell gemorst hat. Das Programm eignet sich daher auch zum Üben. Am
Anfang braucht es vielleicht mehrere Versuche, bis die Notiz richtig
drin ist. Aber nach einiger Zeit geht es immer besser. Dann kann man
natürlich auch einen Standard-CQ-Ruf einspeichern und damit einen
Sender steuern. Oder einfach auf Mittelwelle abhören, denn auch dieses
Programm bildet wie der Sputnik einen kleinen AM-Sender. Wer mehr auf
NF steht kann aber auch einen Lautsprecher mit 1-k-Vorwiderstand an B1
anschließen.
Download (update 22.12.14): Sparrow_Morse-Memory.zip
Direkt laden: http://tiny.systems/categorie/cheepit/MorseMemory.html'Sparrow_Morse_Memory.bas
$regfile = "attiny13.dat"
$crystal = 9600000
$hwstack = 8
$swstack = 4
$framesize = 4
Led1 Alias Portb.1
Led2 Alias Portb.3
S1 Alias Pinb.0
S2 Alias Pinb.2
Config Portb = &B000011010
Dim D As Byte
Dim T As Byte
Dim B As Byte
Dim C As Byte
Dim N As Byte
Dim M As Byte
Dim I As Byte
Dim J As Byte
Dim A As Byte
Clkpr = 128 '9,6 MHz
Clkpr = 0
Clkpr = 0
Declare Sub Receivemorse
Declare Sub Sendmorse
Do
A = 0
Do
Readeeprom C , A
If C < 255 Then Sendmorse
A = A + 1
Waitms 300
Loop Until C = 255
A = 0
Do
T = 0
Do
Waitms 10
T = T + 1
If T > 30 Then T = 30
Loop Until S1 = 0
If T = 30 Then
D = 1
Writeeeprom D , A
A = A + 1
End If
Receivemorse
D = C
Writeeeprom D , A
A = A + 1
If C = &B00101010 Then
D = 255
Writeeeprom D , A
End If
Loop Until D = 255
Loop
Sub Receivemorse
C = 1
Do
Shift C , Left
Do
Loop Until S1 = 0
T = 0
Do
For M = 1 To 10
For N = 1 To 250 'ca. 520 kHz
Led1 = 1
Led1 = 0
Next N
Waitms 1
Next M
T = T + 1
Loop Until S1 = 1
' Pwm0b = 0
Waitms 10
If T > 15 Then
C = C + 1
End If
Shift B , Left
T = 0
Do
Waitms 10
T = T + 1
Loop Until S1 = 0 Or T > 25
Loop Until T > 25
End Sub
Sub Sendmorse
If C = 1 Then
Waitms 300
Else
J = 1
Do
Shift C , Left
B = C And 128
J = J + 1
Loop Until B = 128
Do
Shift C , Left
J = J + 1
B = C And 128
If B = 128 Then
For T = 1 To 240
For N = 1 To 250 'ca. 520 kHz
Led1 = 1
Led1 = 0
Next N
Waitms 1 'ca 1 kHz AM
Next T
Else
For T = 1 To 80
For N = 1 To 250 'ca. 520 kHz
Led1 = 1
Led1 = 0
Next N
Waitms 1 'ca 1 kHz AM
Next T
End If
Waitms 100
Loop Until J = 8
End If
End Sub
22.12.14: Erweiterung um eine Löschtaste S2
Holger
Fritzsch schrieb: Ich finde das Morse-Memory genial. Darum werde
ich einen ATTINY, nur dafür, in ein kleines Gerät bauen.
Das ist die einzige Annehmlichkeit meines Pflichtarmeedienstes, dass
ich als ehemaliger Oberfunker noch gut morsen kann. Darum meine Frage,
kann man nicht eine Funktion, (S2) ist noch frei, zum Löschen des
letzten Zeichens implementieren?
Gute Idee, das Programm wurde
nun so erweitert, dass bei einem kurzen Druck auf S2 der Adresszeiger
um Eins verkleinert wird. Wenn man sich also vermorst hat, kann das
letzte Zeichen gelöscht werden.
Ausschnitt aus dem erweiterten Programm:
A = 0
Do
T = 0
Do
Waitms 10
T = T + 1
If T > 30 Then T = 30
'Löschen
If S2 = 0 Then
Do
Waitms 100
Loop Until S2 = 1 'Ein Zeichen löschen
A = A - 1
Waitms 100
End If
'Loschen Ende
Loop Until S1 = 0
If T = 30 Then
D = 1
Writeeeprom D , A
A = A + 1
End If
Receivemorse
D = C
Writeeeprom D , A
A = A + 1
If C = &B00101010 Then
D = 255
Writeeeprom D , A
End If
Loop Until D = 255