Automotive and Embedded Networks

cancel
Showing results for 
Search instead for 
Did you mean: 

How can I learn how to communicate with the Motorola 68HC05X32 Module with CAN?

I need to communicate with the Motorola 68HC05X32 that is currently in use in our operations. These are used for data aquisition and I need to interface my CVI project to them.
0 Kudos
Message 1 of 3
(4,763 Views)
There are example programs under C:\Program Files\National Instruments\NI-CAN\Examples for C. Also remember to have termination ressitors set as per the NI-CAN user manual. Hope this helps.
0 Kudos
Message 2 of 3
(4,763 Views)
G'day Zener

I wrote during my Uni time a simple assembler program for the 68HC705X32. It is not the best example but it works. There are few Motorola datasheets you should check as well: x16r1.pdf, eb421.pdf and eb181.pdf.
I hope this helps... sorry my LabVIEW code was written for a non NI-CAN-Interface card, therefore I didn't post it with this message.

Cheers
Goran

********************************************************************************
* CNG92071.ASM - Sample code to test CAN05X32 PCB and Software
********************************************************************************
* Anwendung: Test der HW des MC68HC705X32.
* Das Programm l�uft im EEPROM des HC705, da sonst keine Modifika-
* tionen an der SW gemacht werden k�nnten.
* Wichtig: Da die Reset und Int Vektoren im EPROM gespeichert sind
* m�ssen diese Programmteile exakt auch da beginnen. Sie k�nnen
* somit nicht mehr verschoben werden nachdem der Chip einmal
* programmiert wurde.
* Dieser CAN Knoten sendet zwei COB mit den ID100 und ID750:
* - Analoge Werte von Port D0
* - Digitale Werte von Port B
* er empf�ngt COB mit dem ID500 per Interruptsubroutine:
* - Digitale Werte f�r den Port A
* CAN Baudrate ist 100kBaud
*
* Autor: Marinkovic Goran
*
* Datum: 07.02.1999
*
* Versionen: 07.02.1999 erstellt
*
* File: CNG92071
*
********************************************************************************

porta equ $00
portb equ $01
ddra equ $04
ddrb equ $05
addata equ $08
adstat equ $09
tcr equ $12
tsr equ $13
ocrh1 equ $16
ocrl1 equ $17
tcnth equ $18
tcntl equ $19
ocrh2 equ $1E
ocrl2 equ $1F
ccntrl equ $20
ccom equ $21
cstat equ $22
cint equ $23
cacc equ $24
cacm equ $25
cbt0 equ $26
cbt1 equ $27
cocntrl equ $28
tbi equ $2A
trtdl equ $2b
tds1 equ $2c
rbi equ $34
rrtdl equ $35
rds1 equ $36

org $51
nexttime_l ds 1 ;
nexttime_h ds 1 ;
semaphor ds 1 ;semaphor variable
ad_wert ds 1 ;ADC Wert

org $120
start:
* Port A als digital Out definieren
lda #$ff ;
sta ddra ;
* Port B als digital In definieren
lda #$00 ;
sta ddrb ;
* Port D als analog In definieren und AD0 Wandeln
lda #$20 ;
sta adstat ;
* ADC Wert initialisieren
lda #$00 ;
sta ad_wert ;
* Port A initialisieren
lda #$00 ;
sta porta ;
* Erste Outputcomparezeit definieren auf 2500 E Clocks oder 5ms
lda #$09 ;
sta nexttime_h ;
ldx #$C4 ;
sta nexttime_l ;
sta ocrh1 ;
stx ocrl1 ;
* Semaphor initialisieren
lda #$00 ;
sta semaphor ;
* CAN initialisieren
lda #$23 ;MODE,SPD,1,OIE,EIE,TIE,RIE,RR
sta ccntrl ;
lda #$FF ;alle COB Empfangen
sta cacm ;
lda #$00 ;1 swj, prescaler 1
sta cbt0 ;
lda #$fa ;3 samples, 8 tseg2, 11 tseg1
sta cbt1 ;
lda #$1B ;one line Mode mit clk auf tx1
sta cocntrl ;
lda #$40 ;input comparatoren init
sta ccom ;
lda #$22 ;MODE,SPD,1,OIE,EIE,TIE,RIE,RR
sta ccntrl ;
* Outputcompareinterrupt freigeben
bset 6,tcr ;turn on output compare interrupt
cli
********************************************************************************
loop:
* Wartreschlaufe
lda semaphor ;die Warteschlaufe wird durch int oc1 unterbr.
beq loop ;in der int des oc1 wird der Semaphor inc.
* Semaphor decrementieren
dec semaphor ;Semaphor um eins zur�cksetzen (z�hlender Sem.)

