Sie sind auf Seite 1von 49

Kommunikation zwischen PIC Controller und PC

uber UART
Jonas Dorn & Thomas Fuchs
10. Juni 2008
Jonas Dorn Thomas Fuchs
30567021 30551592
Inhaltsverzeichnis
1 Einf uhrung 3
2 UART 3
2.1 Funktion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2 Protokoll . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3 Hardware 5
3.1 Anforderungen . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3.2 Entwicklung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3.3 Ergebnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
4 Software 7
4.1 Mikrocontroller . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.1.1 Besonderheiten . . . . . . . . . . . . . . . . . . . . . . 8
4.1.2 Programmablauf . . . . . . . . . . . . . . . . . . . . . 8
4.1.3 Paritatsberechnung . . . . . . . . . . . . . . . . . . . . 8
4.2 PC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.2.1 Hauptprogramm . . . . . . . . . . . . . . . . . . . . . 9
4.2.2 Interrupt-Service-Routine . . . . . . . . . . . . . . . . 10
4.2.3

Uberpr ufung des Frame-Inhalts . . . . . . . . . . . . . 10
A Bilder 11
B Programmablaufplane 13
B.1 Programmablaufplane - Controller . . . . . . . . . . . . . . . 13
B.2 Programmablaufplane - PC . . . . . . . . . . . . . . . . . . . 19
C Programme 23
C.1 Programm - Controller . . . . . . . . . . . . . . . . . . . . . . 23
C.2 Programm - PC . . . . . . . . . . . . . . . . . . . . . . . . . . 38
D CD 49
2.1 2 UART
1 Einf uhrung
In diesem Projekt geht es darum die Kommunikation zwischen einem Mi-
krocontroller (PIC18F2685) und einem PC mit einer seriellen Leitung dar-
zustellen. Dazu wird der Universal Asynchronous Receiver/Transmitter
(UART) genutzt, also eine asynchrone

Ubertragung verwendet um die Hard-
ware ohne Taktleitung entwickeln zu konnen. Um dem System einen Nutzen
zu geben wird auf einem bereits vorhandenen Modul aufgebaut, dass eine
mit einem Thermoelement (und Kaltstellenkompensation) gemessene Tem-
peratur auf eine CAN-Bus Schnittstelle sendet. Es wird eine neue Platine
entwickelt, die als Adaptionsschnittstelle zwischen CAN-Bus und RS232 ge-
schaltet wird. Die Platine wird so variabel entwickelt, dass man die Softwa-
re beliebig weiterentwickeln kann und auch bidirektionale Kommunikation
mit Modieinstellungen behandeln konnte. Das w urde hier allerdings zu weit
f uhren, daher beschranken wir uns auf die Funktion des CAN-logging.
Der Mikrocontroller wird die Daten vom CAN-Bus auslesen und an den
PC senden. Da der Controller ein PIC von Microchip sein wird, wird f ur
dessen Programmierung die Entwicklungsumgebung MPLAB genutzt. Als
PC wird ein Laptop mit 266MHz unter DOS verwendet. Programmiert wird
die Software mit dem NortonCommander 4.0. Das mag vielleicht etwas ko-
misch klingen, weil hier ein System von 1993(NortonCommander) und eines
von 2008(PIC) aufeinandertreen, allerdings ist die Verwendung des Norton-
Commanders hier bedingt durch die angekn upfte Vorlesung und erwies sich
auch als praktische Bedienoberache direkt unter DOS. Der PC wird direkt
unter DOS gestartet, da das MS-DOS Fenster von Windows nur emuliert
ist und Interrups sperrt. Diese sind bei der Programmierung in Assemb-
ler mit dem Tasm allerdings wichtig um die Daten von der Schnittstelle zu
empfangen.
2 UART
Ausgesprochen bedeutet dies Universal Asynchronous Receiver Transmit-
ter. Gemeint ist damit der Chip, der die Daten ubertragung uber die RS232
Schnittstelle ermoglicht. Die ersten UARTs wurden zu Begin der Standardi-
sierung der Datenkommunikation f ur die Kommunikation zwischen PC und
Modem entwickelt. Dabei wurden Bitraten von ca. 100Bit/s erreicht. Der
erste UART wurde von Intel entwickelt und nannte sich UART 8250. Spater
wurde dieser von dem UART 16450 bzw. UART 16550 mit der Einf uhrung
des FIFO-Puers abgelost. Der FIFO-Puer wurde zur Minimierung von

