****************************************************************************************************** * Studienarbeit Christopher Odenbach * * * * WS98/99 * * * * mit Dank an Willi * ****************************************************************************************************** ****************************************************************************************************** * MOTOROLA MC68HC705X32 * * * * SCI Interrupt service routines * * * * * * * * * * * ****************************************************************************************************** ****************************************************************************************************** ****************************************************************************************************** * select SCI service routine ****************************************************************************************************** SCI_INT EQU * LDA SCSR STA SCSR_BUF BRSET 5,SCSR_BUF,REC_INT ;receiver interrupt BRSET 4,SCSR_BUF,IDLE_INT ;idle interrupt JMP EO_SCI_INT ****************************************************************************************************** * Idle interrupt service routine ****************************************************************************************************** IDLE_INT BCLR 4,SCCR2 ;disable more idle line Interrupts ****************************************************************************************************** * Send data to SCI ****************************************************************************************************** LDA BC_IN ;any more bytes to send? BEQ EO_SCI_INT_HELP_2 SEND_SCI CLRX TBA_WAIT_LOOP NOP BRCLR 2,CSTAT,TBA_WAIT_LOOP SEND_SCI_LOOP INCX LDA SCI_TX_RAM-1,X STA TDS1-1,X ;transfer data byte to CAN transmit buffer TXA CMP BC_IN BEQ INSERT_HEADER BRA SEND_SCI_LOOP INSERT_HEADER ORA SENDER_ID_2 ;rest of my ID ORA SCI STA TRTDL LDA SCI_ID ;recipient is the chosen khepera ORA SENDER_ID_1 ;sender is me STA TBI LDA #$81 ;set transmission request STA CCOM CLRA STA BC_IN JMP EO_SCI_INT ****************************************************************************************************** * Receiver interrupt service routine ****************************************************************************************************** REC_INT LDA SCDR CMP #$1B ; read character is ESC? BEQ ENTER_COMMAND_MODE ; enter command mode LDX COMM_MODE ; already in command mode? BNE ENTER_COMMAND ; then continue with command INC BC_IN ; otherwise prepare for sending LDX BC_IN STA SCI_TX_RAM-1,X LDA BC_IN CMP #$08 BEQ SEND_SCI BSET 4,SCCR2 ; enable one idle line interrupt EO_SCI_INT_HELP_2 JMP EO_SCI_INT ENTER_COMMAND_MODE LDA #$01 STA COMM_MODE CLR CMD_IDX LDA MODE CMP #$01 BEQ PRINT_COMMAND_MODE JMP EO_SCI_INT PRINT_COMMAND_MODE JSR PRINT_COM_MODE JMP EO_SCI_INT ENTER_COMMAND LDX CMD_IDX STA CMD_LINE,X INC CMD_IDX CMP #$0D ; read character is CR BEQ END_COMMAND LDA CMD_IDX CMP #$10 BEQ LINE_TOO_LONG JMP EO_SCI_INT LINE_TOO_LONG DEC CMD_IDX JMP EO_SCI_INT END_COMMAND CLR COMM_MODE JSR PRINT_CR LDA CMD_LINE CMP #$53 ; 'S' = send CAN telegram BEQ COM_SEND CMP #$52 ; 'R' = robot BEQ COM_ROBOT_HELP CMP #$4C ; 'L' = list of robots BEQ COM_LIST_HELP * * place for new commands * LDA MODE CMP #$01 BNE EO_SCI_INT_HELP JSR PRINT_HELP_TEXT JSR PRINT_CR EO_SCI_INT_HELP JMP EO_SCI_INT **************** * command: SEND **************** COM_SEND LDA CMD_IDX SUB #$04 STA CMD_IDX LDA CMD_LINE+2 SUB #$41 STA REC_ADR LDA CMD_LINE+1 SUB #$41 STA SND_ADR AND #$1C LSLA LSLA LSLA ORA REC_ADR STA TBI LDA SND_ADR AND #$03 RORA RORA RORA ORA K_BUS ORA CMD_IDX STA TRTDL CLRX COM_SEND_LOOP LDA CMD_LINE+3,X CMP #$0D BEQ COM_SEND_EO_LOOP STA TDS1,X INCX BRA COM_SEND_LOOP COM_SEND_EO_LOOP LDA #$81 STA CCOM LDA MODE CMP #$01 BEQ COM_SEND_INFO BRA EO_SCI_INT *** COM_ROBOT_HELP BRA COM_ROBOT COM_LIST_HELP BRA COM_LIST *** COM_SEND_INFO JSR PRINT_FROM LDA CMD_LINE+1 ; Sender-ID + 65 (A, B, C...) JSR PRINT_CHAR JSR PRINT_CR JSR PRINT_TO LDA CMD_LINE+2 ; Recipient-ID + 65 JSR PRINT_CHAR JSR PRINT_CR JSR PRINT_DATA CLRX INFO_LOOP INCX LDA CMD_LINE+2,X CMP #$0D BEQ EO_INFO_LOOP JSR PRINT_CHAR BRA INFO_LOOP EO_INFO_LOOP JSR PRINT_CR JSR PRINT_CR BRA EO_SCI_INT ****************** * comand: ROBOT ****************** COM_ROBOT LDA CMD_LINE+1 SUB #$41 STA SCI_ID LDA MODE CMP #$01 BEQ COM_ROBOT_INFO BRA EO_SCI_INT COM_ROBOT_INFO JSR PRINT_ROB_INFO BRA EO_SCI_INT ****************** * command: LIST ****************** COM_LIST JSR PRINT_AVAIL LDA ROBNR BEQ NO_AVAIL CLRX COM_LIST_LOOP LDA ROBOTS,X AND #$1F ADD #$41 JSR PRINT_CHAR INCX TXA CMP ROBNR BEQ EO_COM_LIST_LOOP BRA COM_LIST_LOOP NO_AVAIL LDA #$2D JSR PRINT_CHAR EO_COM_LIST_LOOP JSR PRINT_CR JSR PRINT_CR BRA EO_SCI_INT ****************** ****************************************************************************************************** * End of SCI interrupt subroutine ****************************************************************************************************** EO_SCI_INT EQU * RTI ******************************************************************************************************