next up previous contents
Next: 9.1.6 sci_int.asm Up: 9.1 Khepera-Modul Previous: 9.1.4 leds.asm

9.1.5 mcan_int.asm

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

******************************************************************************************************



Christopher Odenbach
1999-06-01