Nachdem sich der erste Teil dieser Serie mehr dem Handwerklichen (sprich Hardware) gewidmet hat, geht es nun ans KĂŒnstlerische: die Software. Das komplette Entwicklungssystem fĂŒr die komfortable Programmentwicklung befindet sich auf einer PD-Disk, die Sie im Rahmen der ST-Computer PD, oder zusammen mit dem Komplett-Bausatz (Adresse am SchluĂ dieses Artikels) bestellen können. NatĂŒrlich können Ihnen diese paar Seiten nicht alle Kenntnisse ĂŒber die Programmierung des Mikro-Controllers vermitteln. Aber in jedem Fall werden sie Ihnen einen guten Ăberblick bieten, und einige interessante Anregungen sind selbstverstĂ€ndlich auch dabei.
In der Hardware wurde der Mikro-Controller 80C31 verwendet. Er ist, wie schon im ersten Teil angedeutet, vollstĂ€ndig softwarekompatibel mit dem Vater der 80x1x-Familie, dem 8031. Schon zum Zeitpunkt der Entwicklung des 8031 (im Jahre 1980) war klar, daĂ weitere Familienmitglieder folgen wĂŒrden. So zum Beispiel der in Europa weit verbreitete Mikro-Controller 80515 von Siemens: gegenĂŒber dem 8031 besitzt er unter anderem 8 schnelle 8-Bit A/D-Wandler, mehr RAM, mehr Ports, mehr Timer etc. Trotzdem können alle diese zusĂ€tzlichen Funktionen mit jedem Standard-8031-Assembler genutzt werden (insbesondere auch mit dem MIDI8031 -Entwicklungssystem).
Der 8031 selbst weist die folgenden Leistungsmerkmale auf:
- 128 Bytes internes RAM - 64KB ROM oder EPROM adressierbar
- 64KB RAM adressierbar
- serielle Schnittstelle
- 16 bidirektionale Portpins
- 2 16-Bit-Timer/ZĂ€hler
- 5 verschiedene Interrupts
AdreĂbereiche
Im Gegensatz zu anderen Prozessoren, sind beim 8031 RAM und ROM/EPROM getrennt. Dadurch vergröĂert sich der gesamte AdreĂbereich auf 128 KB. Leider kann er aber normalerweise nur Programmbefehle im ROM/EPROM-Bereich ausfĂŒhren. Um auch Programme in der Entwicklungsphase im RAM der MIDI8031-Hardware ablaufen lassen zu können, enthĂ€lt MIDI8031 ein extra Gatter. Es sorgt dafĂŒr, daĂ bei bei allen Adressen ĂŒber $8000 der Zugriff immer im RAM erfolgt! Auf dem Chip selbst befinden sich ebenfalls 256 adressierbare Bytes, wovon die unteren 128 das interne RAM darstellen. Die internen Adressen 128 bis 255 werden als âSpecial-Function-Registers â (SF-Re-gister) bezeichnet. Wie Sie Bild 1 entnehmen können, sind auf dem 8031 nur wenige der SF-Register belegt. Die freien PlĂ€tze sind den Verwandten des 8031 Vorbehalten. Wahrscheinlich ahnen Sie es nun schon: Bei verwandten Mikro-Controller-Typen genĂŒgt es, die zusĂ€tzlichen SF-Register im Programm-Listing zu benennen. Jedes SF-Register hat einen Namen (zum Beispiel âPIâ)- Um ihre Adressen mĂŒssen Sie sich daher beim Programmieren nicht im geringsten kĂŒmmern: das macht der Assembler. Auf jedes SF-Register kann also direkt per Namen zugegriffen werden.
Bild 1: Im 8031 gibt es drei adressierbare Bereiche.
Obwohl es in Bild 1 den Anschein hat, als ob alle SF-Register eintrĂ€chtig nebeneinander lĂ€gen, dĂŒrfen Sie sich davon nicht tĂ€uschen lassen: Manche lassen sich lesen und beschreiben (wie etwa âBâ), andere lassen sich nur lesen oder beschreiben, bei wieder anderen können Zugriffe darauf zu âNebeneffektenâ fĂŒhren, einige dĂŒrfen ĂŒberhaupt nicht verwendet werden. Die detaillierte Beschreibung der einzelnen SF-Register wĂŒrde den Rahmen dieser Serie sprengen. Beachten Sie dazu den Buchverweis am Ende diesen Teils der Serie.
Das interne RAM des 8031 ist mit 128 Bytes so groĂ, daĂ bei einfachen AnwendungsfĂ€llen sogar auf das externe RAM verzichtet werden kann (sowieso wird das externe RAM im groĂen und ganzen etwas âstiefmĂŒtterlichâ behandelt). In Bild 1 fallen im internen RAM die 4 RegisterbĂ€nke R0-R7 auf: Die Register R0-R7 werden normalerweise zum ZĂ€hlen, Indizieren, Rechnen verwendet. Mit einem einzigen Befehl kann bei Bedarf schnell zwischen den 4 BĂ€nken hin- und hergeschaltet werden. Ein Anwendungsfall wĂ€ren zum Beispiel 4 verschiedene, gleichzeitige Interrupts, von denen jeder seine eigene Bank verwendet.
Der zweite Block im internen RAM in Bild 1 ist als âBit-adressierbares RAMâ bezeichnet: Da Mikro-Controller auch speziell fĂŒr Steuerungszwecke entwickelt worden sind, treten oft binĂ€re ZustĂ€nde auf (etwa: 1 = Motor an, 0 = Motor aus). Also lassen sich 8 binĂ€re Variablen in ein Byte packen. Insgesamt kann der 8031 256 verschieden Bits adressieren. Davon befinden sich 128 im âBit-adressierbaren RAMâ, die restlichen sind auf die SF-Register verteilt. Es kann nur auf einige der SF-Register bitweise zugegriffen werden. Diese sind in Bild 2 mit einem Stern (*) markiert. Bit-Adressen werden im 8031-Sourcecode durch Punkte gekennzeichnet: so bezeichnet etwa âACC.7â das 7. Bit von ACC, â$1F.0â greift auf die niedrigste mögliche Bit-Adresse im RAM zu.
Das restliche interne RAM hat keine besonderen Eigenschaften. Bleibt nur noch, darauf hinzuweisen, daĂ sich beim 8031 der Stack ebenfalls im internen RAM befindet. Auf dem Stack werden hauptsĂ€chlich RĂŒcksprungadressen von Unterprogrammen und Interrupts gespeichert. Wenn also in einem Programm der Stack verwendet wird, muĂ fĂŒr ihn ebenfalls genĂŒgend internes RAM reserviert bleiben.
Die Befehle
Insgesamt kennen die Mikro-Controller der 80x1x-Familie genau 255 Befehle [einer ($A5) ist nicht definiert]. Die meisten Befehle werden von einem mit 12MHz getaktetem Mikro-Controller in nur 1 Mikrosekunde abgearbeitet, fĂŒr eine 8*8-Bit-Multiplikation oder eine 16/8-Bit-Divison benötigt er nur 4 Mikrosekunden. FĂŒr fast alle arithmetischen Berechnungen wird, wie auf anderen Prozessoren auch, ein Akkumulatorregister (Akku) verwendet (âCPL Aâ). Der Akku hat aber auch eine SF-Adresse! Das heiĂt, auf dieses Register kann auf 2 Arten zugegriffen werden! Ein Ă€hnlicher Fall liegt beim Carry-Bit vor: Das Carry-Bit wird gesetzt, wenn zum Beispiel bei Byte-Additionen ein Ăbertrag am höchsten Bit entsteht. Auf das Carry-Bit kann als Bit-Adresse PSW.7 (z. Bsp âCLR PSW.7â) und ĂŒber Assembler-Befehle (wie z.B. âCLR Câ zugegriffen werden. Der Unterschied besteht lediglich darin, daĂ die erste Version ein Byte mehr Code benötigt.
Im groĂen und ganzen kann man die Assembler-Befehle des 8031 in 4 Gruppen einteilen:
-
Befehle zur DatenĂŒbertragung: Etwas gewöhnungsbedĂŒrftig ist die Syntax des âMOVâ-Befehls: MOV [Ziel],[Quelle] (die Schreibweise beim 68000-Assembler ist genau umgekehrt). Also âMOV A,#100â wĂŒrde den Wert 100 in den Akku laden. Alle âMOVâ-Befehle beziehen sich auf das interne RAM. Sollen Daten aus dem externen RAM oder vom ROM/EPROM angesprochen werden, gibt es dazu die Befehle âMOVXâ (externes RAM) und âMOVCâ (ROM/ EPROM). Meistens wird dabei das SF-Register âDPTRâ mit benötigt, das dann eine 16-Bit-Basisadresse enthĂ€lt.
-
arithmetische Befehle: Addition, Subtraktion etc., wie sie auf jedem Prozessor vorhanden sind. Der 8031 unterstĂŒtzt zum Beispiel auch BCD-Berechnungen (das sind Berechnungen im Dezimalsystem).
-
logische und boolsche Befehle: Logische Befehle sind beispielsweise Oder-VerknĂŒpfungen oder Bit-Rotationen. Allerdings gibt es eine ganze Reihe von Befehlen, die nur jeweils 2 Bits miteinander verknĂŒpfen, was fĂŒr die oben erwĂ€hnten SteuerungsaufgĂ€ben von groĂem Vorteil sein kann.
-
Steuerbefehle: Der 8031 kennt eine Reihe ziemlich effektiver bedingter S prung-befehle. Schleifen lassen sich Ă€hnlich einfach programmieren wie auf dem 68000: Der SchleifenzĂ€hler wird vom Sprungbefehl gleich mitverwaltet. Als Besonderheit kann der 8031 auch auf Bit-Bedingungen hin springen, beispielsweise einer gedrĂŒckten Taste an einem Portpin.
Bild 2: Der 8031 verfĂŒgt ĂŒber eine Reihe von Spezialregistern.
Bild 3: Alle Mnemonics der 80xlx-Familie. Die kleingeschriebenen Teile (etwa m8, all, d) kennzeichnen die Adressierungsart.
Die Adressierungsarten im einzelnen (aus Bild 3): âml6â ist eine Wort-Konstante, âm8â eine Byte-Konstante, âdâ eine direkte Byte-Adresse (fĂŒr interne Adressierung), âbâ ist eine der 256 Bit-Adressen, ist das Kennzeichen fĂŒr indirekte Adessierung. SprĂŒnge können ĂŒber Byte-Distanz âarâ in einem 2-KB Bereich âal 1' oder auf eine Wort-Adresse âal6â erfolgen.
Da die eigentliche DomĂ€ne der Mikro-Controller vor allem der Einsatz bei Steuerungsaufgaben ist, soll diese kurze ErlĂ€uterung des 8031-Befehlssatzes genĂŒgen, da bei solchen Anwendungen andere Punkte mindestens ebenso wichtig sind. Zusammenfassend kann man sagen, daĂ der 8031 einen ausgewogenen, schnellen und auch sehr leicht erlernbaren Befehlssatz besitzt. Mit Sicherheit werden Sie bei der Programmierung eigener Anwendungen kaum Schwierigkeiten haben.
Die Ports
Eine weitere wichtige Sache bei Mikro-Controllern sind die Ports. Da jedes zusĂ€tzliche IC bei Mikro-Controller-Schaltungen die Kosten erhöht, wurden die Ports sehr universell und flexibel gehalten. Die Arbeitsrichtung jedes einzelnen Portpins ist frei wĂ€hlbar (bidirektional). Einige Portpins besitzen zudem Mehrfachfunktionen, wie Sie auch dem Schaltplan in der vorigen Ausgabe entnehmen können: So kann etwa das Portpin P3.4 auch zum ZĂ€hlen von Impulsen verwendet werden, indem einige SF-Register mit anderen Werten beschrieben werden. FĂŒr den âeinfachenâ Gebrauch der maximal 14 nutzbaren Portpins von MIDI8031 (Sie können auch alle 16 Portpins nutzen, dann aber können nur Programme im EPROM ablaufen, das RAM muĂ entfernt werden) gilt das stark vereinfachte Modell der Schaltung eines Portpins nach Bild 4. Einfache Ein- und Ausgabeeinheiten können fast direkt an das jeweilige Pin angeschlossen werden. Nach einem Reset des 80C31 ist der Feldeffekt-Transistor (FET) zwischen Pin und Masse gesperrt, am Portpin wird die Spannung Vcc (+5V) gemessen. Wird der Port mit Null beschrieben, leitet der FET, und das Portpin geht fast auf Massepegel. Das Latch hat die Aufgabe, den Port-Zustand zwischenzuspeichern. Der FET kann einen Strom von einigen Milliampere (kurzzeitig bis zu etwa 20 Milliampere) aufnehmen, was zum Beispiel fĂŒr eine LED problemlos reicht. Genauso einfach ist der AnschluĂ eines Schalters oder einer Taste, nur wird diese zwischen Portpin und Masse gelegt. Es ist allerdings wichtig zu wissen, daĂ bei Abfragen des Ports das Latch vorher mit Eins beschrieben werden muĂ, damit der FET sperrt. Bei Bild 4 handelt es sich, wie bereits erwĂ€hnt, um ein sehr einfaches Modell. In Wirklichkeit sind noch etliche weitere FETs in der Schaltung enthalten, zum Beispiel um bei Schreibzugriffen auf den Port steilflankige Signale zu erhalten. Bei AnschluĂ des Schalters sollte daher der Schutzwiderstand von 150Ω eingebaut werden. Er kann entfallen, wenn Sie sich sicher sind, daĂ bei geschlossenem Schalter der Port niemals mit einer Eins beschrieben wird.
In vielen Anwendungsbereichen werden analoge Spannungen benötigt (das könnte zum Beispiel die Fahrspannung Ihrer Modelleisenbahn sein). Zur Erzeugung analoger Spannungen mit einem 80C31 benötigen Sie lediglich ein Portpin. Per Software erzeugt der 80C31 ein sogenanntes pulsweitemoduliertes Signal (PWM). Die Frequenz der Impulse ist dabei konstant, es Ă€ndert sich lediglich ihre Breite. Das PWM-Signal wird durch die beiden WiderstĂ€nde und den Kondensator geglĂ€ttet. Allerdings ist diese sehr einfache Schaltung nicht besonders linear, was sich aber mit etwas Software korrigieren lieĂe. Ein einfacher Analog-Digital-Wandler kann nach dem gleichen, aber genau umgekehrten Schema gebaut werden: Mit einem Multivibrator wird ein rechteckförmiges Signal erzeugt und auf das Portpin geschaltet. Die Software kann nun die Breite der Impulse des Signals messen. Es gibt sogar spezielle (preiswerte) ICs, die mit hoher LinearitĂ€t Spannungen in Frequenzen umsetzen (wie etwa den 74HC4046). Die Genauigkeit der Messung ist verblĂŒffend: bei 200 Messungen pro Sekunde kann der 80C31 das Signal mit bis zu 12 Bits auflösen! In dem am SchluĂ dieses Artikels genannten Buch finden Sie einige gute Schaltungen rund um den 74HC4046.
Bild 4: Die Schaltung der Ports des 80C31 stark vereinfacht
Bild 5: Mit wenigen Bauteilen lassen sich analoge Spannungen erzeugen.
Demo-Listing
Um Ihnen die Programmierung von 80xlx-Mikro-Controllern zu demonstrieren, ist auf dieser Seite ein Listing in 8031 - Assembler abgebildet. Es wurde mit dem Public-Domain- Entwicklungssystem geschrieben. Das Programm gibt im Morsealphabet einen Text aus, der im Listing in den letzten beiden Zeilen steht. Der Text wird optisch ĂŒber die LED auf der Platine von MIDI8031 und akustisch als Tonsignal ĂŒber das Portpin P1.0 ausgegeben. Um auch die einfache Verwendung eines Portpins als Eingang zu zeigen, lĂ€Ăt sich mit einer Taste zwischen P3.3 und GND die Tonhöhe des Morsesignals Ă€ndern. NatĂŒrlich können Sie das Programm erst exakt verstehen, wenn Sie sich etwas in die 8031-Programmierung eingearbeitet haben. Der Sinn des Listings liegt vielmehr darin. Ihnen zu zeigen, daĂ sich auch Mikro-Controller ĂŒbersichtlich und effektiv programmieren lassen. Die vielen nĂŒtzlichen Direktiven des Assemblers erleichtern die Programmentwicklung zusĂ€tzlich. Vom Editor des Entwicklungssystem aus lĂ€Ăt sich das Programm mit nur 2 TastendrĂŒcken automatisch assemblieren und wahlweise starten oder debuggen. Es soll noch einmal ausdrĂŒcklich darauf hingewiesen werden, daĂ es sich beim Debugger des Entwicklungssystems um einen echten Source-Level-Debugger handelt! SelbstverstĂ€ndlich liegt dem Entwicklungssystem auch eine ausfĂŒhrliche Anleitung bei, sowie eine benutzerfreundliche Shell, Disassembler, Hardware-Testprogramme, etliche Demos und noch vieles mehr.
Ein 8031-Sprachsynthesizer
Als âAppetithappen" soll eines der Demoprogramme kurz vorgestellt werden: der Sprachsynthesizer âPHONEMâ. Durch ein kompliziertes mathematisches Verfahren kann man aus digitalisierten Sprachsignalen einfache âGrundbausteineâ menschlicher Sprache isolieren. Diese Grundbausteine lassen sich bei nur geringem Speicherverbrauch in ein EPROM brennen. In einem 32KB-EPROM haben dabei problemlos Sprachdaten fĂŒr mehrere Minuten Platz. Jeder normale 8031 ist nun schnell genug, das sehr gut verstĂ€ndliche Sprachsignal in Echtzeit wieder zu synthetisieren! Das Sprachsignal kann als PWM-Signal an einem Portpin abgenommen werden (zum Beispiel mit der Schaltung nach Bild 5). Die Anwendungsmöglichkeiten dieser fast reinen Software-Lösung sind enorm: Informationssysteme, Alarmanlagen, sprechende MeĂgerĂ€te... AuĂerdem Sourcecode von âPHONEMâ fĂŒr die MIDI8031-Hardware befinden sich auf der Entwicklungssystem-Disk die umfangreiche Software zur Sprachanalyse mit einer speziellen Ankopplung an MIDI8031 sowie diverse Demodateien zur Sprachsynthese. Durch eine Spezialschaltung, die im Sourcecode von âPHONEMâ beschrieben ist, lĂ€Ăt sich ein Lautsprecher direkt in den Digital-Analog-Wandler mit einbauen, so daĂ nicht einmal mehr ein zusĂ€tzlicher VerstĂ€rker fĂŒr das Sprachsignal notwendig wird!
Vorschau
Im nĂ€chsten und letzten Teil des MIDI8031-Mikro-Controller-Projekts werden Sie eine Schaltung finden, mit der jedes Portpin bis zu 20 Ampere schalten kann: den MIDI8031-Powerport. Um die Programmierung der 8031-Interrupts zu demonstrieren, wird MIDI8031 ĂŒber den MIDI8031 -Powerport gleichzeitig zwei voneinander unabhĂ€ngige Schrittmotoren steuern. MIDI8031 wird dabei die Befehle ausfĂŒhren, die es von einem GFA-BASIC-Programm erhĂ€lt.
Service
Wie auch schon im letzten Teil erwĂ€hnt: Die MIDI8031-Hardware gibt es als Komplett-Bausatz, inklusive gebranntem EPROM und Entwicklungssystem-Disk. Sie können ihn fĂŒr DM 85.-(Verrechnungsscheck), oder DM 89,- (Nachnahme) unter der Adresse des Autors bestellen.
Besteller des Bausatzes erwerben gleichzeitig das Recht, fĂŒr MIDI8031 geeignete EPROMs zum Selbstkostenpreis brennen zu lassen! Wie das geht, steht in der Anleitung zum Entwicklungssystem.
Literaturempfehlung:
- Das Mikro-Controller-Kochbuch/Andreas Roth; IWT-Verlag 1989, Vaterstetten; ISBN 3-88322-225-9; etwa 58,- DM
; ***********************************************
; * MIDI8051 - Mikrocontroller Entwicklungsboard
; * fuer ATARI ST/STE
; * (c)1992 by MAXON-Computer
; * Autor: JĂŒrgen Piscol
; * MORSE: Diese kleine Demo sendet einen Text im
; * Morsealphabet. Das Signal wird auf der
; * eingebauten LED (optisch) und und am
; * Port P1.0 als Tonsignal ausgegeben.
; * Mit einer Taste zwischen P3.3 und GND
; * laesst sich die Morsetonhoehe aendern.
; *
; ***********************************************
.registers reg51.inc; 8031-Register-Defs.
; * Konstanten: Morsetempo und Tonhoehe:
tonh_o = 200 ; Die orig. Werte
speed_o = 200
; * Variablen (im internen RAM)
.var_org $30
tonh: .ds.b 1 ; 1 Byte fuer tonh
speed: .ds.b 1 ; 1 Byte fuer speed
stack: ; darueber ist Stack
.text_org $8000 ; RAM Entwicklungsboards
; * Hier geht's los:
go_0:
mov SP,#stack ; Stack ueber Vars,
mov tonh,#tonh_o ; Variablen init.
mov speed,#speed_o ; Originalpeed
go:
mov DPTR,#text ; Auf den Text zeigen
again:
movx A,@DPTR ; Zeich. ODPTR im XRAM
inc DPTR ; DPTR auf naechstes Byte
jz go ; '0': Wieder von vorne
jb P3.3,ton_ok ; Schalter am Port gedr.?
inc speed ; Ton hoeher, damit aber
dec tonh ; wg. Tempo konst.: Speed dekr.
mov A,#'e' ; ein 'e' ausgeben (.)
mov DPTR,#text ; und wieder von vorne...
ton_ok:
cjne A,#' ',was
mov R3,#16 ; Space: Laengere Pause
acall pause
sjmp again ; und von vorne
was: ; Es gibt was zu piepsen
acall holen ; Daten zum Buchst. holen
zeich:
setb P3.5 ; LED an
rlc A ; A shift, Bit7 in Carry
jnc kurz
acall on ; Lang: lang piepsen
acall on
kurz:
acall on ; Kurz: kurz piepsen
clr P3.5 ; LED aus
setb P1.0 ; Lautsp. aus (sparen!)
mov R3,#1
acall pause ; kurz warten
djnz R0,zeich ; Zeichen ausgeben
mov R3,#4 ; am Ende:
acall pause ; laengere Pause
sjmp again ; Bis Textende...
; * pause: Wartet in R2 angegebene Pausen
pause:
mov R2,speed
?p1:
mov R1,tonh ; Timing wie 'on:'
djnz R1,1 ; Inner Warteschleife
djnz R2,?p1
djnz R3,pause ; Aeussere Warteschl.
ret
; * on: Sound piepen, kurz warten
on:
mov R2,speed ; 'speed' mal
?o1: ; '?': Verstecktes Label
cpl P1.0 ; Lautsprecher AN/AUS
mov R1,tonh ; tonhoehe
djnz R1,1 ; Inner Warteschleife
djnz R2,?o1 ; Aeussere Warteschl.
ret
; * Holen A: Lang/Kurz's, R0: Anzahl Bits
holen:
add A,#-'a' ; A=A-'a'
rl A ; A=2*A
mov R0,A ; A merken
add A,#alphabet-?hl+1 ; Offs, zur Tab.
move A,@A+PC ; Anz. Bits holen
?h1:
xch A,R0 ; A/R0 vertausch,
add A,#alphabet-?h2 ; R0: Anzahl Bits
move A,@A+PC ; A: Muster
?h2:
ret
alphabet:
; * Aufb.: 1.) 1/0: lang/kurz, 2.) Anz. Bits
.dc.b %01000000,2 ; 'a' .-
.dc.b %10000000,4 ; 'b' -...
.dc.b %10100000,4 ; 'c' -.-.
.dc.b %10000000,3 ; âd' -..
.dc.b %00000000,1 ; 'e' .
.dc.b %00100000,4 ; 'f' ..-.
.dc.b %11000000,3 ; 'g' --.
.dc.b %00000000,4 ; 'h' ....
.dc.b %00000000,3 ; 'i ..
.dc.b %01110000,4 ; 'j' .---
.dc.b %10100000,3 ; 'k' -.-
.dc.b %01000000,4 ; 'l' .-..
.dc.b %11000000,2 ; 'm' --
.dc.b %10000000,2 ; 'n' -.
.dc.b %11100000,3 ; âo' ---
.dc.b %01100000,4 ; 'p' .--.
.dc.b %11010000,4 ; 'q' --.-
.dc.b %10100000,3 ; 'r' -.-
.dc.b %00000000,3 ; 's' ...
.dc.b %10000000,1 ; 't' -
.dc.b %00100000,3 ; 'u' ..-
.dc.b %00100000,4 ; 'v' ...-
.dc.b %01100000,3 ; 'w' .--
.dc.b %10010000,4 ; 'x' -..-
.dc.b %10110000,4 ; ây' -.--
.dc.b %11000000,4 ; 'z' --..
; * Der Morsetext (nur Kleinbuchstaben und
;* 'Space', keine Zahlen!)
text:
.dc.b "hallo user hier morst dein "
.dc.b "mikrocontroller ",0