******************************************************************************************************
* Studienarbeit Christopher Odenbach *
* *
* WS98/99 *
* *
* mit Dank an Willi *
******************************************************************************************************
******************************************************************************************************
* MOTOROLA MC68HC705X32 *
* *
* MCAN Interrupt service routines *
* *
* *
* *
* *
* *
******************************************************************************************************
******************************************************************************************************
******************************************************************************************************
* Transfer data from MCAN interface to RAM-buffer
******************************************************************************************************
MCAN_INT EQU *
LDA CINT
STA CINT_BUF
BRSET 2,CINT_BUF,ERROR_HANDLE ; error- or bus status have changed?
DATA_2_RAM LDA RX_RAM_ACC ; RAM free?
BEQ HELP_BRA ; No - sodd off
CLRA
STA RX_RAM_ACC ; now it is not free any more
LDA RRTDL
STA RX_RAM+1
AND #$0F ; get length of sent data
STA RX_CNT ; store length of sent data in RX_CNT i.e. X-Reg.
BEQ EO_CAN_2_RAM_LOOP ; 0 byte instruction --> ping
TAX
CAN_2_RAM_LOOP LDA RDS1-1,X ; copy receive buffer to ram-buffer (RX_RAM)
STA RX_RAM+1,X
DECX
BNE CAN_2_RAM_LOOP
EO_CAN_2_RAM_LOOP LDA RBI
STA RX_RAM
AND #$E0 ; get the sender's address
LSRA
LSRA
LSRA
STA SND_ADR
LDA RX_RAM+1
AND #$C0
LSRA
LSRA
LSRA
LSRA
LSRA
LSRA
ORA SND_ADR
STA SND_ADR
LDA #$84
STA CCOM ; release receive buffer
BRCLR 0,CINT_BUF,EO_MCAN_INT ; only proceed if this was a receive-Interrupt
BRA RECEIVE_INT
ERROR_HANDLE LDA #$0A ; MCAN has set RR, so
STA CCNTRL ; clear RR again
BRA EO_MCAN_INT
******************************************************************************************************
* select MCAN service routine
******************************************************************************************************
RECEIVE_INT JSR LED_1
LDA RX_RAM+1
AND #$20 ; ID0 mask
CMP SCI
BEQ DATA_2_SCI ; received message's destination is SCI
LDA RX_CNT
BEQ PING_REQUEST ; DLC=0 => Ping
BRA DATA_2_K_BUS ; else received message's destination is K_BUS
******************************************************************************************************
* Answer ping request
******************************************************************************************************
PING_REQUEST EQU *
LDA SENDER_ID_1
ORA SND_ADR
STA TBI ; store ID and Recipient
LDA SENDER_ID_2
ORA K_BUS
STA TRTDL ; store ID and K/SCI Bit, Data length = 0
LDA #$81 ; set transmission request
STA CCOM
LDA #$01
STA RX_RAM_ACC
HELP_BRA BRA EO_MCAN_INT
******************************************************************************************************
* Transfer data from MCAN interface to SCI
******************************************************************************************************
DATA_2_SCI EQU *
CLRX
RAM_2_SCI_LOOP NOP
BRCLR 7,SCSR,RAM_2_SCI_LOOP
INCX
LDA RX_RAM+1,X
STA SCDR
TXA
CMP RX_CNT
BNE RAM_2_SCI_LOOP
LDA #$01
STA RX_RAM_ACC
BRA EO_MCAN_INT
******************************************************************************************************
* Transfer data from MCAN interface to K_BUS
******************************************************************************************************
DATA_2_K_BUS EQU *
LDA #$01
STA K_BUS_REQUEST ;set internal request bit
CLR RAM_READ
BCLR 5,PORT_B
BSET 4,PORT_B
LDA #$FF ;all bits on PORT A conf. as outputs
STA DDRA
LDA RX_CNT
DECA ;RX_CNT is in the range from 1 to 8 --> 3 bits
;are enough for 0 to 7
RORA
RORA
RORA
RORA
ORA SND_ADR
STA PORT_A ;output ((number of bytes - 1) | sender address)
;to external buffer
BSET 5,PORT_B ;leba = 1 => latch data
CLRX
STX DDRA ;configure PORT A as input
BCLR 4,PORT_B ;oeab = 0 => enable latch output to port A
BSET 3,PORT_B ;drive Khepera interrupt IRQ6
BRA EO_MCAN_INT
******************************************************************************************************
* End of MCAN interrupt subroutine
******************************************************************************************************
EO_MCAN_INT EQU *
RTI
******************************************************************************************************