Pfad: Home => cq-dl-Beiträge => Teil 4
STK200

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).

Aufgabe: Demonstration der Leistungsfähigkeit von Hard- und Software

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.

Funktionen der Schaltung

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.

Aufbau der Hardware

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.

Aufbau der Software

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!

Einstellmenue über Terminalprogramm

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!

Betrieb der Software auf einem Board

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

Anhang: Software zum Download

Mit diesen Links kann die Assemblersoftware für die verschiedenen Versionen heruntergeladen werden:
VersionHardwareChipTaktHTML-Versionasm-Version
0.1 ExperimentierboardAT90S231310 MHz Cw01.html Cw01.asm
STK200-boardAT90S85154 MHz Cw01_200.html Cw01_200.asm
STK500-board3,96 MHz Cw01_500.html Cw01_500.asm


©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.