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