Uberlaufen bei hohen Bitraten entwickelt. Seit 1990 ist der UART kein ein-
zelner Chip mehr, sondern in den Chipsatzen der Mainboards integriert.
Jonas Dorn & Thomas Fuchs 3
2.2 2 UART
Abbildung 1: Timing der Seriellen Daten ubertragung
2.1 Funktion
Dieser Chip baut einen seriellen Datenstrom in einem festgelegten Rahmen
auf. Da es keine zusatzliche Taktleitung gibt, werden die Rahmen durch
Start- und Stoppbits voneinander getrennt. Beim UART hat man zwei Lei-
tungen zur Daten ubertragung und eine Masseleitung. Dabei ist (aus Sicht
beider Kommunikationspartner eine der Leitungen die Sendeleitung (TX)
und die andere die Empfangsleitung (RX). Bei der Kommunikation zwi-
schen zwei Controllern muss daher der RX-Pin des einen an den TX-Pin des
anderen angeschlossen werden. Da die Steckerbelegung genormt ist, benotigt
man hierf ur ein sog. Nullmodemkabel. Bei diesem sind die oben genannten
Leitungen (Pin 2 und 3) gekreuzt. Beim Entwickeln der Hardware ist man
recht frei und konnte diese Leitungen auch auf der Platine gekreuzt anschlie-
en. Es empehlt sich jedoch den Standard einzuhalten. Um die Kommuni-
kation zu ermoglichen, erfolgt die

Ubertragung der Daten in einem Frame.
Dieser ist hauptsachlich durch eine Startbit, die Datenbits und ein Stoppbit
gekennzeichnet. Die genaue Denition des Frames ist in Abb. 1 beispielhaft
dargestellt.
1
1
Quelle: http://de.wikipedia.org/wiki/UART 26.05.2008, 11:15Uhr
Jonas Dorn & Thomas Fuchs 4
3.1 3 HARDWARE
2.2 Protokoll
Die

Ubertragung der Daten mit dem UART erfolgt wie im vorherigen Ab-
schnitt beschrieben Byteweise. Da der Schnittstellenadapter alle auf dem
Bus liegenden CAN-Botschaften mit der maximal moglichen Datenlange
ubertragen konnen soll, muss ein Protokoll verwendet werden mit dem diese
Botschaft Byteweise ubertragen werden kann. Ein solches Protokoll wurde
selbst entwickelt, angelehnt an das der bekannten Midi-Schnittstelle. Daraus
Tabelle 1: Protokoll zur

Ubertragung von CAN Botschaften zu RS232
Start of frame: 1111 1111
ID: 1000 0xxx ID low 11bit standard
1001 xxxx ID high 1 identier
1010 xxxx ID high 2
DLC: 1100 xxxx Data lenght code 0000 . . . 1000
Data: 0010 xxxx Data high 0 - 8 bytes
0001 xxxx Data low
ergibt sich der Frame wie in Tabelle 2 dargestellt.
Tabelle 2: Frameaufbau
. . . Start of frame ID DLC Data (0 - 8bytes) . . .
3 Hardware
In diesem Kapitel wird ausschlielich die Entwicklung der Platine beschrie-
ben. Die Hardware des PCs wird als bekannt angesehen, daher wird nicht
naher darauf eingegangen. Bei dem PC handelt es sich um einen alteren
Toshiba Laptop mit der Modellbezeichnung Tecra 550CDT einer Takt-
frequenz von 266Mhz und 32MB Arbeitsspeicher. Dies scheint f ur heutige
Verhaltnisse niedrig angesetzt, f ur die Funktion der seriellen Schnittstelle ist
das jedoch (nahezu) irrelevant. Im Vergleich dazu lauft der PIC 18F2685 mit
8MHz und Die Taktfrequenz spielt nur f ur die Abarbeitung der Befehle nach
einem Interrupt eine Rolle. Diese muss geschehen, bevor ein neues Zeichen
Dabei hatten wir bei keinem unserer eingesetzten Systeme ein Problem.
3.1 Anforderungen
An die Hardware werden viele Anforderungen gestellt, grotenteils von uns
selbst. Zum einen soll sie nat urlich moglichst klein sein, damit man sie un-
kompliziert transporieren kann. Das ist nicht nur zum Vorf uhren von Vor-
teil, sondern beim spateren Gebrauch von sehr groer Bedeutung. Das Gerat
Jonas Dorn & Thomas Fuchs 5
3.2 3 HARDWARE
konnte auch im KFZ-Bereich eingesetzt werden um die Nachrichten auf dem
gew unschten CAN-Bus mit einem PC zu loggen. Vor allem dann ist kleinster
Platzbedarf und Mobilitat wichtig. Des Weiteren sollen die wichtigsten Stan-
dards eingehalten werden, wie zum Beispiel die Pinbelegung der Schnittstel-
len oder das Implementieren einer sog. In System Programmierschnittstelle.
Damit ist man sehr fexibel und kann auch im eingebauten Zustand neue
Software auf den Controller aufspielen. Zu der Flexibilitat gehort auch die
Einplanung von vier Jumperplatzen, womit man spater einen Modiwechsel
in einer Softwareerweiterung einbauen kann. Auerdem wird von Anfang an
alles so geplant, dass auch bidirektionale Kommunikation moglich sein kann.
In diesem Projekt wird die Platine aber als CAN-logger betrieben, d.h. sie
sendet die Nachrichten vom CAN-Bus an einen PC.
3.2 Entwicklung
Bei der Entwicklung der Platine m ussen zunachst die benotigten Schnitt-
stellen aufgelistet werden. Das sind drei St uck:
RS232
CAN
ISP
Die Groe der Platine ist nicht festgelegt, es wurde allerdings (siehe Kap.
3.1) darauf Wert gelegt, sie moglichst klein zu halten. Den zu verwenden-
den Controller haben wir anhand von Struktur, Leistungsfahigkeit, bereits
intigrierte Schnittstellencontroller und Preis ausgewahlt. Der PIC18F2685
hat sich dabei als bestes Bauteil herauskristalisiert. Er bringt bereits einen
integrierten CAN-Controller, eine EUSART-Schnittstelle und eine Hard-
warestruktur mit Speicherzellen gegen uber einer Akkumulatorzelle (1 Byte
gro) mit sich. Des Weiteren ist er uber das sog. sampling von Microchip
f ur Studenten kostenlos erhaltlich. Anhand der Schnittstellen und des Con-
trollers wird anschlieend die restliche Peripherie gewahlt. F ur die RS232
Kompatibilitat wird ein MAX232 von Maxim IC benotigt, da die Pegel der
UART-Schnittstelle des Controllers von 0V bis 5V gehen. Die RS232 Spe-
zikation ist allerdings -12V bis +12V. Daher muss hier die entsprechende
Pegelwandlung erfolgen. Sehr ahnlich ist das bei dem CAN-Controller. Um
die Signale des CAN-Controllers auf die Pegel des CAN-Bus zu wandeln
wird ein CAN-Transreceiver benotigt, der MCP2551 von Microchip. Zur Si-
gnalausgabe werden f ur jeden Nachrichttyp jeweils eine LED verwendet. Im
Folgenden eine auf das wesentlichen beschrankte Bauteilliste:
PIC 18F2685
MCP 2551
Jonas Dorn & Thomas Fuchs 6
4.0 4 SOFTWARE
MAX 232
Stecker: SubD 9pol. (RS232), 2x5 Wannenstecker (CAN)
rote LED, gr une LED
Kondensatoren zur Pegelwandlung
Zunachst wurde mit Hilfe der Datenblatter und Target3001! der Schaltplan
entwickelt und die Schaltung auf einem Testboard aufgebaut. Nach aus-
giebieger Testphase wird das Layout entwickelt (ebenfalls mit Target3001!)
und die Platine in der eigenen Werkstatt mit einer selbstgebauten

Atzanlage
hergestellt.
3.3 Ergebnis
Die Platine hat die Mae 56mm x 78mm und ist dadurch recht handlich.
Durch den Best uckungsaufdruck kann man sich jederzeit sehr gut orientie-
ren. Die Platine ist in Abb. 2 abgebildet.
Abbildung 2: Fertige Platine
4 Software
Zunachst wurde ein Programablaufplan (PAP) entwickelt, um die Struktur
der jeweiligen Software zu entwerfen. Das sollte vor dem eingentlichen Pro-
grammieren geschehen. Nur so kann ein sauberes strukturiertes Programm
entstehen. Insbesondere bei der Entwicklung der Routine zum

Uberpr ufen
bzw. Senden des Frames war der PAP sehr hilfreich. Zum Entwickeln die-
ser PAPs wurde das Programm PAP-Designer verwendet. Im Gegensatz zu
handschriftlichen PAPs sind

Anderungen wesentlich einfacher einzubauen.
Jonas Dorn & Thomas Fuchs 7
4.1 4 SOFTWARE
Des Weiteren kann man sie anschlieend auch deutlich besser lesen und in
eine Dokumentation, oder wie hier, in einen Bericht einf ugen.
4.1 Mikrocontroller
4.1.1 Besonderheiten
Die Besonderheiten des Mikrocontrollers ergeben sich aus der Hardware.
Ein Mikrocontroller ist, ganz anders als ein PC, ein ganzes System in ei-
nem Chip. Speicher, Prozessor und Peripherie sind alles in einem System.
Dadurch sind hier zu Beginn des Programms spezielle Befehle auszuf uhren,
wie z.B. die Richtung der Ports (Eingabe oder Ausgabe) oder das Aktivieren
von bestimmter Hardware (CAN, UART). Diese werden im Initialisierungs-
teil ausgef uhrt und direkt nach dem Start des Prozessors aufgerufen. Des
Weiteren sind im Kopf des Programms spezielle Kongurationen wie die
Taktquelle oder Reset bei Spannungsverlust zu tatigen.
4.1.2 Programmablauf
Die Programmablaufe wurden mit mehreren Programmablaufplanen entwi-
ckelt. Daf ur wurde jede Funktion bzw. Subroutine in einem eigenen PAP
entworfen. Diese werden dann untereinander, sofern notig, aufgerufen. Die
grobe Struktur sieht vor, dass im zyklischen Teil des Programms die Sta-
tusleds geloscht werden, da man sie nicht erkennen w urde wenn das bereits
im kurzen Interrupt geschehen w urde. Die eigentliche Aufgabe des Systems
wird durch Interrupts gesteuert. Sobald eine Nachricht von Interesse erkannt
wird, lost ein Interrupt aus und diese Nachricht wird direkt vom CAN-Bus
an den PC gesendet. Anschlieend ist der Prozessor wieder bereit, die nachs-
te Nachricht zu empfangen.
4.1.3 Paritatsberechnung
Ein wichtiger Bestandteil des Sendeprozesses ist die Berechnung der Paritat
des zu sendenden Bytes. Diese wird bei der

Ubertragung als 9. Bit genutzt
um Fehler erkennen zu konnen. Die Paritat von 2 Bits wird mit einer XOR-
Verkn upfung erzeugt:
p(a, b) = xor(a, b) (1)
Die Paritat von vier Bits kann in zwei-Bit-Paritaten zerlegt werden, aus (1)
ergibt sich also:
p(a, b, c, d) = xor(p(a, b), p(c, d)) (2)
Analog kann man damit die Paritat eines ganzen Bytes berechnen. Im Pro-
gramm erfolgt das durch entsprechendes Rotieren einer temporaren Spei-
cherzelle die eine Kopie des zu berechnenden Bytes enthalt. Anschlieend
Jonas Dorn & Thomas Fuchs 8
4.2 4 SOFTWARE
werden Kopie und Original mit XOR verkn upft. Da die Einzelergebnisse
der Paare dann in den unteren Bits derer stehen, muss der Rest nach der
Verkn upfung durch Maskierung weggeblendet werden. Dieser Vorgang wird
so lange wiederholt bis das Ergebnis des ganzen Bytes in Bit 0 steht. Das
kann danach genutzt werden um das Paritatsbit entsprechend zu setzen oder
nicht. Davon abhangig ist auch die Wahl ob man auf Parity-Even oder -Odd
pr ufen mochte.
4.2 PC
Damit jedes Zeichen zeitnah verarbeitet werden kann, haben wir uns gegen
die Methode des Polling (regelmaiges Abfragen) entschieden. Stattdessen
soll ein empfangenes Zeichen sofort nach dem Empfang verarbeitet werden.
Dazu nutzen wir die Funktionen des Programmable Interrupt Controller
8259 auf 8086 Chipsatzen.
4.2.1 Hauptprogramm
Zu Beginn des Programms wird die COM-Schnittstelle konguriert. Dazu
werden die zustandigen Register ab Port 3F8h mit den entsprechenden Wer-
ten belegt. Zuerst wird der Teiler f ur die Baudrate eingestellt, indem das
DLAB-Bit (MSB im Line-Control-Register) auf 1 gezogen wird, wodurch
3F8h (low) und 3F9h (high) als Baudraten-Teiler-Register fungieren. F ur ei-
ne Baudrate von 9600 muss hier der Teiler 12 eingestellt werden, was 0Ch in
3F8h bedeutet und 0 in 3F9h. Nachdem das DLAB-Bit wieder auf 0 gesetzt
ist, konnen im Interrupt-Enable-Register 3F9h die Bits f ur auszulosende
Interrupts gesetzt werden. Wir entscheiden uns daf ur, nur bei einem ankom-
mendem Byte oder einem Line-Error einen Interrupt auslosen zu lassen, was
einem Wert von 05h entspricht. Zuletzt wird das Line-Control-Register
auf 8 bit pro Zeichen, ein Stopp-bit und grade Paritat eingestellt, was ei-
nem Wert von 1Bh entspricht. Abweichende Belegungen konnen unter der
Quelle
1
nachgelesen werden, die die einzig frei verf ugbare und ausf uhrliche
Dokumentation der Schnittstelle im deutschsprachigen Raum darstellt.
Als nachstes m ussen die Interruptvektorenverbogen werden, damit wir einen
Interrupt des COM-Ports selbst behandeln konnen. Dazu greifen wir direkt
in die Interrupt-Vektor-Tabelle ein, da Hardware-Interrupts mit dem int 21h
(Funktion 25) nicht verandert werden konnen. Dazu sichern wir die Werte
in der Tabelle an dem der Stelle 30h (Oset) und 32h (Segment) und uber-
schreiben sie mit dem Oset unserer ISR und dem aktuellen Codesegment.
Der Interrupt zeigt nun auf unsere eigene Service Routine. Innerhalb dieser
Routine werden die ankommenden Bytes dann entsprechend unseres Proto-
kolls (Kap. 1) verarbeitet.
1
http://www.bmo.physik.uni-muenchen.de/mantel/async.html
Jonas Dorn & Thomas Fuchs 9
4.2 4 SOFTWARE
Das Programm selbst besteht nun ausschlielich darin, anhand der Tasten-
eingabe des Benutzeres entweder auf den Empfang eines Frames zu warten
(Leertaste), oder sich zu beenden (x). Da wir in die Interrupt-Vektor-Tabelle
eingreifen muss der Beenden-Vorgang auf jeden Fall korrekt durchgef uhrt
werden, da hier die alten Vektoren wiederhergestellt werden.
4.2.2 Interrupt-Service-Routine
Die Interrupt Service Routine pr uft zunachst den Grund f ur den ausgelosten
Interrupt. Dies kann in unserem Falle ein Fehler beim Empfang sein oder
ein empfangenes Zeichen im Datenregister 3F8h. Zur Pr ufung des Inter-
rupts muss das Line-Status-Register 3FAh ausgelesen werden. Aufgrund
der Struktur des 8250 ist es notwendig nach einem Fehler sofort auf ein
empfangenes Byte zu pr ufen, welches dann aber ung ultig ist. Jedes regular
empfangene Byte wird an die Routine zur

Uberpr ufung des Frame-Status
weitergeleitet. Ist diese abgearbeitet, so wird dem Interrupt-Controller ein
End-Of-Interrupt in Form des Wertes 20h auf den Port 20h gesendet und
der normale Programmablauf wird fortgesetzt.
4.2.3

Uberpr ufung des Frame-Inhalts
Wie eingangs bereits erwahnt, lauft unsere Kommunikation anhand eines
denierten Protokolls ab. Der Mikroprozessor liefert also anhand der de-
nierten Reihenfolge einen bestimmten Wert im oberen Nibble des ubertra-
genen Bytes. Dieser Wert wird vom Empfangsprogramm dementsprechend
erwartet und das empfangene Byte auf diese Erwartung hin gepr uft. Dazu
wird ein Framemerker verwendet. Zu Beginn eines Frames muss das Byte
im oberen Nibble ein F enthalten, sonst wird es verworfen. Hat der Frame
begonnen, so wird eine 8 zur Kennzeichnung des ersten ID-Teils erwartet.
Ist dieser gekommen, so wird eine 9 f ur den zweiten Teil erwartet. F ur den
dritten Teil wird dann ein A angenommen. Als nachstes wird die Datenlange
mit C erwartet. Nun wird eine Schleife der Lange 1-8 gestartet, abhangig
von der im Datenfeld empfangenen Lange. Es m ussen genau diese Anzahl
an High(2) und Low (1) Bytes kommen, damit der Frame g ultig ist.
Im PAP (siehe Anhang S.13f) ist dieser Vorgang ausf uhrlich dargestellt,
inklusive der auszuf uhrenden Aktionen bei den entsprechenden Stellen des
Frames. Nach vollstandig empfangenem Frame wird der Framemerker auf 0
gesetzt, wodurch dem Hauptprogramm signalisiert wird, dass die Ausgabe
zu starten ist. Kommt ein Byte an, dessen oberes Nibble nicht zu der Er-
wartung passt, wird auf den nachsten Anfang des Frames gewartet und der
bisherige verworfen. Damit ist eine gewisse Fehlererkennung gegeben, die f ur
unser System mehr als ausreicht.
Jonas Dorn & Thomas Fuchs 10
A.0 A BILDER
A Bilder
Abbildung 3: Layout der Platine
Jonas Dorn & Thomas Fuchs 11
A.0 A BILDER
Abbildung 4: Schaltplan der Platine
Jonas Dorn & Thomas Fuchs 12
B.1 B PROGRAMMABLAUFPL

ANE
B Programmablaufplane
B.1 Programmablaufplane - Controller
Abbildung 5: PAP Hauptprogramm
Jonas Dorn & Thomas Fuchs 13
B.1 B PROGRAMMABLAUFPL

ANE
Abbildung 6: PAP ISR
Jonas Dorn & Thomas Fuchs 14
B.1 B PROGRAMMABLAUFPL

ANE
Abbildung 7: PAP CanRecMsg
Jonas Dorn & Thomas Fuchs 15
B.1 B PROGRAMMABLAUFPL

ANE
Abbildung 8: PAP SendCantoUart
Jonas Dorn & Thomas Fuchs 16
B.1 B PROGRAMMABLAUFPL

ANE
Abbildung 9: PAP UartSendMsg
Jonas Dorn & Thomas Fuchs 17
B.1 B PROGRAMMABLAUFPL

ANE
Abbildung 10: PAP UartCalcParity
Jonas Dorn & Thomas Fuchs 18
B.2 B PROGRAMMABLAUFPL

ANE
B.2 Programmablaufplane - PC
Abbildung 11: PAP ISRIRQ4
Jonas Dorn & Thomas Fuchs 19
B.2 B PROGRAMMABLAUFPL

ANE
Abbildung 12: PAP UART Main
Jonas Dorn & Thomas Fuchs 20
B.2 B PROGRAMMABLAUFPL

ANE
Abbildung 13: PAP Check Frame Teil A
Jonas Dorn & Thomas Fuchs 21
B.2 B PROGRAMMABLAUFPL

ANE
Abbildung 14: PAP Check Frame Teil B
Jonas Dorn & Thomas Fuchs 22
C.1 C PROGRAMME
C Programme
C.1 Programm - Controller
;
;
; f i l ename : main.asm
;
; aut hor : Thomas Fuchs
; pr oj e c t : i nt e r f a c e CAN <> RS232
;
;
;
; r equi r ed f i l e s : P18F2685.INC
; can f unc. asm
; f unc. asm
; uart f unc. as m
;
;
LIST P=18F2685 ; pr oces s or PIC18F2685
#include <P18F2685.INC> ; r equi r ed de c l ar at i on
;
; c onf i g ur at i on of t he pr oces s or
;
CONFIG OSC=IRCIO7 ; a c t i v a t e i nt e r na l c l oc k
CONFIG WDT=OFF ; t urn o f f watchdog
CONFIG CP0=OFF, CP1=OFF ; no code
CONFIG CP2=OFF, CP3=OFF ; pr ot e c t i on
CONFIG CP4=OFF, CP5=OFF
CONFIG CPB=OFF,CPD=OFF
CONFIG WRT0=OFF,WRT1=OFF
CONFIG WRT2=OFF,WRT3=OFF
CONFIG WRT4=OFF,WRT5=OFF
CONFIG WRTB=OFF,WRTC=OFF
CONFIG WRTD=OFF ; no wr i t e pr ot e c t i on
CONFIG PBADEN=OFF ; port B i s IO port
CONFIG BOREN=OFF ; no brown out r e s e t
CONFIG LVP=OFF ; no l ow v ol t ag e programming
;
; de c l ar at i on of v a r i a b l e s
;
UDATA ACS
Jonas Dorn & Thomas Fuchs 23
C.1 C PROGRAMME
; parameter f or can f unc. asm
canMsg0 RES 1 ; br oadcas t i ng byt e
canMsg1 RES 1 ; br oadcas t i ng byt e
canMsg2 RES 1 ; br oadcas t i ng byt e
canMsg3 RES 1 ; br oadcas t i ng byt e
canMsg4 RES 1 ; br oadcas t i ng byt e
canMsg5 RES 1 ; br oadcas t i ng byt e
canMsg6 RES 1 ; br oadcas t i ng byt e
canMsg7 RES 1 ; br oadcas t i ng byt e
canIDL RES 1 ; 3 l ow b i t s of ID of t he
; br oadcas t i ng frame
canIDH RES 1 ; 8 hi gh b i t s of ID of t he
; br oadcas t i ng frame
canDLC RES 1 ; dat al e ng t h of message
; parameter f or uart f unc. as m
uartsMsg RES 1 ; br oadcas t i ng byt e
uartrMsg RES 1 ; r e c e i v e d byt e
uartDLC RES 1 ; dat al e ng t h of message
; parameter f or f unc. asm
cms RES 1 ; count er i n s ubr out i ne wms
cxms RES 1 ; count er i n s ubr out i ne wxms
xms RES 1 ; parameter f or
; s ubr out i ne wxms
;
tempvar RES 1 ; temporary v a r i a b l e
; [ used i n can f unc. asm ]
temppari ty RES 1 ; temporary v a r i a b l e
; [ used i n uart f unc. as m ]
;
; r e s e t vect or
; t h i s code wi l l s t a r t execut i ng when a r e s e t occur s .
ORG 0x0000
goto Main ; go t o s t a r t of main code
;
; g l o b a l i nt e r r upt vect or
ORG 0x0008
goto I s r ; go t o i nt e r r upt
; s e r v i c e r out i ne
;
; s t a r t of maincode
;
;
Main :
ORG 0x0100
Jonas Dorn & Thomas Fuchs 24
C.1 C PROGRAMME
r c a l l I ni t
MainLoop :
bcf LATC, 5 ; t urn o f f red LED (CAN)
bcf LATC, 4 ; t urn o f f green LED (UART)
movlw 0x44 ; FA = 250ms , 44 = 85ms
movwf xms
cal l wxms ; wai t some mi l l i s e c s
goto MainLoop
;
;
; i n i t i a l i z a t i o n
;
I ni t :
; 8MHz f or i nt e r na l f requency
movlw 0x70
movwf OSCCON
; de f i ne p o r t d i r e c t i o ns [O = out put , I = i nput ]
movlw 0x08 ; port B: OOOO IOOO
movwf TRISB
movlw 0x8F ; port C: IOOO I I I I
movwf TRISC
c l r f LATC
; conf i gur e i nt e r f a c e s
r c a l l c anI ni t
r c a l l ua r t I ni t
; conf i gur e i nt e r r up t s
bsf INTCON, 7 ; a c t i v a t e g l o b a l i nt e r r upt
bsf INTCON, 6 ; a c t i v a t e per i pher y i nt e r r upt
bsf PIE3 , 0 ; a c t i v a t e i nt e r r upt f or RXB0
bsf PIE1 , 5 ; a c t i v a t e i nt e r r upt f or EUSART
; r e c e i v e
r et ur n
;
;
; i nt e r r upt s e r v i c e r out i ne
;
I s r :
bt f s s PIR3 , 0 ; CANmessage r ecei ved?
goto uar t I nt ; no , must be an UART
; message
canI nt :
bsf LATC, 5 ; red LED on
; send CANmessage t o UART
cal l canRecMsg ; wr i t e message from
Jonas Dorn & Thomas Fuchs 25
C.1 C PROGRAMME
; b u f f e r s t o memory
cal l sendCantoUart ; send CAN message from
; memory t o PC
bcf RXB0CON, RXFUL ; new CAN message can
; be r e c e i v e d
bcf PIR3 , 0 ; c l e ar buf f er ,
; a c t i v a t e i nt e r r upt
bra EndIsr
uar t I nt :
bsf LATC, 4 ; green LED on
; send UARTmessage t o CAN
cal l uartRecMsg ; wr i t e message from
; b uf f e r t o memory
; c a l l sendUarttoCan ; not requi red , onl y
; one di r e c t i on
EndIsr :
r e t f i e FAST
;
;
; sendi ng CANmessage t o PC
;
sendCantoUart :
movf canIDL , w
xorl w 0x02 ; t emperat ure from
bt f s s STATUS, Z ; thermoel ement?
goto nloadcanmsg ; no , don t want t h i s msg
l oadcanmsg :
movlw 0xFF ; s t a r t b y t e
movwf uartsMsg ; t o memory
cal l uartSendMsg ; send t h i s
movf canIDL , w ; get ID from memory
i or l w 0x80 ; l ow ID
movwf uartsMsg
cal l uartSendMsg
movf canIDH , w
andlw 0xF0
i or l w 0x09
swapf WREG ; f i r s t hi gh ID
movwf uartsMsg
cal l uartSendMsg
movf canIDH , w
andlw 0x0F
i or l w 0xA0 ; second hi gh ID
movwf uartsMsg
Jonas Dorn & Thomas Fuchs 26
C.1 C PROGRAMME
cal l uartSendMsg
movf canDLC, w
i or l w 0xC0 ; dat al e ng t h
movwf uartsMsg
cal l uartSendMsg
movf canDLC, w ; copy dat al e ng t h
bt f s c STATUS, Z ; t o count t h i s
goto nloadcanmsg ; no dat a t o send
movwf tempvar
movf canMsg0 , w
andlw 0xF0 ; mask , onl y hi ghpar t
i or l w 0x02 ; r equi r ed
swapf WREG ; send hi ghpar t of
movwf uartsMsg ; dat abyt e
cal l uartSendMsg
movf canMsg0 , w
andlw 0x0F ; mask , onl y l owpart
i or l w 0x10 ; r equi r ed
movwf uartsMsg ; send l owpart
cal l uartSendMsg ; of dat abyt e
decf tempvar ; count b yt e s
bt f s c STATUS, Z
goto nloadcanmsg ; no b yt e s l e f t
movf canMsg1 , w ; next b y t e . . .
andlw 0xF0
i or l w 0x02
swapf WREG
movwf uartsMsg
cal l uartSendMsg
movf canMsg1 , w
andlw 0x0F
i or l w 0x10
movwf uartsMsg
cal l uartSendMsg
decf tempvar
bt f s c STATUS, Z
goto nloadcanmsg
movf canMsg2 , w
andlw 0xF0
i or l w 0x02
swapf WREG
movwf uartsMsg
cal l uartSendMsg
movf canMsg2 , w
Jonas Dorn & Thomas Fuchs 27
C.1 C PROGRAMME
andlw 0x0F
i or l w 0x10
movwf uartsMsg
cal l uartSendMsg
decf tempvar
bt f s c STATUS, Z
goto nloadcanmsg
movf canMsg3 , w
andlw 0xF0
i or l w 0x02
swapf WREG
movwf uartsMsg
cal l uartSendMsg
movf canMsg3 , w
andlw 0x0F
i or l w 0x10
movwf uartsMsg
cal l uartSendMsg
decf tempvar
bt f s c STATUS, Z
goto nloadcanmsg
movf canMsg4 , w
andlw 0xF0
i or l w 0x02
swapf WREG
movwf uartsMsg
cal l uartSendMsg
movf canMsg4 , w
andlw 0x0F
i or l w 0x10
movwf uartsMsg
cal l uartSendMsg
decf tempvar
bt f s c STATUS, Z
goto nloadcanmsg
movf canMsg5 , w
andlw 0xF0
i or l w 0x02
swapf WREG
movwf uartsMsg
cal l uartSendMsg
movf canMsg5 , w
andlw 0x0F
i or l w 0x10
Jonas Dorn & Thomas Fuchs 28
C.1 C PROGRAMME
movwf uartsMsg
cal l uartSendMsg
decf tempvar
bt f s c STATUS, Z
goto nloadcanmsg
movf canMsg6 , w
andlw 0xF0
i or l w 0x02
swapf WREG
movwf uartsMsg
cal l uartSendMsg
movf canMsg6 , w
andlw 0x0F
i or l w 0x10
movwf uartsMsg
cal l uartSendMsg
decf tempvar
bt f s c STATUS, Z
goto nloadcanmsg
movf canMsg7 , w
andlw 0xF0
i or l w 0x02
swapf WREG
movwf uartsMsg
cal l uartSendMsg
movf canMsg7 , w
andlw 0x0F
i or l w 0x10
movwf uartsMsg
cal l uartSendMsg
nloadcanmsg :
r et ur n
;
; i nc l ude e x t e r nal s
;
#include can f unc. asm ; s p e c i a l CAN f unc t i ons
#include uar t f unc. as m ; s p e c i a l UART f unc t i ons
#include f unc. asm ; he l pi ng f unc t i ons
;
END
Jonas Dorn & Thomas Fuchs 29
C.1 C PROGRAMME
;
;
; f i l ename : uart f unc. as m
;
; aut hor : Thomas Fuchs
;
;
;
;
; r equi r ed f i l e s : not hi ng
; provi ded f unc t i ons : uar t I ni t , uartSendMsg ,
; uartRecMsg
;
;
;
;
; i n i t i a l i z a t i o n of t h i s i nt e r f a c e
;
ua r t I ni t :
movlw 0x0C ; 9600b/s
movwf SPBRG
movlw 0x60 ; 9 b i t t ransmi ssi on , t rans mi t enabl ed ,
movwf TXSTA ; async mode , l ow speed
movlw 0xD0 ; s e r i a l port enabl ed , 9 b i t recept i on ,
movwf RCSTA ; enabl e r e c e i v e r
c l r f BAUDCON ; 8 b i t baud r at e generat or ,
; no aut o baudrat e de t e c t i on
r et ur n
;
; sendi ng message [ 1 byt e ] t o PC
;
uartSendMsg :
movf uartsMsg , w ; byt e t o akku
cal l uar t Cal cPar i t y ; check Pari t y of byt e
andlw 0x01 ; pet zero f l a g
bz de l e t e Par i t yBi t ; par i t y = 0
movlw 0x01
i or wf TXSTA ; s e t par i t y b i t
bra sendMsg
de l e t e Par i t yBi t :
movlw 0xFE
andwf TXSTA ; c l e ar par i t y b i t
sendMsg :
movff uartsMsg , TXREG ; message t o TXREG,
Jonas Dorn & Thomas Fuchs 30
C.1 C PROGRAMME
; t rans mi s s i on s t a r t s
; aut omat i c al l y
uartSendLoop :
bt f s s TXSTA,TRMT ; t rans mi s s i on compl et e?
goto uartSendLoop ; no . . .
r et ur n
;
; r e c e i v e message [ 1 byt e ] from PC
;
uartRecMsg :
movff RCREG, uartrMsg ; c l e ar b uf f e r
r et ur n
;
; c a l c ul a t e t he par i t y of t he ac t ual byt e i n WREG
;
uar t Cal cPar i t y
movwf temppari ty ; byt e t o be checked t o temp
r r nc f temppari ty ; r ot at e once ( doubl e pai r s )
xorwf temppari ty , w
andlw 0x55 ; mask
movwf temppari ty
r r nc f temppari ty ; r ot at e t wi ce ( quad pai r s )
r r nc f temppari ty
xorwf temppari ty , w
andlw 0x11 ; mask
movwf temppari ty
r r nc f temppari ty ; r ot at e f our t i mes
r r nc f temppari ty ; ( e i g ht h pai r s )
r r nc f temppari ty
r r nc f temppari ty
xorwf temppari ty , w
andlw 0x01 ; mask
bz Par i t yzer o ; Pari t y = 0?
r et l w 0x01 ; no , ret urn wi t h 01 i n akku
Par i t yze r o :
r et l w 0x00
Jonas Dorn & Thomas Fuchs 31
C.1 C PROGRAMME
;
;
; f i l ename : can f unc. asm
;
; aut hor : Thomas Fuchs
;
;
;
;
; r equi r ed f i l e s : not hi ng
; provi ded f unc t i ons : canI ni t , canSendMsg
;
;
; c onf i g ur at i on of t h i s i nt e r f a c e
;
c anI ni t :
movlw 0x80
movwf CANCON ; conf i g mode
canCfgWait :
bt f s s CANSTAT, 7 ; conf i g mode reached?
goto canCfgWait ; no , wa i t . . .
movlw 0x13
movwf BRGCON1
movlw 0x90
movwf BRGCON2
movlw 0x02
movwf BRGCON3
;
c l r f RXB0CON ; 0110 0000
bsf RXB0CON, 6
bsf RXB0CON, 5 ; r e c e i v e a l l msg
;
movlw 0x00 ; s e t masks
movwf RXM0SIDH
movlw 0x00
movwf RXM0SIDL
;
movlw 0x00
movwf CANCON ; a c t i v a t e normal mode
;
bcf LATB, 4 ; t urn MCP2551 on
r et ur n
;
Jonas Dorn & Thomas Fuchs 32
C.1 C PROGRAMME
; t rans mi t message [ canMsg0. ..canMsg7 ]
; wi t h canID [ 2 byt e ]
;
canSendMsg :
banks el TXB0CON
r r nc f canIDL
r r nc f canIDL
r r nc f canIDL
movf canIDL ,W
andlw 0xE0 ; mask canID
movwf TXB0SIDL ; MsgID i s i n upper 3 b i t i n WREG
movff canIDH , TXB0SIDH
movff canDLC, TXB0DLC
movf canDLC, W
andlw 0x0F
bz EndcanSendMsg
movwf tempvar
movff canMsg0 , TXB0D0 ; l oad message t o
; t rans mi t b uf f e r
decf tempvar
bz EndcanSendMsg
movff canMsg1 , TXB0D1 ; l oad message
decf tempvar
bz EndcanSendMsg
movff canMsg2 , TXB0D2 ; l oad message
decf tempvar
bz EndcanSendMsg
movff canMsg3 , TXB0D3 ; l oad message
decf tempvar
bz EndcanSendMsg
movff canMsg4 , TXB0D4 ; l oad message
decf tempvar
bz EndcanSendMsg
movff canMsg5 , TXB0D5 ; l oad message
decf tempvar
bz EndcanSendMsg
movff canMsg6 , TXB0D6 ; l oad message
decf tempvar
bz EndcanSendMsg
movff canMsg7 , TXB0D7 ; l oad message
EndcanSendMsg :
bsf TXB0CON, 3
canSendLoop :
Jonas Dorn & Thomas Fuchs 33
C.1 C PROGRAMME
bt f s c TXB0CON, 3 ; byt e sent ?
goto canSendLoop
r et ur n
;
; r e c e i v e message [ canMsg0...canMsg7 ]
; wi t h canID [ 2 byt e ]
;
canRecMsg :
bt f s s RXB0SIDL, EXID ; xt d or s t d?
goto stdmessage
nomessage :
r et l w 0x01 ; no expect ed message , ret urn
stdmessage :
movf RXB0SIDL, W ; copy i d
andlw 0xE0 ; mask
movwf canIDL
r l n c f canIDL ; r ot at e , IDlow : 0000 0xxx
r l n c f canIDL
r l n c f canIDL
movff RXB0SIDH, canIDH ; copy i d
movf RXB0DLC, w ; copy dat al e ng t h
andlw 0x0F ; mask f or count i ng
movwf canDLC
bz EndcanRecMsg ; no dat a
movwf tempvar
loadMsg :
;
movff RXB0D0, canMsg0 ; copy dat a
decf tempvar ; count dat al e ng t h
bz EndcanRecMsg ; no more dat a
movff RXB0D1, canMsg1 ; copy data , next byt e
decf tempvar
bz EndcanRecMsg
movff RXB0D2, canMsg2 ; copy dat a
decf tempvar
bz EndcanRecMsg
movff RXB0D3, canMsg3 ; copy dat a
decf tempvar
bz EndcanRecMsg
movff RXB0D4, canMsg4 ; copy dat a
decf tempvar
bz EndcanRecMsg
movff RXB0D5, canMsg5 ; copy dat a
Jonas Dorn & Thomas Fuchs 34
C.1 C PROGRAMME
decf tempvar
bz EndcanRecMsg
movff RXB0D6, canMsg6 ; copy dat a
decf tempvar
bz EndcanRecMsg
movff RXB0D7, canMsg7 ; copy dat a
EndcanRecMsg :
; b c f RXB0CON, RXFUL; has t o be c l e ar e d i n ISR onl y !
r et l w 0x00
Jonas Dorn & Thomas Fuchs 35
C.1 C PROGRAMME
;
;
; f i l ename : f unc . i nc
;
; aut hor : Jonas Dorn
;
;
;
;
; r equi r ed f i l e s : kei ne
; provi ded f unc t i ons : wopt , wxms , wms
;
;
;
;
;
; wai t l oop f or o p t i c a l b l i nk of 1Hz
;
;
wopt :
movlw 0xFA
movwf xms
r c a l l wxms ; wai t 250ms
movlw 0xFA
movwf xms
r c a l l wxms ; wai t 250ms agai n
r et ur n
;
; wai t l oop f or x ms i n [ xms ]
;
wxms :
movff xms , cxms ; hand over parameter xms t o count er
wxms loop :
r c a l l wms
decf cxms
bnz wxms loop
r et ur n
;
; wai t l oop f or one ms
;
Jonas Dorn & Thomas Fuchs 36
C.1 C PROGRAMME
wms :
movlw 0xF9 ; checked val ue , r e s u l t s e x a c t l y one ms
movwf cms
wms loop :
decf cms
nop
nop
nop
nop
nop
bnz wms loop
r et ur n
Jonas Dorn & Thomas Fuchs 37
C.2 C PROGRAMME
C.2 Programm - PC
;
; S e r i e l l e Datenkommunikation ueber UART
; Pr oj ekt im Fach Rechnersysteme
; Thomas Fuchs & Jonas Dorn
;
s t ape l SEGMENTSTACK
DW 200 DUP ( ?)
s t ape l ENDS
daten SEGMENT DATA
i d DW 0 ; i d der can msg
DataRcv DB 8 DUP ( 0) ; 8 Byte f ur Daten r e s e r v i e r e n
DataCnt DB 0 ; Anzahl er war t et er Byt es
fm DB 0 ; FrameMerker
i r q4 po i DW 0 ; a l t e r poi nt er des i n t v e c t o r t a b l e
i r q4 s e g DW 0 ; a l t e s segment des i n t v e c t o r t a b l e
mldg1 DB [ Le e r t as t e ] empfangt Daten , [ x ] beendet Programm: $
mldg2 DB empfange Dat e n. . .
DB 0Ah
DB 0Dh ; LF und CR
DB $
AUSGABE DB Datenl ange :
DataLen DB 0 ; Dat enl ange anhand DLCFel d im Frame
DB ID:
idAUSG DB 6 DUP ( 0) ; ausgabe der i d
DB MSG:
DataAUSG DB 24 DUP ( 0) ; r e s e r v i e r t f ur hex ausgabe
DB 0Ah
DB 0Dh ; LF und CR
DB $
; Umkodi er t abel l e f ur HEXAUS
TAB DB 0123456789ABCDEF
daten ENDS
uart SEGMENT CODE
ASSUME CS: uart ,DS: daten , SS: s t apel , ES:NOTHING
Jonas Dorn & Thomas Fuchs 38
C.2 C PROGRAMME
St ar t :
mov ax, daten ; z i e l z e i g e r l aden
mov ds , ax ; Datensegment l aden
mov di , ds ; z i e l z e i g e r auf dat ensegment
mov fm, 0 F0h ; FrameMerker auf er war t eSt ar t
cal l initCOM ;COM1 e i n s t e l l e n
cal l INTakt ; I nt e r r upt s e i n s t e l l e n und a k t i v i e r e n
MainLoop :
mov bx, of f set mldg1
cal l AUSME
mov al , 0Ah ; l i ne f e e d
cal l AUSZ
mov al , 0Dh ; c ar r i ag e ret urn
cal l AUSZ
mov ah, 1 h
i nt 21h
mov bl , al
xor al , 78 h ; beende , wenn x ei ngegeben
j z beenden
xor bl , 20 h ; wart e auf Frame wenn Le er t as t e gedr uckt
jnz MainLoop
mov bx, of f set mldg2 ; Wartezustand s i g n a l i s i e r e n
cal l AUSME
mov fm, 0 F0h ; FrameMerker auf er war t eSt ar t
c l i
mov dx, 21 h ; Int errupt MaskReg hol en
in al , dx
;M4 demaski eren um IRQ4 zu a k t i v i e r e n
and al , 11101111b
out dx, al ;OCW1 s chr ei ben (IMR s et z en )
s t i ; I nt e r r upt s ak t i v i e r e n , es geht l o s !
Jonas Dorn & Thomas Fuchs 39
C.2 C PROGRAMME
RecvLoop :
mov al , fm
cmp al , 00 h ; endOfFrame e r r e i c ht ?
j e ausg ; wenn j a , frame ausgeben
jmp RecvLoop ; wenn nein , wei t er warten
ausg :
c l i
mov dx, 21 h ; Int errupt MaskReg hol en
in al , dx
or al , 00010000b ; IRQ 4 wi eder ab s c hal t e n
out dx, al
s t i
mov al , DataLen ; Dat enl ange i n ASCII konver t i er en
or al , 30 h ; geht so ei nf ach , da max 8 Byte
mov DataLen , al
; empfangene HEXDaten auf b e r e i t e n
mov si , of f set DataRcv
mov di , of f set DataAUSG
mov bx, of f set TAB
mov cl , 8
xor ch, ch
cal l HEXAUS
; empfangene HEXID auf b e r e i t e n
mov si , of f set i d
mov di , of f set idAUSG
mov bx, of f set TAB
mov cx, 2
cal l HEXAUS
; v o r b e r e i t e t e Meldung ausgeben
mov bx, of f set AUSGABE
cal l AUSME
; v or her i g e Daten l os chen
mov i d , 0000h
mov di , of f set DataRcv
mov cl , 7
cl rDat a : mov byte ptr [ di ] , 00 h
Jonas Dorn & Thomas Fuchs 40
C.2 C PROGRAMME
inc di
dec cl
jnz cl rDat a
jmp MainLoop
beenden :
;AUFR

AUMEN: i nt e r r upt demaski eren ,


; vekt or wi e d e r h e r s t e l l e n
c l i
mov dx, 3 f 9h ; I nt er r upt ak t i v i e r ung s reg COM1
mov al , 00 h ; kei ne UART i nt s mehr
out dx, al ; i nt akt reg s chr ei ben
xor ax, ax
mov es , ax ; Zei ger auf i n t v e c t o r t a b l e
; I nt e r r upt Vektoren wi eder h e r s t e l l e n
mov ax, i r q4 po i
mov [ es : 30 h ] , ax ; vor her i gen Poi nt er l aden
mov ax, i r q4 s e g
mov [ es : 32 h ] , ax ; v or he r i g e s Segment l aden
mov dx, 21 h ; Int errupt MaskReg hol en
in al , dx
or al , 00010000b ; IRQ 4 wi eder ab s chal t e n
out dx, al
mov dx, 3 f ch ; modem c ont r ol reg
in al , dx
mov al , 00 h ; i nt g a t e d i s a b l e
out dx, al
s t i
mov ah, 4Ch ; ruecksprung zu DOS
i nt 21h
INTakt PROCNEAR
Jonas Dorn & Thomas Fuchs 41
C.2 C PROGRAMME
xor ax, ax ; akku normieren
mov es , ax ; ext rasegment auf i nt e r r upt t a b l e
c l i ; i nt e r r up t s de ak t i v i e r e n f ur s e t t i ng
mov ax , [ es : 30 h ] ; vor her i gen Poi nt er s i cher n
mov i r q4 poi , ax
mov ax , [ es : 32 h ] ; v or he r i g e s Segment s i cher n
mov i r q4 s e g , ax
mov ax, of f set ISRIRQ4 ; Zei ger auf ei gene ISR
mov [ es : 30 h ] , ax
mov [ es : 32 h ] , cs ; segment auf ei genes codesegment
mov dx, 3 f 8h ; Zei chen aus l es en f ur i n i t
in al , dx
mov dx, 3 f 9h ; I nt er r upt ak t i v i e r ung s reg COM1
in al , dx ; Int akt reg hol en
mov al , 05 h ; [THE] , DR und REerr
out dx, al ; i nt akt reg s chr ei ben
mov dx, 3 f ch ; modem c ont r ol reg
in al , dx
mov al , 08 h ; i nt g a t e enabl e , l oop und RTS/DTR 0
out dx, al
s t i
INTakt ENDP
initCOM PROCNEAR
mov dx, 3 f bh ; Datenformat Regi s t er f ur DLAB
in al , dx
or al , 80 h ; dl ab a k t i v i e r e n
out dx, al
; baudrat e e i n s t e l l e n auf 9600 , t e i l e r muss auf 12
mov dx, 3 f 8h ; empfang i s t nun l a t c h r e g i s t e r
mov al , 0Ch ; l ow byt e des t e i l e r s auf 12d
out dx, al ; l ow byt e s chr ei ben
inc dx ; auf hi g hb yt e des l a t c h z ei gen 3 f 9h
xor al , al ; hi g hb yt e auf nul l
out dx, al ; hi g hb yt e s chr ei ben
Jonas Dorn & Thomas Fuchs 42
C.2 C PROGRAMME
mov dx, 3 f bh ; Datenformat Regi s t er f ur DLAB
in al , dx
and al , 7 f h ; dl ab Deakt i vi er en
out dx, al
mov dx, 3 f bh ; Datenformat Regi s t er f uer conf
mov al , 1Bh ; no break , par i t y even , 1st op , 8 b i t
out dx, al
RET
initCOM ENDP
ChkFrame PROCNEAR
; empfangenes Byte s t e h t i n AL b e i Auf ruf
mov bl , al ; Byte kopi eren , al f ur check gegen fm
and al , 0 F0h ; unt er es Ni bbl e wegbl enden
cmp al , fm ; wi rd das Byte er war t et ?
jne CFerr ; Frame verwerf en wenn ni cht
CFsof :
cmp al , 0 F0h ; kam StartFrame?
jne CFid1 ; wenn nein , nachst e Pr ufung
mov fm, 80 h ; fm auf erwarteID1
jmp CFend ; FrmCheck f e r t i g
CFid1 :
cmp al , 80 h ; kam ID1?
jne CFid2
cal l CFid1UP
mov fm, 90 h ; fm auf erwarteID2
jmp CFend
CFid2 :
cmp al , 90 h ; kam ID2?
jne CFid3
cal l CFid2UP
mov fm, 0A0h ; fm auf erwarteID3
jmp CFend
CFid3 :
Jonas Dorn & Thomas Fuchs 43
C.2 C PROGRAMME
cmp al , 0A0h ; kam ID3?
jne CFdlc
cal l CFid3UP
mov fm, 0C0h ; fm auf erwarteDLC
jmp CFend
CFdlc :
cmp al , 0C0h ; kam DLC?
jne CFdh
cal l CFdlcUP
mov fm, 20 h ; fm auf erwarteDatenHi gh
jmp CFend
CFdh:
cmp al , 20 h ; kam DataHigh?
jne CFdl
cal l CFdhUP
mov fm, 10 h ; fm auf erwarteDatenLow
jmp CFend
CFdl :
cmp al , 10 h ; kam DataLow?
jne CFend
cal l CFdlUP
j z CFcom
mov fm, 20 h ; nachs t es Hi ghNi bbl e empfangen
jmp CFend
CFcom: ; kompl et t en Frame empfangen
mov fm, 00 h ; fm auf erwart eAusgabe
jmp CFend
CFerr : mov fm, 0 F0h ; fm auf er war t eSt ar t ,
; Frame verworf en
CFend :
RET
ChkFrame ENDP
CFid1UP PROCNEAR
mov al , bl ; byt e wi ederhol en
and al , 0Fh ; oberes Ni bbl e wegbl enden
Jonas Dorn & Thomas Fuchs 44
C.2 C PROGRAMME
mov di , of f set i d ; z i e l z e i g e r auf l owByte der ID
mov [ di ] , al ; idLow s pei cher n
RET
CFid1UP ENDP
CFid2UP PROCNEAR
mov al , bl ; byt e wi ederhol en
and al , 0Fh ; oberes Ni bbl e wegbl enden
mov cl , 3
shl al , cl ; dr e i b i t s nach l i nk s 0xxx x000
mov di , of f set i d ; z i e l z e i g e r auf l owByte der ID
mov ah , [ di ] ; idLow hol en , f ormat 0000 0xxx
or al , ah ; unt er s t en 7 i db i t s zusammenf ugen
mov [ di ] , al ; s pei cher n
RET
CFid2UP ENDP
CFid3UP PROCNEAR
mov al , bl ; byt e wi ederhol en
and al , 0Fh ; oberes Ni bbl e wegbl enden
shr al , 1 ; ei n Bi t nach r e c ht s
jnc CFid3 2 ; LSB war g e s e t z t ? > lowID andern
mov di , of f set i d ; z i e l z e i g e r auf l owByte der ID
mov ah , [ di ] ; idLow hol en , f ormat 0xxx xxxx
or ah, 80 h ; unt e r s t e s b i t der lowID s et z en
mov [ di ] , ah ; s pei cher n der lowID
CFid3 2 :
mov di , of f set i d ; z i e l z e i g e r auf hi ghByt e der ID
inc di
mov [ di ] , al ; i dHi gh s pei cher n
RET
CFid3UP ENDP
CFdlcUP PROCNEAR
mov al , bl ; byt e wi ederhol en
and al , 0Fh ; oberes Ni bbl e wegbl enden
mov DataLen , al ; Dat enl ange s pei cher n
mov cl , al ; Dat enl ange i n Za h l r e g i s t e r
xor ch, ch
RET
CFdlcUP ENDP
CFdhUP PROCNEAR ; p l a t z sparen , s ons t zu l anger jump
mov al , bl ; byt e wi ederhol en
Jonas Dorn & Thomas Fuchs 45
C.2 C PROGRAMME
and al , 0Fh ; oberes Ni bbl e wegbl enden
push cx ; wi r brauchen mal eben CX
mov cl , 4
shl al , cl ; DatenHigh i s t oberes Ni bbl e !
pop cx ; danke , zur uck damit
mov di , of f set DataRcv ; Zei ger auf Dat enf el d
add di , cx ; z e i g e r auf r i c h t i g e s byt e
dec di ; anzahl zu o f f s e t konver t i er en
mov [ di ] , al ; oberes Ni bbl e s pei cher n
RET
CFdhUP ENDP
CFdlUP PROCNEAR
mov al , bl ; byt e wi ederhol en
and al , 0Fh ; oberes Ni bbl e wegbl enden
mov di , of f set DataRcv ; Zei ger auf Dat enf el d
add di , cx ; z e i g e r auf r i c h t i g e s byt e
dec di ; anzahl zu o f f s e t konver t i er en
mov ah , [ di ] ; Hi ghNi bbl e hol en
or al , ah ; zusammenf ugen
mov [ di ] , al ; ganzes byt e s pei cher n
dec cl ; nachs t es byt e
RET
CFdlUP ENDP
ISRIRQ4 PROC FAR
push ax
push dx
ISRSTRT:
mov dx, 3 f ah ; i nt e r r upt pendi ng pr uf en
in al , dx
and al , 07 h ; nur ar t des i nt e r r up t s beacht en
mov ah, al
xor ah, 06 h ; pr uf e auf ub e r t r ag ung s f e hl e r
jnz I SRnerr
mov dx, 3 f dh ; l i n e s t a t u s aus l es en b e i f e h l e r
in al , dx
jmp ISRSTRT ; pr uf e erneut
I SRnerr : mov ah, al ; saubere wert e erneut hol en
xor ah, 04 h ; z ei chen empfangen?
Jonas Dorn & Thomas Fuchs 46
C.2 C PROGRAMME
jnz ISRend ; anderer I nt er r upt , ni cht wi c ht i g
mov dx, 3 f 8h ; empfangenes Byte aus l es en
in al , dx
cal l ChkFrame ; Byte v e r ar b e i t e n
ISRend :
mov dx, 3 f ah
in al , dx
xor al , 01 h ; pendi ng r e g i s t e r l e e r ?
jnz ISRIRQ4 ; erneut pr uf en wenn noch pendi ng
mov dx, 20 h ; PIC adr es s e l aden
mov al , 20 h ; EndOf Int errupt an PIC senden
out dx, al
pop dx
pop ax
iRet
ISRIRQ4 ENDP
; Beginn der bekannt en Hi l f sprogramme
; Meldung ausgeben , o f f s e t i n BX
AUSME PROCNEAR
push ax
push bx
AUSME1: mov al , [ bx]
cmp al , $
j e AUSME2
cal l AUSZ
inc bx
JMP AUSME1
AUSME2: pop bx
pop ax
ret
AUSME ENDP
; Zei chen i n AL ausgeben
AUSZ PROCNEAR
push dx
push ax
mov ah, 2
mov dl , al
i nt 21h
Jonas Dorn & Thomas Fuchs 47
C.2 C PROGRAMME
pop ax
pop dx
ret
AUSZ ENDP
; Umcodierung der HEXWerte i n ASCIIZei chen
HEXAUS PROCNEAR
add si , cx
dec s i
mov ah, 0 f h
mov dl ,
HEX10: mov al , [ s i ]
ror al , 1
ror al , 1
ror al , 1
ror al , 1
and al , 0 f h
xl at
mov [ di ] , al
inc di
mov al , [ s i ]
and al , 0 f h
xl at
mov [ di ] , al
inc di
mov [ di ] , dl
dec s i
inc di
dec cx
jnz hex10
ret
HEXAUS ENDP
uart ENDS
END St ar t
Jonas Dorn & Thomas Fuchs 48
D.0 D CD
D CD
Auf der CD benden sich alle Bilder, Programmablaufplane und der Bericht.
Jonas Dorn & Thomas Fuchs 49