Inhaltsverzeichnis
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:
- 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:
- 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:
# 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)
