====== MC68HC12 ====== ===== Card12.DG128A (MC68HC12) ===== Ich habe mir diesen MC von "www.elektronikladen.de/mct" mit dem //Motorola MC68HC912DG128A// geholt. Einstellungen und Software für den //Mikrokontroller MC68HC912DG128A// auf der Karte "//Card12.DG128A//" von "http://www.elektronikladen.de/mct". Wenn man soein Ding das erste mal in Händen hält, stellen sich einige Fragen die vom beigelegten Dokumentationsmaterial nicht beantwortet werden. Die Fragen, die sich mir stellten und die ich nach meinem ersten Kontakt mit dieser Karte nicht unter zur Hilfenahme der beigelegten Dokumentation beantworten konnte, will ich hiermit dokumentieren (und noch etwas mehr...). Ich habe den DG128 nicht wegen der größeren Speicherausstattung gewählt, sondern weil er noch eine zusätzliche IIC-Schnittstelle besitzt. Die Karte ist im Format 87mm x 54mm und wird ausschließlich mit 5V betrieben! Zum Programmieren darf KEINE separate 12V-Versorgung am MC anliegen, denn diese würde den MC zerstören. Auf der Unterseite der Platine ist (im Normalfall) für diese in der entsprechenden Leiterbahn eine Unterbrechung eingearbeitet, so das //eigentlich// nix passieren sollte. Diese Beispiele wurden alle mit FreeBSD durchgeführt. ==== COM-Port ==== Verbindungsparameter der //TwinPEEKs RS232-Kommunikationsschnittstelle// (serielle Schnittstelle auf dem MC-Board): 19200 Bps 8N1 kein Hardwarehandshake kein Softwarehandshake kein Terminal-Protokoll (ANSI) Verbindung mit //cu// aufbauen (geht nur als "root"): # cu -s 19200 -l /dev/cuaa0 # vi /etc/remote cuaa0d|cua0d:dv=/dev/cuaa0:br#19200:pa=none: Verbindung mit //tip// aufbauen (geht nur als "root"): # tip cuaa0d Konfigurationsdatei bearbeiten (als "normaler" Benutzer): # vi ~/.minirc.card12 pu pname9 YUNYNascii pu pname10 YDNYNascii pu pprog9 /usr/bin/ascii-xfr -dsv pu pprog10 /usr/bin/ascii-xfr -drv pu baudrate 19200 pu bits 8 pu parity N pu stopbits 1 pu minit pu updir Card12 pu downdir card12 pu backspace BS pu rtscts No pu xonxoff No pu fselw Yes pu askdndir Yes serielle Verbindung zwischen dem PC und dem MC starten (als "normaler" Benutzer): # minicom /dev/cuaa0 card12 oder so (als "normaler" Benutzer): # minicom -t ansi /dev/cuaa0 card12 Bedienung von //minicom//: # CTRL-A T: # "A - Terminal emulation : ANSI" # "D - Newline delay (ms) : 200" # Anschließend MC einschalten oder den RESET-Knopf drücken! # TwinPEEKs V1.6a for Card12.DG128A # # Help: H (listet alle Monitorbefehle auf) Um eine Datei (z.B.: **"//blink.s19//"**) in den Speicher des MC zu laden, muss im Monitor ein **"l"** eingegeben werden, jetzt ist der MC empfangsbereit. Jetzt sendet man mit dem Terminalprogramm die gewünschte Datei an das Monitorprogramm im MC. Damit das funktioniert, muss das Terminalprogramm folgendermaßen bedient werden: - "Wait for Handshake" bei "File Transfer" - "Quittungszeichen/Sequence" ist **"*"** oder **"#42"** ==== beiliegende Beispiele ==== Ein Beispielprogramm wird schon fertig mitgeliefert, leider ist das für den //HC12D60// geschrieben worden und der hat unter anderem seinen RAM-Bereich auf "0x0200 - 0x05FF" liegen und der HC12DG128 hat seinen frei verwendbaren RAM-Bereich auf "0x2000 - 0x3DFF" liegen, so das man das Programm für den ersten Test umschreiben (blink.s) und neu übersetzen (blink.s19) muss. Program Memory (ORG): 0x8000 (erste Adr. auf der das Program gspeichert ist) Data Memory : 0x2000 (erste RAM-Adresse) Sack Pointer (lds): 0x4000 (letzte RAM-Adresse + 1) Ein funktionierender Quelcode, bei dem der Stack Pointer von 0x0600 auf 0x4000# geändert wurde könnte wie folgt aussehen. === Inhalt der Datei "blink.s" === CPU 68HC12 PADDING OFF ORG $8000 main lds $4000 clr $0016 bset $002b,$80 blink1 ldaa $0029 eora #$80 staa $0029 bsr delay bra blink1 delay psha pshx ldx #$1000 _loop1 clra _loop0 dbne a,_loop0 dbne x,_loop1 pulx pula rts END main === MEMORY MAP des Motorola MC68HC912DG128A (//Card12.DG128A//) === Register block: 0x0000 - 0x03FF EEPROM : 0x0800 - 0x0FFF (02 kB) RAM : 0x2000 - 0x3FFF (08 kB) (Monitor belegt 0x3E00 - 0x3FFF) (freier RAM 0x2000 - 0x3DFF) Flash ROM : 0x4000 - 0x7FFF (16 kB un-paged) Flash ROM : 0x8000 - 0xBFFF (16 kB paged, page0...7 also 128kB) Flash ROM : 0xC000 - 0xFFFF (16 kB un-paged) (Bootblock des Monitorprogramms belegt 0xE000 - 0xFFFF) (freier Flash-ROM-Bereich 0xC000 - 0xDFFF) ==== Daten in den MC laden ==== Nach dem übersetzen in das //S19//-Format sieht das Programm wie folgt aus: Inhalt der Datei "blink.s19": S0030000FC S1138000CF40007900164C2B80962988805A290786 S11380100220F63634CE1000870430FD0435F930E2 S1058020323DEB S90380007C Im einfachsten Fall kann man diese Zeilen folgender maßen in den MC bekommen. Man tipt im Terminalfenster, in dem das Monitorprogramm läuft, **"l"** ein und fügt mit der Maus (copy + past / makieren und einfühgen) die Zeilen ein, eine nach der anderen. Wichtig ist nur, das nach jeder Zeile ein Zeilenumbruch mit eingegeben wird! Den kann man in X11 mit der Maus mit übergeben, sonst muss man einmal ENTER drücken bevor man die nächste Zeile kopieren kann. Nach dem ENTER (Zeilenumbruch) muss unbedingt auf das Quittungszeichen (ein **"*"**) gewartet werden (ein paar Millisekunden) bevor die nächste Zeile kopiert werden kann. Aus diesem (Timing-) Grund kann man nicht immer den ganzen Inhalt der S19-Datei, sozusagen mit einem Maus-Klick in den MC pumpen. Verwendet man //tip// oder //cu//, schaltet man mit **"l"** den MC auf "Empfang" und sagt //tip/cu// mit der Zeichenfolge "~>" (oder "~~>") das eine Datei eingespielt werden soll. Jetzt wird man aufgefordert den Dateinamen einzugeben, an dieser Stelle gibt man den Namen der //S19//-Datei an und drückt ENTER. Die //S19//-Datei sollte sich im aktuellen Pfad (meistens dem HOME-Verzeichnis) befinden. Um das Programm dann zu starten genügt die Eingabe //g 8000//, das bedeutet das Monitorprogramm soll an Adresse //0x8000// springen und das dort liegende Programm starten. Soll das Programm gleich nach dem einschalten automatisch gestartet werden, müssen zwei Pins auf dem Board verbunden werden. Das sind die Portleitungen //PH6// und //PH7//, auf dem Board sind das die Pins //7// und //8// des Steckverbinders //ST5//. Zu finden oben links auf dem Board. Besteht diese Verbindung, so wird nach dem einschalten immer an die Adresse //0x8000// gesprungen und das Monitorprogramm nicht weiter abgearbeitet! ==== Programmiersprachen ==== === Assembler === Zum Assemblerprogrammieren ist "asl" sehr gut geeignet: * Web : [[http://john.ccac.rwth-aachen.de:8000/as/]] * FreeBSD-Ports-Tree: ///usr/ports/devel/asl// Den Quellcode in ein Binärformat übersetzten: asl blink.s (es wird die Datei "blink.p" erzeugt) Die Binärausgabe in das gewünschte //S19//-Format übersetzen: # p2hex -r \$-\$ -F Moto -M 1 +5 blink.p blink.s19 jetzt wird die Datei "blink.s19" erzeugt. === C/C++ === Zum C/C++-programmieren kann man "m6811-elf-gcc" verwenden, das ist nicht das neueste aber speziell für FreeBSD angepasst und stark optimiert, so das es kleineren und schnelleren Code erzeugt: * Web : [[http://www.gnu-m68hc11.org/]] * Hilfe: [[http://www.ee.nmt.edu/~dbaird/gcc-hc1x.html]] * Ports: ///usr/ports/devel/m6811-gcc// # m6811-elf-gcc -m68hc12 -c -o blink.o blink.c # m6811-elf-gcc -m68hc12 -o blink.elf blink.o # m6811-elf-objcopy -O srec blink.elf blink.s19 oder so: # m6811-elf-gcc -m68hc12 -nostartfiles -Wl,--oformat=srec -o blink.s19 blink.c jetzt wird die Datei "blink.s19" erzeugt. ==== MC68HC12-Simulator ==== === Simulator in Java === Ein MC68HC12-Simulator in Java programmiert und sehr nett aufgemacht: * [[http://www.almy.us/68hc12.html]] # export JAVA_HOME=/usr/local/jdk1.4.1 # export CLASSPATH=${JAVA_HOME}/lib/ # export PATH=${PATH}:${JAVA_HOME}/bin/:${JAVA_HOME}/jre/bin/ JRE 1.1.7: # java -jar simhc12.jar ab JRE 1.1.8 (dann ist er schneller!): # java -server -jar simhc12.jar == MEMORY MAP im evaluation board mode (MC68HC12A4EVB) == # Register block: 0x0000 - 0x01FF # RAM : 0x0800 - 0x0BFF ( 01 kB) # EEPROM : 0x1000 - 0x1FFF ( 02 kB) # External RAM : 0x4000 - 0x7FFF ( 16 kB) # (gespiegelt in den Bereich 0x0000-0x3FFF # wo gerade ein Loch ist) # External ROM : 0x8000 - 0xFFFF ( 16 kB) # (Monitorsimulator und Vectoren) == MEMORY MAP im Single Chip Mode (MC68HC912B32) == dann sind keine Externen Speicher verfügbar # Register block: 0x0000 - 0x01FF # RAM : 0x0800 - 0x0BFF ( 01 kByte) # EEPROM : 0x0D00 - 0x0FFF (768 Byte) # Flash ROM : 0x8000 - 0xFFFF ( 16 kByte)