Pfad:
Home =>
cq-dl-Beiträge => Teil 4
cq-dl-Beiträge zu ATMEL-AVR-Mikrocontrollern
Teil IV: Applikation CW-Geber
Dieser Beitrag beschreibt einen CW-Geber mit einem AVR Mikroprozessor des Typs
AT90S2313. Damit sollen die vielfältigen Hardware- und Software-Fähigkeiten
demonstriert werden, die diese Prozessoren für den anspruchsvollen Bastler
haben können.
Wer ein STK200- oder STK500-Programmierboard besitzt, kann auf den Bau der Hardware
weigehend verzichten und die Software für das entsprechende Board direkt
verwenden (siehe Betrieb mit Board).
Die Beschaltung des Prozessors demonstriert, wie die interne Hardware mit
wenigen externen Komponenten für die Lösung einer recht komplexen Aufgabe
genutzt werden kann. Der interne 16-Bit-Timer wird zur exakten Erzeugung der
Niederfrequenz verwendet. Die Hardware lehrt ferner, wie ein RS232-Interface
zur Kommunikation mit der Mikroprozessor-Software realisiert werden kann. Diese
Kommunikation erfolgt zudem mit einem Hardware-Protokoll gesteuert. Das
Beispiel zeigt auch, wie der Mikroprozessor in der fertigen Hardwareschaltung
programmiert werden kann.
Softwareseitig kann an dem Beispiel demonstriert werden, wie die
interrupt-gesteuerte Kommunikation mit der RS232-Schnittstelle und der
Timer-gesteuerten NF-Erzeugung funktioniert. Ferner wird in Rechenpausen der
stromsparende SLEEP-Betrieb des Prozessors verwendet. Die programminterne
Ablaufsteuerung und die Kommunikation der internen Abläufe miteinander erfolgt
im wesentlichen über ein Flagregister. Als weitere Software-Besonderheiten sind
die Multiplikation und Division von binären Ganzzahlen zu nennen. Schließlich
ist in der kleinen Steuerung auch ein komfortables User-Interface enthalten,
das die Einstellung der wichtigsten Eigenschaften der CW-Ausgabe erlaubt.
Insgesamt fördert dieses Stück Software wegen der Komplexität und
Unübersichtlichkeit kaum das Verständnis beim blutigen Anfänger. Einzelne Teile
können aber gerne von dieser Vorlage abgekupfert und für den eigenen Gebrauch
umgebogen werden oder als Anregung dienen.
Natürlich soll das Ding für den eigentlichen Zweck, das Geben von Morsezeichen,
brauchbar sein. Irgendwann lerne auch ich die damit mal.
Die fertig aufgebaute und programmierte Schaltung gibt ohne angeschlossenen PC
beim Einschalten einen Text in CW mit festgelegter Geschwindigkeit und Tonhöhe
aus. Mit einem über die serielle Schnittstelle angeschlossenen PC und einem
dort laufenden Terminalprogramm (z.B. Hyperterminal für Windows) kann nach
Ausgabe des gespeicherten Textes zeilenweise Text eingegeben und in CW wieder
ausgegeben werden. In Maßen kann während der Ausgabe schon weiter Text
eingegeben werden.
Mit dem Terminalprogramm kann auch eine vorgefertigte Textdatei an die
Schaltung geschickt werden, die mehrzeilige Texte enthält. Dabei sorgt das
Hardware-gesteuerte RS232-Protokoll dafür, dass keine Zeichen verloren gehen,
da die Textübergabe immer schneller erfolgt als die Ausgabe der Zeichen in CW.
Mit dem Terminalprogramm kann man nach Eingabe von ESCAPE ferner die
eingestellten Werte für die erzeugte NF-Frequenz, die Gebegeschwindigkeit und
den beim Reset auszugebenden Text ändern und die verstellten Werte im internen
EEPROM ablegen. Die Einstellung erfolgt komfortabel menuegesteuert.
Der gesamte Hardware-Aufbau ist recht einfach. Der Aufbau ist im Schaltbild zu
sehen.
Schaltbild im GIF-Format
Schaltbild im PDF-Format
Im Zentrum steht der beliebte, leicht erhältliche und preiswerte 20-polige
AVR-Prozessor vom Typ AT90S2313-10P. Als Taktgeber wurde ein vorhandener Quarz
mit 10 MHz gewählt, die Hard- und Software funktioniert aber auch noch mit
wesentlich geringerer Taktfrequenz, ab 1 MHz aufwärts. (Bei anderen
Taktfrequenzen muss nur ein Parameter in der Software geändert werden.) Die
Hardware für den Prozessor-Reset ist ebenfalls einfach gehalten, weil mit der
Schaltung ja keine Bremsen für eine Straßenbahn gesteuert werden sollen,
bei der Spikes auf der Versorgungsspannung sicherheitshalber zur Auslegungsgrundlage
gehören würden.
Die Ausgabe der NF erfolgt am Port-Pin PB3. Das ist mit Bedacht gewählt, da
dieser Pin softwaregesteuert auch als Ausgabe-Pin OC1 des 16-Bit-Timers
verwendet werden kann. Die Anschaltung des Lautsprechers über eine einfache
Gleichstromtrennung ist sehr einfach, aber etwas hart. Zur
Lautstärkeeinstellung wäre statt des 470-Ohm-Widerstandes noch ein Poti
angebracht, für echte Anwendungen wie z.B. die Ansteuerung einer
AM/FM/SSB-Sendeanlage noch geeignete RC-Netzwerke zur Abrundung der
Rechteckflanken.
Das RS232-Interface zur Kommunikation mit dem PC ist mit einem MAX232
aufgebaut, der zu den vier V24-Treibern auch noch die Spannungserzeugung aus 5V
enthält. Die Beschaltung des 9-poligen Steckers ist zur Verwendung eines
Nullmodem-Kabels ausgelegt, bei dem die Sende-/Empfangs- und die
RTS-/CTS-Leitung zur Verbindung zweier PCs über die COM-Schnittstelle gekreuzt
sind. Verwendet man stattdessen ein Parallel- oder 1:1-Kabel, muss die
Vertauschung schon in der Schaltung erfolgen (vertauschen von RD/TD und
RTS/CTS). Die beiden Jumper Data und Control ermöglichen in der Stellung Loop
den Test von Verbindungskabeln, Steckern und MAX232 ohne jede Mitwirkung des
Prozessors und sind für den manuellen Aufbau hilfreich. Sie können auch
entfallen, wenn man diese Diagnosemöglichkeit nicht braucht.
Für das Experimentieren mit der Software im 2313 ist das ISP-Interface ideal
geeignet, da man damit den Chip mit immer neuen Softwareversionen beschicken
kann, ohne ihn aus der Schaltung heraus nehmen zu müssen. Da an Port-Bits in
dieser Schaltung kein Mangel besteht, sind die Portbits PB5 (MOSI), PB6 (MISO)
und PB7 (SCK) ausschließlich für diesen Zweck reserviert und Maßnahmen zur
Umschaltung zwischen Normalbetrieb und In-System-Programmierbetrieb können
entfallen. Das Programmier-Interface eignet sich zur Anschaltung an die
entsprechende 10-polige Schnittstelle auf dem ATMEL Board STK500, zur direkten
Verbindung mit der Parallel-Schnittstelle über das KANDA-Interface, das mit dem
STK200 mitgeliefert wird, oder auch einem selbst gebauten ISP-Interface. Die
Programmier-LED kann zur Not auch weggelassen werden.
Die Stromversorgung mit 5V ist einfach und kann zur Not auch mit einer kleinen
Batterie erfolgen. Wenn keine weitere Hardware versorgt werden soll, reicht
auch ein 78L05 völlig aus.
Die Software für die Selbstbauversion (ohne Programmierboard) kann
in verschiedenen Versionen angezeigt und heruntergeladen
werden, sie ist in AVR-Assembler geschrieben. Sie umfasst ausführlich
kommentiert ca. 1100 Textzeilen und ergibt assembliert ca. 650 Worte Programm
und ca. 360 Worte an Konstanten (Morsecode-Tabelle, Texte zur menuegesteuerten
Kommunikation). Insgesamt ist der verfügbare Programmspeicher im 2313
(1 k Worte) damit zu 97% ausgelastet. Zur korrekten Übersetzung ist die
von ATMEL verfügbare
Headerdatei 2313def.inc erforderlich.
Alle wichtigen Parameter können im Kopf der Software frei eingestellt werden,
so dass die Anpassung bei geänderter Hardware keine großen Probleme verursachen
dürfte. Beim Umschreiben der Software für größere Prozessoren (z.B. AT90S8515)
ist darauf zu achten, dass einige Zeigeroperationen wegen des größeren
verfügbaren SRAM- und EEPROM-Bereichs zusätzliche Änderungen im Code brauchen,
damit die 16-Bit-Zeiger richtig funktionieren (z.B. beim Lesen und Schreiben
des EEPROM-Speichers). Das betrifft auch andere Taktraten, Interrupt-Vektoren,
den SRAM-Stapel, etc. An den 8515 angepasste Versionen sind Anhang
enthalten.
Morsecodes
Alle Morsecodes der ASCII-Zeichen 32 bis 95 sind in einer Tabelle im Programm
abgelegt. Kleinbuchstaben werden durch Abziehen von 32 in Großbuchstaben
umgewandelt. Jedes Zeichen benötigt ein Byte mit dem Code (Punkt=0, Strich=1),
von höherwertigen zu niederwertigen Bits organisiert, und ein Byte mit der
Anzahl Punkte/Striche des jeweiligen Zeichens. Undefinierte Zeichen werden mit
einem Fragezeichen ausgegeben, sie haben die Anzahl Punkte/Striche Null. Beim
Leerzeichen sorgt ein gesetztes siebtes Bit für eine Stummschaltung des
NF-Ausganges.
In dieser Tabelle kann der CW-Purist beliebig herumtoben und umbelegen. Das
kommt für einige Sonderzeichen infrage, insbesondere für Belegung der folgenden
Codes.
ASCII Morse
-----------
! Warten
# ñ
$ á, å
% é
& (frei)
* (frei)
+ Spruchende
< Verkehrsanfang
> Verkehrsende
@ ch
[,{ ä
\,~ ö
],} ü
^ Irrung
Interruptsteuerung
Besonderheiten des Programmes liegen in dem überwiegend interruptgesteuerten
Ablauf. Über eine entsprechende Vektortabelle wird der Empfang von Zeichen über
die serielle Schnittstelle (nicht bei Menuebetrieb!) und die Timer-Interrupts
zur Erzeugung der korrekten Anzahl NF-Pegelwechsel in Abhängigkeit von der
Gebegeschwindigkeit auf die beiden entsprechenden Interrupt-Service-Routinen
verteilt. Der Prozessor selbst befindet sich beim Interrupt-Betrieb die meiste
Zeit im stromsparenden SLEEP-Modus und wird nur durch Hardware-Interrupts
aufgeweckt. Die Übergabe von Senden und Empfang erfolgt über entsprechende
Registerflag, das nach jedem Aufwecken überprüft wird, und den Ablauf in die
entsprechenden Routinen verzweigt. Wegen des erheblichen Zeitbedarfs und der
Komplexität des Ablaufes ist der Menuebetrieb nicht innerhalb der
Interruptsteuerung angesiedelt, er erfolgt durch Polling an der
UART-Schnittstelle.
Rechenroutinen
Wichtig sind die eingebauten Rechenroutinen zur Multiplikation und Division von
32-Bit-Binärzahlen. Sie dienen der Umrechnung vom Prozessor- und Timer-Takt in
die der NF-Frequenz angepassten 16-bittigen Compare-Match-Zahl des NF-Timers
und der Berechnung der Anzahl von Interrupts zur Erzielung der richtigen Dauer
von Punkten und Strichen, abhängig von der eingestellten NF-Frequenz und der
Gebegeschwindigkeit. Da diese beiden Eingangsgrößen verstellbar sind, müssen
nach jeder Verstellung diese Rechenroutinen bemüht werden, um die Steuerung
anzupassen. Achtung: diese Routinen funktionieren nur innerhalb von besonderen
Wertebereichen und sind nicht ohne weiteres auf andere Wertebereiche von
Binärzahlen anwendbar. Der Rechenmechanismus der Multiplikation (16-bit mal
16-bit binär) und der Division (32-bit durch 16-bit binär, 32-bit durch 8-bit
binär) ist aber erkennbar und leicht auf andere Rechenaufgaben übertragbar.
Steuerung des Hardware-Protokolles
Ungewöhnlich ist die Steuerung der seriellen Schnittstelle zum PC mit dem
RTS/CTS-Hardware-Protokoll. Die Schaltung signalisiert dem PC über die
CTS-Leitung, ob sie empfangsbereit für weitere Zeichen ist. Diese Steuerung ist
notwendig, wenn ganze Textdateien übertragen und ausgesendet werden sollen.
Dabei reichen die intern vorhandenen 128 Bytes SRAM zur Zwischenspeicherung der
gesamten Datei nicht aus (ein Teil des SRAM wird zudem für den Stack benötigt),
die Übertragung muss entsprechend dem Ausgabefortschritt abgebremst werden.
Deshalb enthält sowohl die Timer-Ausgaberoutine als auch die
UART-Empfangsroutine entsprechende Prüfungen, ob der verfügbare Pufferbereich
zum Empfang weiterer Zeichen ausreicht und setzt die CTS-Leitung
dementsprechend auf aktiv oder inaktiv. Auf diesen Teil (und auf die
entsprechenden Leitungen und andere Beschaltungen) kann verzichtet werden, wenn
ein entsprechender Senderhythmus der Zeichen eingehalten wird. Aber wir wollten
ja unbedingt lernen, wie so was funktioniert!
Auf dem PC muss zur Kommunikation mit dem CW-Geber ein Terminalprogramm laufen,
das die verwendete serielle Schnittstelle mit der voreingestellten Baudrate von
9.600 Baud und mit 8N1 bedient. Dazu ist jedes primitive Terminalprogramm (z.B.
Hyperterminal) geeignet.
(=> Screenshot: Einstellungen im Hyperterminal)
Man muss das Programm nur davon abhalten, ein Modem am anderen Ende der
seriellen Leitung zu erwarten, weil sonst die AT-Befehle gemorst werden und
keine korrekte Rückmeldung vom "Modem" (OK) kommt. Also wird z.B. Hyperterminal
in der Einstellung "Direktverbindung über COMx" betrieben.
(=> Screenshot: Nach dem Einschalten meldet sich der 2313
und morst vor sich hin)
Damit man das Einstellmenue im 2313 herankommt, muss das Terminalprogramm beim
Betätigen der ESCAPE-Taste tatsächlich das ESC-Zeichen (hex: 1B, dezimal: 27)
über die Schnittstelle senden (das macht Hyperterminal so). Verwendet man ein
Terminalprogramm, das die ESCAPE-Taste für andere Zwecke verwendet, muss man
die Software des 2313 ändern und irgend ein anderes Kontrollzeichen auswerten.
(=> Screenshot: Der 2313 im Verstellmodus)
Hat man sich vertippt, reagiert die Eingabezeile für Morsezeichen auf die Rück-
oder Backspace-Taste, falls diese das Kontrollzeichen 8 aussendet. Die
Cursortasten und andere ANSI- oder VT100-Zeichen werden in dieser Version nicht
unterstützt.
Hat man es im Terminalprogramm lieber buntig, muss man entsprechende
ANSI-Code-Zeichen zu den Menuetexten im Assemblerprogramm hinzufügen. Aber
Vorsicht dabei: der ATMEL-Assembler hat seit langem einen üblen Bug und
übersetzt bestimmte Mischungen aus Byte-Konstanten und -Texten, die in "
eingeschlossen sind, nicht korrekt. Der Programmzähler kann dabei um ein oder
mehrere Worte vor- oder nachgehen, die Übersetzung richtet ein Chaos bei allen
nachfolgenden Programm-Labels an. Nach dem Ändern von .DB-Menuezeilen sollte
man sich anschließend im Listing davon überzeugen, dass die eingefügten
chk-Prüfwerte adressmäßig übereinstimmen. Sonst kommt es zu weggelassenen oder
verstümmelten Zeichen oder Zeilen.
Viel Erfolg beim Experimentieren!
Wer ein STK200- oder STK500-board sein Eigen nennt, kann auf den Selbstbau des 2313-Experimentierboards
auch verzichten, den Lautsprecher an das Board anschließen und die Software auf dem Board
verwenden. Dazu ist gegenüber der Eigenbau-Schaltung ein AT90S8515 auf dem Board erforderlich,
was einige Umbauten in der Software bedingt. Im Anhang können die
verschiedenen Software-Versionen heruntergeladen werden.
Beim Board STK200 ist der erforderliche Zusatzanbau eine 10-polige, zweireihige Buchse, die an den
Portausgang von Port D angeschlossen wird (ähnlich wie der Lautsprecheranschluss beim
Experimentierboard). Das NF-Ausgangsignal liegt im Gegensatz zum Experimentierboard an Bit 5 des
Ports D an und wird über einen Elko von 10µF und einen Widerstand von ca. 470 Ohm an den
Lautsprecher angeschlossen. Die zweite Leitung vom Lautprecher wird auf GND der 10-poligen
Buchse gelegt. Die Software ist auf den boardeigenen Taktoszillator von 4 MHz eingestellt.
Beim STK500 muss der AT90S8515 bestückt sein. Die Anschlüsse PD0 und PD1 des 10-poligen
Postensteckers von Port D müssen an RXD bzw. TXD der RS232-SPARE-Buchse angeschlossen werden
(über mit dem Board mitgelieferte zweipolige Steckverbinder). Der Lautsprecher wird wie beim
Experimentierboard mit dem Elko und dem Widerstand beschaltet und kommt an Pin PD5 und GND von
Port D des Boards. Die Software ist auf die boardeigene Taktung mit 3,96 MHz eingestellt.
Wer per Studio-Software den Teilerfaktor anders einstellt, muss den Parameter fq in der Software
entsprechend ändern. Allerdings dürfte es bei Taktfrequenzen unterhalb von 1 MHz
zu Problemen kommen, wenn extreme NF-Frequenzen oder Gebegeschwindigkeiten eingestellt werden.
Bei der Software für beide STK Boards ist noch ein zusätzlicher Menuepunkt ansteuerbar,
weil der 8515 über mehr Programmspeicher verfügt (Option x).
Beim Betrieb mit einem Board ist ferner zu berücksichtigen, dass
- die RS-232-Anschlüsse nicht über eine Beschaltung der Signale RTS und CTS
verfügen, das Hardware-Protokoll steht daher nicht zur Verfügung und muss im Terminalprogramm
abgeschaltet werden (keine Ausgabe ganzer Textdateien in einem Rutsch möglich!),
- in den RS232-Buchsen der Boards RD und TD bereits gekreuzt sind und 1 zu 1 verkabelt werden
müssen (ein Nullmodem-Kabel funktioniert hierfür nicht),
- beim STK500 beide RS232-Schnittstellen benötigt werden (zum Programmieren mittels
STUDIO und zur Kommunikation mit einem Terminalprogramm) und dass beide unterschiedliche
Baudraten verwenden (115 k bzw. 9k6).
Mit diesen Links kann die Assemblersoftware für die verschiedenen Versionen heruntergeladen
werden:
©2002 by Gerhard Schmidt, DG4FAC
Webseite mit den Beiträgen:
http://www.avr-asm-tutorial.net/cq-dl/index.html
Benutzung, Kopie und Weiterverbreitung der Seiten zulässig, solange die Copyright-Angaben im Text bleiben.