Software des Sinus-Oszillators
Beim Testen der alten Version stellte ich fest, dass auf dem NF-Ausgang
ein Gleichspannungsanteil lag; entweder hatte ich damals etwas falsch
gemacht oder die zwischenzeitlich aktualisierte BASCOM-Freeware verhält
sich nun anders. Ich musste den Befehl "Config Timer0" am Ende auf "Pwm
Clear Up" ändern. Der aktualisierte Quelltext mit Kommentaren:
' Sinusoszillator
'
' Sprache: Bascom-AVR-Basic Version 2.0.7.9 Demo/Freeware
' Erzeugung per PWM- Oszillator; sein Puls-Pausenverhaeltnis wird mit den 128 Werten einer approximierten
' Sinusfunktion geladen, so dass sich eine Treppe in Sinusform ergibt.
' Da die PWM- Taktfrequenz ueber 18 kHz betragen muss, damit man sie nicht hoert, muss der AtTiny 13 mit 9,6 MHz
' Takt betrieben werden.
' Der Attiny 13 kann jedoch auf 1,2 MHz geflasht bleiben (Auslieferungszustand), die Taktumschaltung auf 9,6
' MHz erfolgt ueber das CLKPR- Register zur Laufzeit des Programms
' Der Sinus liegt an OC0A, also PB0
' Der Generator wird mit einem Low an PB3 aktiviert (es wird also gegen Masse getastet)
'
' zur Unterdrueckung des Einschaltknacksens schwillt die Huellkurve des Sinus nach einer Quadrat-Funktion
' (Befehl "Shift M, Right Z") an bzw. ab. Nebenbei sorgt sie auch fuer das Enprellen des Tasteingangs (PB3)
'
' Die NF-Ausgangsfrequenz kann ueber Taster an PB2 und PB4 in groben Stufen veraendert werden.
' PB2 und PB4 werden nur in den Tastpausen abgefragt, um die Tonerzeugung nicht "auszubremsen"
' Wegen der Eindeutigkeit wird die Frequenz in jeder Tastpause nur um eine Stufe erhoeht bzw. vermindert.
'
$Regfile = "attiny13.dat"
$Crystal = 9600000
$Hwstack = 32
$Swstack = 8
$Framesize = 8
Dim A As Word ' fuer Verzoegerungsschleife, die zu niedrigerer Frequenz fuehrt
Dim B As Byte ' speichert letzten Wert von A
Dim N As Byte ' fuer die Zaehlschleife
Dim M As Byte ' fuer PWM-Wert
Dim Z As Byte ' fuer Huellkurve
Clkpr = 128 ' Aenderung Taktrate vorbereiten
Clkpr = 0 ' 9,6 MHz
Clkpr = 0 ' Wert bestaetigen
Acsr.7 = 1 ' Analog-Komparator ausschalten, spart etwas Strom
Ddrb = &B0000_0001 ' alle Pins bis auf PB0 Eingang
Portb = &B0001_1110 ' alle Pins bis auf PB0 Pullup-Widerstand
Config Timer0 = Pwm , Prescale = 1 , Compare A Pwm = Clear Up
Start Timer0
Tccr0a.0 = 1 ' wgm00
Tccr0a.1 = 1 ' wgm01
Tccr0b.3 = 0 ' wgm02
Z = 6 ' PWM-Signal ist stets Null
B = 3 ' mittlere Tonhoehe
Do
If Pinb.3 = 0 Then ' Abfrage, ob Signal an PB3 low ist
Gosub Sinus
If Z > 0 Then
Decr Z ' Z startet mit 6 und wird nach jeder Sinsuwelle bis 0 vermindert
End If ' bewirkt Anschwellen der Sinuskurve
Else
A = B ' in B ist der letzte Wert von A gespeichert
If Z < 6 Then
Gosub Sinus
Incr Z ' Z startet mit 0 und wird nach jeder Sinsuwelle bis 6 erhoeht
End If ' bewirkt Abschwellen der Sinuskurve
If Pinb.4 = 0 Then ' Taster zur Verminderung der Frequenz
If A = B Then ' Frequenz nur ein mal pro Tastpause vermindern
Incr A
End If
End If
If Pinb.2 = 0 Then ' Taster zur Erhoehung der Frequenz
If A = B Then ' Frequenz nur ein mal pro Tastpause erhoehen
Decr A
End If
End If
If A = 0 Then ' unzulaessige Werte abfangen
A = 1
End If
If A > 6 Then ' unzulaessige Werte abfangen
A = 6
End If
End If
Loop
Sinus:
Restore Sinusdata ' Zeiger auf Anfang der Data-Tabelle setzen
For N = 1 To 128
Read M
Shift M , Right , Z ' bewirkt Ansteigen der Hüllkurve
Pwm0a = M ' der Wert in PWM0A bestimmt das Puls- / Pausenverhältnis
B = 0
Do ' Verzögerungsschleife, dauert um so länger, je groesser A ist
Incr B
Loop Until B = A
Next N
Return
Sinusdata:
Data 0 , 0 , 0 , 1 , 2 , 3 , 5 , 7 , 9 , 12 , 14 , 17 , 21 , 24 , 28 , 32,
Data 36 , 41 , 46 , 51 , 56 , 61 , 66 , 72 , 78 , 83 , 89 , 95 , 101 , 107 , 114 , 120,
Data 127 , 133 , 139 , 145 , 151 , 157 , 163 , 169 , 175 , 181 , 186 , 192 , 197 , 202 , 207 , 212,
Data 216 , 221 , 225 , 228 , 232 , 235 , 238 , 241 , 244 , 246 , 248 , 250 , 251 , 252 , 253 , 253,
Data 253 , 253 , 253 , 252 , 251 , 250 , 248 , 246 , 244 , 241 , 239 , 236 , 232 , 229 , 225 , 221,
Data 216 , 212 , 207 , 202 , 197 , 192 , 187 , 181 , 175 , 169 , 164 , 158 , 151 , 145 , 139 , 133,
Data 127 , 120 , 114 , 108 , 102 , 96 , 90 , 84 , 78 , 72 , 67 , 61 , 56 , 51 , 46 , 41,
Data 37 , 33 , 28 , 25 , 21 , 18 , 15 , 12 , 9 , 7 , 5 , 3 , 2 , 1 , 0 , 0,
Software der Morsetaste
Den Speichertext für CQ-Rufe, die Stromsparmaßnahmen und den (Rechteck-)
Ton habe ich aus der alten Software rausgeworfen. Der aktualisierte
Quelltext:
' Morsekeyer
' Sprache: Bascom-AVR-Basic Version 2.0.7.9 Demo/Freeware
'
' Hardware:
' Tastkontakte fuer Punkt und Strich an PB3 und PB2 (Tastung gegen Masse).
' Schaltausgang ist PB1. Tastung invertiert, Aktiv = 0V, Ruhe = 5V
' Poti zur Geschwindigkeitseinstellung an PB4
$Regfile = "ATtiny13.dat"
$Crystal = 1200000 ' Taktfrequenz: 1,2 MHz
$Hwstack = 8 ' Platz fuer nur 4 Unterprogramme reserviert, spart SRAM
$Swstack = 0 ' wird nicht gebraucht
$Framesize = 0 ' dito
Dim I As Byte ' wird in Zaehlschleife verwendet
Dim M As Byte ' wird fuers Auslesen der Morsebits verwendet
Dim L As Byte ' wird fuer niederwertigstes Bit von M verwendet
Dim Dit As Word ' Laenge Punkt
Dim Dah As Word ' Laenge Strich
Dim Wort As Word ' Laenge Wortabstand
Dim P As Byte ' Punktspeicher
Ddrb = &B0000_0010 ' Pin PB1 als Ausgang konfigurieren (1), Rest ist Eingang (0)
Portb = &B0000_1111 ' PB1 auf high, PullUp-Widerstaende fuer die Pins PB0, PB2 und PB3 aktivieren
Config Adc = Single , Prescaler = Auto ' AD- Konverter konfigurieren und starten
Start Adc
Do
Start Adc
Gosub Adclesen
If Pinb.3 = 0 Then ' Punktkontakt gedrueckt
Portb.1 = 0 ' Schaltausgang ein (invertierte Logik)
Waitms Dit
Portb.1 = 1 ' Schaltausgang aus
Waitms Dit
End If
Mark:
If Pinb.2 = 0 Then ' Strichkontakt gedrueckt
Portb.1 = 0
Waitms Dah
If Pinb.3 = 0 Then ' Punktkontakt zusaetzlich gedrueckt
P = 1 ' Squeeze- bzw. Punktspeicher
End If
Portb.1 = 1
Waitms Dit
If P = 1 Then
Portb.1 = 0
Waitms Dit
Portb.1 = 1
Waitms Dit
P = 0
Goto Mark
End If
End If
Loop
Adclesen:
Dit = Getadc(2)
Dit = Dit + 416 ' fuer sinnvollen Einstellbereich der Geschwindigkeit
Shift Dit, Right , 4 ' entspricht Teilung durch 16, spart Flash-Speicher
Dah = 3 * Dit
Wort = 8 * Dit
Return
End
Wenn man die Software nicht selbst übersetzen will, kann man die beiden
beigefügten HEX-Files direkt in die Mikrocontroller flashen; ein
ISP-Programmer muß allerdings vorhanden sein. Die Taktrate der
Mikrocontroller kann auf dem Auslieferungszustand verbleiben (1,2 MHz)
Erste Betriebs-Eindrücke
Früher hatte ich auf Kurzwelle gern ausgiebig mit Leuten in Telegrafie
"geklönt", allerdings waren viele Funkamateure sehr kurz angebunden und
beherrschten möglicherweise auch nur "Standard-QSOs". Rapport, Name,
QTH, Stationsbeschreibung und Wetterbericht - das war's. Die
interessierten sich wohl mehr für Diplom-Punkte und QSL-Karten (die
nannte ich schon immer "Gruselkarten", weil ich keine Lust auf das
stumpfe Ausfüllen hatte).
Ganz anders geht es auf dem ICW-Server zu. Da trifft man auf
Telegrafisten, die sich gern stundenlang in Klartext unterhalten,
ähnlich den HSC-Runden auf Kurzwelle, aber nicht so elitär. Auf dem
ICW-Server stellt man gern die Taste langsamer, wenn ein langsamerer
Gast auftaucht. Es gibt auch einen QRS- und einen Übungskanal, außerdem
einen Kanal mit Morseübungen, die man per Tastaturbefehlen an das eigene
Können anpassen kann.
Ob ich den anderen dort schnell zu langweilig werde (oder umgekehrt),
weiß ich noch nicht, aber die ersten Verbindungen waren sehr entspannend
und interessant. Bemerkenswert finde ich auch, dass das System nicht
nur Funkamateuren offen steht; ein Teilnehmer ist ehemaliger Seefunker,
hatte aber nie ein Amateurfunk-Call.
Es ist jedoch nicht "rund um die Uhr" etwas los. Um 21:00 Uhr trifft
sich eine Runde regelmäßig, aber tagsüber herrscht manchmal stundenlang
Leere. Aber man kann sich ja einloggen und auf die Lauer legen. Wenn
dann jemand erscheint, hat man mindestens eine Stunde zu tun ;) .
Auf ein bisschen "Gefummel" muss man sich einstellen, aber wenn man die
Einrichtungshilfe von DL1YGH beherzigt und notfalls in eine externe
USB-Soundkarte investiert, sollte es klappen (ich kämpfe allerdings noch
mit sporadischen Paketverlusten, die bei den Gegenstationen zu unsauber
wiedergegebenen Zeichen führen), und man kann sich auf CW-QSOs freuen,
bei denen das Gesendete wirklich beim Empfänger ankommt, einem die
Ausbreitungsbedingungen keinen Strich durch die Rechnung machen und sich
in einer Runde wirklich alle Teilnehmer hören können.
Download des Quellcodes:
1019-icw-morsetaste.zip