這是我寫的不知為何,無法傳輸 LIST P=18F458 #INCLUDE "P18F458.INC" ;/*-----------------------------------------------*/ CAN_FLAG EQU 0X0027 RX_COUNT EQU 0X002F TX_COUNT EQU 0X004F dTimer2 EQU .100 dTimer_60ms EQU .255 Timer_60ms EQU 0X0050 W_TEMP EQU 0X0051 STATUS_TEMP EQU 0X0052 BSR_TEMP EQU 0X0053 TIMER_Falg WR_FULL EQU 0X005F ;/*-----------------------------------------------*/ ;/* FLAG SET */ ;/*-----------------------------------------------*/ TIMER_Falg_1ms EQU .1 TIMER_Falg_60ms EQU .2 ORG 0X0000 GOTO START ;/*----------------Initial------------------------*/ ORG 0X0008 ;/*-----------------------------------------------*/ INTSERVE MOVWF W_TEMP MOVFF STATUS,STATUS_TEMP MOVFF BSR,BSR_TEMP BTFSC PIR3,RXB0IF CALL CAN_ISR BTFSC PIR1,RCIF ; test rc interrupt flag CALL rs232_isr_Rx BTFSC PIR1,TMR2IF CALL timer_2_isr ; BTFSC PIR2,BCLIF ; CALL CAN_ERROR E: MOVFF BSR_TEMP,BSR MOVF W_TEMP,W MOVFF STATUS_TEMP,STATUS RETFIE ;/*------------------------------------*/ ;/* rs232 ISR Procedure */ ;/*------------------------------------*/ rs232_isr_Rx: bcf PIR1,RCIF ; movlw low(TXB0D0) ADDWF RX_COUNT,W MOVWF FSR0L MOVLW 0X0F MOVWF FSR0H MOVF RCREG,W BTFSC RX_COUNT,3 GOTO RX_BUF_FULL MOVWF INDF0 RX_BUF_FULL: INCF RX_COUNT,F MOVF RX_COUNT,W xorlw 0x0A ; BTFSS STATUS,Z GOTO E_RX BSF WR_FULL,0 RETURN E_RX: BCF WR_FULL,0 RETURN ;/*------------------------------------*/ ;/* can ERROR Procedure */ ;/*------------------------------------*/ CAN_ERROR BCF PIR2,BCLIF RETURN ;/*------------------------------------*/ ;/* can ISR Procedure */ ;/*------------------------------------*/ CAN_ISR: BCF PIR3,RXB0IF ; BSF CAN_FLAG,1 BCF RXB0CON,RXFUL RETURN ;/*------------------------------------*/ ;/* timer2 ISR Procedure */ ;/*------------------------------------*/ timer_2_isr: bcf PIR1,TMR2IF ; Clear TIMER2 interrupt flag bsf TIMER_Falg,TIMER_Falg_1ms eTimer2: RETURN ;/*----------------Initial------------------------*/
START CLRF WR_FULL CLRF CAN_FLAG CLRF RX_COUNT CLRF TX_COUNT CLRF INTCON movlw dTimer_60ms movwf Timer_60ms MOVLW 0X08 MOVWF TRISB ;/*-----------------------------------------------*/ ;/* PORTC DEFINITIONS */ ;/*-----------------------------------------------*/ banksel PORTC movlw b'11111111' movwf PORTC
banksel TRISC ; Select bank 1 movlw b'10111111' ; Set RC<6> as output, others input movwf TRISC
;/*-----------------------------------------------*/ ;/* USART port setup */ ;/*-------------------------------------------- movlw b'10010000' ; Continous recieve enabled, PORTC port enabled movwf RCSTA
banksel SPBRG ; Select bank 1 movlw b'01100111' ; 71 sets Baud rate to 9600 w/ .16% error note: BRGH=1 movwf SPBRG ; Baud Rate , 9600 = 11.059/16(71+1) banksel TXSTA movlw b'00100110' movwf TXSTA ; BRGH = 1, Asynch mode, enable transmit ; 8 bit transmission ; Select bank 1 bsf PIE1,RCIE ; Enable USART recieve interrupts ;bSf PIE1,TXIE ; Enable USART transmit interrupts ;/*-----------------------------------------------*/ ;/* timer2 setup */ ;/*-----------------------------------------------*/ ;/* Note: w/ T2CON=00011111 */ ;/* the prescaler = 16, the postscale = 2 */ ;/* */ ;/* This gives 1 x 4 x 250 x 1us = 1ms */ ;/* interrupt intervals. */ ;/*-----------------------------------------------*/ banksel T2CON movlw b'01010101' ; 173*16*2*(4/11.059) = 2002.35us = 2ms movwf T2CON ; Move W register to T2CON banksel dTimer2 ; Select bank 1 register movlw dTimer2 ; Place decimal 173 into W movwf PR2 ; Update Period reg for T2 bsf PIE1,TMR2IE ; Enable TMR2 interrupts ;/*-----------------------------------------------------------------------------------------*/ ;CAN Baud Rate 125K,Fosc=16Mhz,Tbit=8us,BRP=01h, ;TQ=[2*(1+BRP)]/Fosc=2*(7+1)/16=1us。 ;NOMINAL BIT RATE=8TQ,SJW=1,Sync_Seg=1TQ,Prog _Seg=1TQ,Phase_Seg1=3TQ,Phase_Seg2=3TQ ;/*-----------------------------------------------------------------------------------------*/ MOVLW 0X0F MOVWF BSR MOVLW 0X80 MOVWF CANCON ;request for CAN BUS Confirguration MODE WAIT BTFSS CANSTAT,OPMODE2 ;wait for CAN BUS Configuration MODE=100 GOTO WAIT MOVLW 0X06 MOVWF BRGCON1 ;set SJW and BRP,SJW=1TQ,BRP=06H MOVLW 0X90 MOVWF BRGCON2 ;Phase_Seg1=3TQ and Prog _Seg=1TQ MOVLW 0X42 MOVWF BRGCON3 ;Phase_Seg2=3TQ
;SET Transmit Buffer0 Control Register MOVLW 0X03 MOVWF TXB0CON MOVLW 0XFF MOVWF TXB0SIDH MOVLW 0XE0 MOVWF TXB0SIDL MOVLW 0X08 MOVWF TXB0DLC MOVLW 0X0F MOVWF BSR ; LFSR FSR0,TXB0D0 NEXT CLRF POSTINC0 MOVF FSR0L,W XORLW 0X4E BTFSS STATUS,Z GOTO NEXT ; MOVLW 0XFF MOVWF RXB0SIDH MOVLW 0XE0 MOVWF RXB0SIDL MOVLW 0X20 MOVWF RXB0CON ;FILHIT0=0
MOVLW 0X08 MOVWF RXB0DLC LFSR FSR0,RXB0D0 NEXT2 CLRF POSTINC0 MOVF FSR0L,W XORLW 0X6E BTFSS STATUS,Z GOTO NEXT2
MOVLW 0XFF MOVWF RXF0SIDH MOVLW 0XE0 MOVWF RXF0SIDL MOVLW 0X00 MOVWF RXM0SIDH MOVLW 0X00 MOVWF RXM0SIDL
; MOVLW 0X00 MOVWF CIOCON
; MOVLW 0X40 ;CANCON=0X00->Normal mode CANCON=0X40->Loop back mode MOVWF CANCON ; WAIT2 MOVF CANSTAT ANDLW 0XE0 SUBLW 0X40 BTFSS STATUS,Z ;wait for CAN BUS->Loop back mode=010 GOTO WAIT2 ; BSF RCON,IPEN MOVLW 0X01 MOVWF IPR3 MOVWF PIE3 MOVLW 0X22 MOVWF IPR1 ; MOVLW 0X08 ; MOVWF PIE2 ;/*--------------------------------------------------------------------*/ ;/* Main procedure */ ;/*--------------------------------------------------------------------*/ MAIN NOP MOVLW 0XC0 MOVWF INTCON LOOP btfss TIMER_Falg,TIMER_Falg_1ms GOTO LOOP bcf TIMER_Falg,TIMER_Falg_1ms decfsz Timer_60ms GOTO LOOP movlw dTimer_60ms movwf Timer_60ms CLRF RX_COUNT BTFSS WR_FULL,0 GOTO E_TX CALL CAN_BUS_TX NOP NOP NOP NOP NOP NOP NOP NOP E_TX: BTFSC CAN_FLAG,1 CALL TX_OK1 BCF WR_FULL,0 BCF CAN_FLAG,1 GOTO LOOP
;/*--------------------------------------------------------------------*/ ;/* UART TX procedure */ ;/*--------------------------------------------------------------------*/ TX_OK1: movlw low(RXB0D0) ADDWF TX_COUNT,W MOVWF FSR0L MOVLW 0X0F MOVWF FSR0H MOVF INDF0,W movwf TXREG tx_ok: btfss TXSTA,TRMT goto tx_ok INCF TX_COUNT MOVF TX_COUNT,W XORLW 0X08 btfss STATUS,Z goto TX_OK1 clrf TX_COUNT RETURN ;/*--------------------------------------------------------------------*/ ;/* CAN BUS TX procedure */ ;/*--------------------------------------------------------------------*/ CAN_BUS_TX: BSF TXB0CON,TXREQ ;TXREQ=1 WAITE4: BTFSS PIR3,TXB0IF ;Wait Transmit finish GOTO WAITE4 RETURN ;WAITE5: ; BTFSS CAN_FLAG,1 ; ; GOTO WAITE5 ; BCF CAN_FLAG,1 ; ; BCF TXB0CON,TXREQ ; ; RETURN END
|