Elektor
1/2000
Das in Elektor 11/99 vorgestellte CAN-
Bus-Interface kann problemlos in
BASIC537 angesteuert werden.
BASIC537 ist eine an den 80C537 ange-
passte und erweiterte EPROM-Version
des bekannten Intel-MCS51-BASICs,
das vielen Elektor-Lesern bereits ver-
traut sein dürfte. Dieser BASIC-Inter-
preter war ursprünglich für den
(inzwischen nicht mehr gefertigten)
BASIC-Mikrocontroller 8052AH-BASIC
entwickelt worden und eignet sich in
Verbindung mit einem externen ROM
auch für andere Controller der 80xx-
Familie (siehe auch 80C32-BASIC-Steu-
ercomputer, Elektor 2 und 3/98). In der
nächsten Ausgabe wird auf die neuen
BASIC-Varianten für die Mikrocontrol-
ler 80C535 und 80C537 noch ausführli-
cher eingegangen. Ein EPC (Ein-Plati-
nen-Computer) mit dem Mikrocon-
troller 80C537 wurde unter der
Bezeichnung “80C537-Compuboard”
bereits in Elektor 6/97 veröffentlicht.
Für die praktische Anwendung in Ver-
bindung mit dem CAN-Bus-Interface
wird hier aber das neue, wesentlich
kompaktere und kostengünstigere 537-
Lite-Board verwendet, das ebenfalls in
dieser Ausgabe (und auch auf dem
Titelbild) zu finden ist.
H
A R D W A R E
Für die einfache Verbindung zwischen
der mit dem BASIC537—EPROM
bestückten 537-Lite-Platine und der
Wer sich zum ersten
Mal mit dem CAN-Bus
beschäftigt, der hat
einiges zu tun, bis er
die ersten Erfolge
sieht. Es müssen
immerhin mindestens
zwei Mikrocontroller-
Systeme korrekt mit den Controllern verbunden und eine Bus-Datenver-
bindung aufgebaut werden, wobei zwei Programme zum Einsatz kom-
men. Wenn das erste Mal Daten über den Bus flitzen, geht alles Weitere
ganz einfach. Dieser Beitrag soll die ersten praktischen Schritte für den
Anwender so weit wie möglich vereinfachen.
66
Von Burkhard Kainka
CAN-Bus-Praxis
mit BASIC537
MIKROPROZESSOREN
CAN-Interface-Platine wurde eine
Adapterplatine entwickelt. Bild 1 zeigt
den Schaltplan dieses Adapters, Layout
und Bestückungsplan sind in Bild 2 zu
sehen. Wie auf dem Foto zu sehen ist,
lässt sich das 537-Board direkt auf die
Adapterplatine aufstecken, so dass die
Verdrahtung keinerlei Probleme berei-
tet. Die Verbindung zum CAN-Inter-
face-Board erfolgt dann einfach über
ein Flachbandkabel (siehe Foto am
Artikelanfang).
Um das leidige Problem der Stromver-
sorgung ebenfalls einfach zu lösen,
wurde auf der Adapterplatine auch ein
5-V-Spannungsregler mit Verpol-
schutzdiode am Eingang unterge-
bracht, so dass die Adapterplatine die
beiden anderen Platinen mit +5 V ver-
sorgt. An K2 braucht man dafür nur
ein Steckernetzteil von der preiswerten
Sorte (300 mA ist mehr als ausrei-
chend) anzuschließen, das eine unsta-
bilisierte Gleichspannung von 9-12 V
zur Verfügung stellt. Wenn man schon
stabilisierte 5 V zur Verfügung hat,
kann man IC1, D1, C1 und C2 auf der
Adapterplatine auch weglassen und
die 5-V-Betriebsspannung an die Klem-
men von K1 auf der Adapterplatine
anschließen.
Aus Kostengründen hat die Adapter-
platine wesentlich klei-
nere Abmessungen als
das (aufzusteckende)
537-Board. Wenn man
die Adapterplatine ent-
lang der im Aufdruck
angegebenen Linie in
zwei Teile trennt und
diese im richtigen Abstand auf einer
Trägerplatte (z.B. Alublech) montiert,
lässt sich die 537-Platine einfach auf
diesen Untersatz aufstecken. Lediglich
die Interruptleitung INT2\ ist bei
Bedarf mit einem Stück Schaltdraht
von Pin 12 (K3) nach Pin 32 (K6)
durchzuverbinden (siehe Foto des 537-
Boards mit den beiden demontierten
Teilen der Adapterplatine). Auf den
beiden Teilen der Adapterplatine sind
dafür Anschlusspunkte vorgesehen, im
Bestückungsplan (siehe Bild 2) ist diese
Verbindung als Drahtbrücke einge-
zeichnet.
A
N S T E U E R U N G I N
B A S I C
Zur Ansteuerung der CAN-Interface-
Platine genügt ein Programm, das sich
eigentlich nur um eine Reihe von Regi-
stern im CAN-Controller SJ1000 küm-
mern muss, die in den Adressbereich
ab F000h eingeblendet sind. Für alle
Zugriffe auf Adressen im Bereich des
externen RAMs und der Peripherie
dient in BASIC537 der XBY-Operator.
Damit die Orientierung leicht fällt, soll
hier zunächst ein ganz einfacher Fall
mit einer Datenverbindung zwischen
zwei 80C537-Systemen beschrieben
werden. Die wesentlichen Einstellun-
gen werden durch
das Programm fest
vorgegeben. Die
Übertragung erfolgt
mit 20 kBit/s. Nach-
richten werden ohne RTR-Bit gesen-
det, das heißt, es wird keine Rückant-
wort angefordert. Die beiden Systeme
sollen folgende Aufgaben erfüllen:
System 1 sendet regelmäßig Nachrich-
ten mit dem Identifier 300, in denen
acht Bytes verschickt werden. Die
Daten stammen von den ersten acht
Kanälen des A/D-Wandlers. Es werden
also laufend Messungen an acht ana-
logen Eingangsleitungen durchge-
führt. Jedes andere System am Bus
kann die Nachricht empfangen und
auswerten.
System 2 empfängt alle Nachrichten
auf dem Bus und gibt sie über die
RS232-Schnittstelle an den PC weiter.
Man hat hier zugleich einen einfachen
CAN-Monitor, mit dem man sich den
gesamten Datenverkehr ansehen
kann.
Bild 3 zeigt diese Anordnung im
Blockschaltbild. Für die Verbindung
zwischen den beiden Systemen
benötigt man kein spezielles Kabel. Bei
den ersten Versuchen auf dem Labor-
tisch, das heißt, bei einer Leitungslänge
kleiner 1 m, reicht auch ein einfaches
zweiadriges Kabel, das die Anschlüsse
4 und 8 der CAN-Stecker Eins zu Eins
verbindet. Es macht bei so kurzen
Kabeln auch keinen Unterschied, ob
die Abschlusswiderstände angeschlos-
sen sind oder nicht.
S
E N D E P R O G R A M M
U N D
T
E S T
In Listing 1 ist das Sendeprogramm für
den Controller 1 angegeben. Der CAN-
Controller SJA1000 wird vom 80537-
System unter der Basisadresse 0F000H
angesprochen. Zeile 95 legt den
Adressbereich fest (BA=0F000h). In
einem anderen System braucht
zunächst nur BA geändert zu werden.
Die Initialisierung erfolgt wie im vor-
hergehenden Beitrag zur CAN-Hard-
ware beschrieben. In den Zeilen 110
und 200 wird der Erfolg der Register-
programmierung abgefragt. Das Pro-
gramm wartet hier jeweils auf ganz
bestimmte Zustände eines Registerbits.
Falls der Controller nicht am Bus
gefunden wird oder nicht korrekt
funktioniert, bleibt das Programm hier
hängen. Im Erfolgsfall erhält man
dagegen die folgende Meldung:
Reset OK
Init OK
Es genügt zunächst, die Initialisierung
bis Zeile 200 auszuführen. Eine erste
Erfolgskontrolle bringt eine Untersu-
chung des Rechtecksignals am Testpin
der Controllerplatine. Während hier
vor der Initialisierung eine Frequenz
von 8 MHz beobachtet wird, findet
67
Elektor
1/2000
K2
K1
IC1
7805
C2
100n
C4
100n
C1
10µ
16V
C3
10µ
16V
D1
1N4001
+5V
+9V
5V
K4
K3
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
990066 - 4 - 14
K6
K5
D0
D1
D2
D3
D4
D5
D6
D7
A7
A6
A5
A4
A3
A2
A1
A0
A15
A14
A13
A12
A11
A10
A9
A8
PFI
PFO
RESET
RESET
ALE
PSEN
WR
RD
CS0
CS1
CS2
P50
P51
P52
P53
P54
P55
P56
P57
P60
P64
P63
P65
P66
P67
P40
P41
P42
P43
P44
P45
P46
P47
INT4
INT3
INT6
INT5
INT2
T2EX
CLKO
T2
T1
T0
INT1
INT0
VAREFF
VBATT
VOUT
5V
5V
WR
RD
CS2
RESET
ALE
INT2
1
Bild 1. Schaltbild der
Adapterplatine für die
einfache Verbindung
zwischen 537-Lite-Board
und CAN-Bus-Interface.
man nun 2 MHz. Wenn das so stimmt,
kann man einigermaßen sicher sein,
dass der Controller korrekt angesteu-
ert wird.
Nun kann das komplette Programm
geladen und gestartet werden. Der
erfahrene Elektroniker wird nun
natürlich gleich zum Oszilloskop grei-
fen und die Daten beobachten. Bevor
eine Verbindung zu einem zweiten
System hergestellt wurde findet man
auf den Datenleitungen bereits ein Sig-
nal. Nach einem Hardware-Reset und
ohne eine Initialisierung misst man auf
beiden Leitungen Ruhepegel von ca.
2,5 V. Sobald das Sendeprogramm
gestartet wird, erkennt man Daten in
Form von Rechtecksignalen mit einer
Amplitude von 1 V. Die kürzesten
Zustände bleiben für 50 µs bestehen,
woraus man auf die korrekte Übertra-
gungsrate von 20 Kilobits pro Sekunde
schließen kann. Allerdings erkennt
man einen nur durch kurze Pausen
von 2 ms unterbrochenen Endlos-
Datenstrom und nicht wie vermutet
kurze Datenpakete. Doch keine Sorge,
dies ist das normale Verhalten des
Controllers, solange er noch keinen
Kollegen am Bus entdeckt hat. Es
reicht aber nicht, den zweiten Control-
ler über eine Zweidrahtleitung anzu-
schließen, er muss auch initialisiert
werden. Die Dauersignale der Sende-
station zur Suche nach einem Buspart-
ner dauern übrigens auch dann an,
wenn das Basic-Programm abgebro-
chen wird.
D
A S
E
M P F A N G S
-
P R O G R A M M
Nun kommt das in Listing 2 angege-
bene Empfangsprogramm im zweiten
System zum Einsatz. Wie man dem
Listing entnehmen kann, unterschei-
68
Elektor
1/2000
(C) ELEKTOR
000020-1
C1
C2
C3
C4
D1
H5
H6
H7
H8
IC1
K1
K2
K3
K4
K5
K6
000020-1
(C) ELEKTOR
000020-1
Stückliste
Kondensatoren:
C1, C3 = 10
µ/16 V (stehend)
C2, C4 = 100 n (keramisch)
Halbleiter:
D1 = 1N4001
IC1 = 7805
Außerdem:
K1 = 2-polige Anschlussklemme für
Platinenmontage, RM 5 mm
K2 = 2-polige Anschlussklemme für
Platinenmontage, RM 5 mm
K3 = Wannenstecker, gerade, 16-
polig
K4 = Stiftleiste, einreihig, gerade, 4-
polig
K5, K6 = Stiftleiste, einreihig, gerade,
35-polig
Bild 2. Layout und
Bestückungsplan der
Adapterplatine.
Bild 3. Blockschaltbild
der CAN-Bus-Verbin-
dung mit den beiden in
BASIC programmierten
80C537-Systemen.
3
69
Elektor
1/2000
Empfangsprogramm CAN2.BAS (Listing 2)
90 REM Init CAN Controller
95 BA=0F000H
100 XBY(BA+00 H)=01H : REM Reset Mode
110 IF (XBY(BA+00H).AND.1)<>1 THEN GOTO 110
111 PRINT ”Reset OK”
120 XBY(BA+1FH)=43H : REM CDR, 2 MHz
130 XBY(BA+04H)=0 : REM ACR
140 XBY(BA+05H)=0FFH : REM AMR, Acceptance Mask, all
150 XBY(BA+06H)=53H : REM BTR0, 20 Kbit/s*
160 XBY(BA+07H)=2FH : REM BTR1
170 XBY(BA+08H)=1AH : REM OCR;
180 XBY(BA+01H)=0EH : REM CMR, end sleep mode
190 XBY(BA+00H)=0 : REM CR, end reset mode
200 IF (XBY(BA+00H).AND.1)>0 THEN GOTO 200
201 PRINT ”Init OK”
500 REM ******* Receiver Main Loop *************
510 SR=XBY(BA+02H) : REM Status Register
520 REM Error Detection and Clear Data Overrun
530 if (SR .AND. 2) = 2 then XBY(BA+01H)=8: :Goto 510
540 REM Get Receive Status
550 if (SR .AND. 1) =0 then goto 510
560 REM Read received message
570 ID=XBY(BA+14H)*8+INT(XBY(BA+15H)/32) : PRINT ID
580 DFL=XBY(BA+15H).AND.15 : rem Data Length
590 RTR=(XBY(0FE15H).AND.16)/16 : REM RTR not used
600 FOR N=0 To 7
610 PRINT N ,XBY(BA+16H+N)
620 NEXT N
630 XBY(BA+01H)=0CH : REM Release Receive Buffer
640 GOTO 510
det sich die Initialisierung nicht von
der des sendenden Systems. Sobald sie
abschlossen ist und man am Bild-
schirm die Meldung ”Init OK” erhalten
hat, nimmt auch der sendende Con-
troller seinen normalen Betrieb auf. Ab
jetzt erscheinen tatsächlich kurze
Datenpakete mit einer Länge von
knapp über 5 ms auf dem Bus. Nun
endlich funktioniert der CAN-Bus so,
wie es sich der interessierte Leser
immer vorgestellt hat: Datenpakete flit-
zen über den Bus, ohne Rücksicht dar-
auf, ob sie wirklich jemand liest.
Das eigentliche Empfangsprogramm
ab Zeile 500 wartet auf eine empfan-
gene Nachricht, die der Controller im
Bit Null des Statusregisters ankündigt.
Sobald ein Datensatz eingetroffen ist,
kann das Programm insgesamt zehn
Bytes aus dem Controller lesen. Die
ersten beiden enthalten die Message-
ID. Sie wird in Zeile 570 aus zwei Bytes
rekonstruiert und angezeigt. Wie
erwartet erscheint hier die ID 300, die
ja im Sendeprogramm willkürlich fest-
gelegt wurde.
Die eigentlichen Nutzdaten werden in
einer Schleife gelesen und in Zeile 610
angezeigt. Hier erhält man also endlich
die Messwerte der acht analogen Ein-
gänge des ersten Controllersystems.
Bild 4 zeigt die empfangenen Daten
im Terminalfenster.
Z
U M
S
C H L U S S
:
D
R E I A M
B
U S
Die bisherigen Ergebnisse hätte man
auch mit einer einfachen RS232-
Schnittstelle erzielen können. Der
Sendeprogramm CAN1.BAS (Listing 1)
90 REM Init CAN Controller
95 BA=0F000H
100 XBY(BA+00H)=01H : REM Reset Mode
110 IF (XBY(BA+00H).AND.1)<>1 THEN GOTO 110
111 PRINT ”Reset OK”
120 XBY(BA+1FH)=43H : REM CDR, 2 MHz
130 XBY(BA+04H)=0 : REM ACR
140 XBY(BA+05H)=0FFH : REM AMR, Acceptance Mask, all
150 XBY(BA+06H)=53H : REM BTR0, 20 Kbit/s*
160 XBY(BA+07H)=2FH : REM BTR1
170 XBY(BA+08H)=1AH : REM OCR;
180 XBY(BA+01H)=0EH : REM CMR, end sleep mode
190 XBY(BA+00H)=0 : REM CR, end reset mode
200 IF (XBY(BA+00H).AND.1)>0 THEN GOTO 200
201 PRINT ”init ok”
500 REM ************* Main Loop ***************
501 REM Send 8 Bytes of AD-Data in message 300
510 FOR N=0 TO 7
520 XBY(BA+0CH+N)=AD(N) : REM fill TB1..TB8
530 NEXT N
540 ID=300 : REM Message Identifier
550 DFL=8 : REM 8 Bytes
560 GOSUB 1000 : REM Send Massage
570 FOR T=1 TO 1000 : NEXT T
580 GOTO 500
1000 REM ************* Send CAN Telegram *************
1010 IF (XBY(BA+02H).AND.4)=0 THEN GOTO 1010 : REM SR
1020 XBY(BA+0AH)=INT(ID/8) : REM IDT1
1030 XBY(BA+0BH)=(ID-8*INT(ID/8))*32+DFL : REM IDT2
1040 XBY(BA+01H)=0DH : REM CMR, start transmission
1050 RETURN
CAN-Bus entfaltet seine Qualitäten
aber erst bei mehr als zwei Teilneh-
mern. Damit also zwei Busteilnehmer
nicht zu einsam sind, soll hier ein drit-
ter hinzukommen. Das Programm
CAN3.BAS (Listing 3 - ohne Initialisie-
rung) führt folgende Funktionen aus:
Es empfängt alle Nachrichten, wertet
aber nur die Nachricht mit der ID 300
aus. Die ersten drei übertragenen Mess-
werte werden mit bestimmten Grenz-
werten verglichen und schalten drei
Leitungen am Port P4 ein, wenn der
jeweilige Grenzwert überschritten wird.
Im Anschluss an die Auswertung einer
empfangenen Nachricht wird zusätz-
lich eine Nachricht mit der ID 500
zurückgesandt, wobei wiederum alle
A/D-Kanäle gemessen und übertragen
werden. Sobald auch das dritte
System an den Bus gelegt wird, liefert
das System 2 auch die Daten mit der
ID 500 an das Terminal (siehe Bild 5).
(990066-4e)
Hinweis:
Die drei Listings aus diesem Beitrag wer-
den auf dem Elektor-Site (www.elektor.de)
zum Download bereitgestellt. Weitere Infor-
mationen zu BASIC 535/537 findet man
auf der Homepage des Autors:
http://home.t-online.de/home/B.Kainka
Das in Pascal erstellte betriebsprogramm
wird in der nächsten Ausgabe vorgestellt.
70
Elektor
1/2000
Empfangs- und Sendeprogramm CAN3.BAS ohne Initiali-
sierung (Listing 3)
500 REM ************ Main Loop ***************
505 REM ************ Receiver ****************
510 SR=XBY(BA+02H) : REM Status Register
520 REM Error Detection and Clear Data Overrun
530 IF (SR.AND.2)=2 THEN XBY(BA+01H)=8 : GOTO 510
550 IF (SR.AND.1)=0 THEN GOTO 510
560 REM Read received message
570 ID=XBY(BA+14H)*8+INT(XBY(BA+15H)/32): Print ID
580 DFL=XBY(BA+15H).AND.15 : REM Data Length
590 RTR=(XBY(0FE15H).AND.16)/16 : REM RTR not used
600 IF ID<>300 THEN GOTO 660
610 PORT=0
620 IF XBY(BA+16H+0)>100 THEN PORT=PORT+1
630 IF XBY(BA+16H+1)>100 THEN PORT=PORT+2
640 IF XBY(BA+16H+2)>100 THEN PORT=PORT+4
650 WRSFR 0E8H,PORT : REM Port 4 Output
660 XBY(BA+01H)=0CH : REM Release Receive Buffer
800 REM ******** Send AD-Data ***********
810 FOR N=0 TO 7
820 XBY(BA+0CH+N)=AD(N) : REM fill TB1..TB8
830 NEXT N
840 ID=500 : REM Message Identifier
850 DFL=8 : REM 8 Bytes
860 GOSUB 1000 : REM Send Message
870 FOR T=1 TO 1000 : NEXT T
880 GOTO 500
1000 REM ******* Send CAN Telegram *************
1010 IF (XBY(BA+02H).AND.4)=0 THEN GOTO 1010 : REM SR
1020 XBY(BA+0AH)=INT(ID/8) : REM IDT1
1030 XBY(BA+0BH)=(ID-8*INT(ID/8))*32+DFL : REM IDT2
1040 XBY(BA+01H)=0DH : REM CMR, Start Transmission
1050 RETURN
Bild 4. Die empfange-
nen Daten im Termi-
nalfenster von
BASIC537.
Bild 5. Empfang der
Nachrichten 300 und
500.