****************************************************************************************************** * 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 ******************************************************************************************************