* Auslesen des AD Wandlers
brclr 7,adstat,n_adc ;fertig gewandelt?
lda addata ;AD Wert abholen
sta ad_wert ;AD Wert zwischenspeichern
n_adc:

* Senden des CAN Objekts 100
transmit100:
brclr 2,cstat,* ;warten bis der CAN Puffer empfangsbereit ist
lda #$0C ;ID10..ID3 schreiben von ID100 (dezimal)
sta tbi
lda #$81 ;ID2..ID0,RTR,Dlg schreiben von ID100 (dez), Datenframe, 1Datenbyte
sta trtdl
lda ad_wert ;das zu �bermittelnde Byte in Sendepuffer
sta tds1
lda #$41 ;Sendeanforderung an CAN des HC05
sta ccom

* Senden des CAN Objekts 750
transmit750:
brclr 2,cstat,* ;warten bis der CAN Puffer empfangsbereit ist
lda #$5d ;ID10..ID3 schreiben von ID750 (dezimal)
sta tbi
lda #$c1 ;ID2..ID0,RTR,Datal�enge schreiben von ID750 (dez), Datenframe, 1Datenbyte
sta trtdl
lda portb ;das zu �bermittelnde Byte in Sendepuffer
sta tds1
lda #$41 ;Sendeanforderung an CAN des HC05
sta ccom

* Endlosschlaufe zu loop
jmp loop ;go back to loop

org $1B0
tim_int:
sei ;Verhindern von ungewollten Interrupts
brset 6,tsr,oc1_int ;war es der Int des OC1?
brset 3,tsr,oc2_int ;war es der Int des OC2?
oc1_int: ;es war der Int des OC1
lda nexttime_l ;low Byte der letzten Zeit
add #$C4 ;low Byte der n�chsten Zeit rechnen
sta nexttime_l ;low Byte der n�chsten Zeit ablegen
lda nexttime_h ;high Byte der letzten Zeit
adc #$09 ;high Byte der n�chsten Zeit rechnen
sta nexttime_h ;high Byte der n�chsten Zeit ablegen
ldx nexttime_l ;low Byte der n�chsten Zeit holen
sta ocrh1 ;Die Reihenfolge folgender Befehle ist wichtig
lda tsr
stx ocrl1
inc semaphor ;Semaphor setzen (z�hlendes Semaphor)
bra fertig ;zum Ende des Int Req. Springen

oc2_int:
lda tsr ;R�cksetzen des Int OC2
lda ocrl2
bra fertig ;zum Ende des Int Req. Springen

fertig:
cli
rti ;exit interrupt

* Interruptsubroutine des Basic CAN Controllers
org $1E0
cirq:
lda #$3E ;Interessiert mich diese ID10..ID3 (nur ID500)
cmp RBI
bne cfin ;kein Interessantes COB
lda #$81 ;Interresiert mich diese ID2..ID0 (nur ID500)
cmp rrtdl
bne cfin ;kein Interessantes COB
lda rds1 ;Wert dieses COB interessiert mich es wird:
sta porta ;Byte Nr 0 an Port A gespeichert
cfin:
lda #$44 ;CAN Empfangspuffer freigeben
sta ccom
lda cint ;CAN Int zur�cksetzen
rti ;exit interrupt

* MOR Initialisation
org $7fde
db $73 ;MOR initialisieren f�r Clockprescaler 2

* Interrupt und Reset Vektoren
org $7ff0
dw cirq ;CAN interrupt vector
dw start ;SCI interrupt vector
dw start ;timer overflow interrupt vector
dw tim_int ;timer output compare interrupt vector
dw start ;timer input capture interrupt vector
dw start ;IRQ interrupt vector
dw start ;SWI interrupt vector
dw start ;RESET interrupt vector
0 Kudos
Message 3 of 3
(4,763 Views)