Browsing this Thread:
1 Anonymous Users
訪客
|
當…當…當……( can bus)
|
|
以下的程式是某書本的範例程式,執行到一半就pcl的值怪怪的,當在某個數值如,然後來回的在這兩個值跳,請問是什麼原因 该程序实现发送缓冲器0向接收缓冲器0发送数据的自测试模式,其中接收采用中断方式,发送采用查询方式
LIST P=18F458 INCLUDE "P18F458.INC"
CAN_FLAG EQU 0X20 ;定义标志寄存器
ORG 0X00 GOTO MAIN ORG 0X18 GOTO CAN_INTSERVE ;转向中断服务子程序 ORG 0X30
;*********初始化子程序*************** INITIAL BCF TRISB,2 BSF TRISB,3 ;设置CANRX/RB3为输入 ;CANTX/RB2为输出 ;设置CAN的波特率为125K,在Fosc=4M时,Tbit=8us,假设BRP=01h,则 ;TQ=[2*(1+BRP)]/Fosc=2*(1+1)/4=1us。 ;NOMINAL BIT RATE=8TQ,SJW=1,Sync_Seg=1TQ,Prog _Seg=1TQ,Phase_Seg1=3TQ,Phase_Seg2=3TQ MOVLW 0X80 MOVWF CANCON ;请求进入CAN配置模式REQOP=100 WAIT BTFSS CANSTAT,OPMODE2 ;等待进入CAN配置模式OPMODE=100 GOTO WAIT MOVLW 0X01 MOVWF BRGCON1 ;设置SJW和BRP,SJW=1TQ,BRP=01H MOVLW 0X90 MOVWF BRGCON2 ;设置Phase_Seg1=3TQ和Prog _Seg=1TQ MOVLW 0X42 MOVWF BRGCON3 ;设置Phase_Seg2=3TQ ;设置发送邮箱0标识符号和发送的数据 MOVLW 0XFF MOVWF BSR ;TXB0D0到TXB0D7的地址在F60h以内,需 ;要指定BSR MOVLW 0X08 MOVWF TXB0DLC ;设置数据长度为8个字节 MOVLW 0X00 MOVWF TXB0D0 MOVLW 0X01 MOVWF TXB0D1 MOVLW 0X02 MOVWF TXB0D2 MOVLW 0X03 MOVWF TXB0D3 MOVLW 0X04 MOVWF TXB0D4 MOVLW 0X05 MOVWF TXB0D5 MOVLW 0X06 MOVWF TXB0D6 MOVLW 0X07 MOVWF TXB0D7 ;写发送缓冲器数据区的数据 MOVLW 0XFF MOVWF TXB0SIDH MOVLW 0XE0 MOVWF TXB0SIDL ;设置发送缓冲器0的标准标识符,本程序采用 ;标准识符 ;设置接收邮箱0的标识符和初始化数据 MOVLW 0XFF MOVWF RXB0SIDH MOVLW 0XE0 MOVWF RXB0SIDL ;设置接收缓冲器0的标识符 MOVLW 0XFF MOVWF RXF0SIDH MOVLW 0XE0 MOVWF RXF0SIDL ;初始化接收滤波器0 MOVLW 0X00 MOVWF RXM0SIDH MOVLW 0X00 MOVWF RXM0SIDL ;初始化接收屏蔽 MOVLW 0X20 MOVWF RXB0CON ;仅仅接收标准标识符的有效信息,FILHIT0=0 ;表示RXB0采用filter0 MOVLW 0X08 MOVWF RXB0DLC ;设置接收缓冲器0的数据区长度 MOVLW 0X00 MOVWF RXB0D0 MOVWF RXB0D1 MOVWF RXB0D2 MOVWF RXB0D3 MOVWF RXB0D4 MOVWF RXB0D5 MOVWF RXB0D6 MOVWF RXB0D7 ;初始化接收缓冲器0的数据区数据 ;初始化CAN模块的I/O控制寄存器 MOVLW 0X00 MOVWF CIOCON ;使CAN进入某种工作模式模式 MOVLW 0X00 MOVWF CANCON ;=0X40,进入自测试模式; ;=0x00,正常操作模式 WAIT1 MOVF CANSTAT ANDLW 0XE0 SUBLW 0X00 BTFSS STATUS,Z ;等待进入CAN正常操作模式OPMODE=000 ;或测试模式OPMODE=010 GOTO WAIT1 ;初始化CAN的中断 MOVLW 0X00 MOVWF PIR3 ;清所有中断标志 BSF PIE3,RXB0IE ;使能接收缓冲器0的接收中断 MOVLW 0X01 MOVWF IPR3 ;接收缓冲器0的接收中断为最高优先级 RETURN
;*********接收缓冲器0接收中断服务程序*********** CAN_INTSERVE BTFSS PIR3,RXB0IF GOTO ERR_EXIT BSF CAN_FLAG,0 BCF PIR3,RXB0IF ;清接收中断标志 BCF RXB0CON,RXFUL ;打开接收缓冲器来接收新信息 ERR_EXIT RETFIE
;****************主程序****************** MAIN NOP CLRF INTCON ;禁止所有中断 CALL INITIAL ;初始化 BSF INTCON,GIE BSF INTCON,PEIE ;使能中断 MOVLW 0X03 MOVWF TXB0CON ;发送优先级为最高优先级,TXPRI=11 LOOP BSF TXB0CON,TXREQ ;请求发送,TXREQ=1 WAITE2 BTFSS PIR3,TXB0IF ;等待发送完成 GOTO WAITE2 BCF PIR3,TXB0IF WAITE3 BTFSS CAN_FLAG,0 ;等待接收数据 GOTO WAITE3 BCF CAN_FLAG,0 ;清接收到标志 BCF TXB0CON,TXREQ ;禁止发送 INCF RXB0D0,0 MOVWF TXB0D0 INCF RXB0D1,0 MOVWF TXB0D1 INCF RXB0D2,0 MOVWF TXB0D2 INCF RXB0D3,0 MOVWF TXB0D3 INCF RXB0D4,0 MOVWF TXB0D4 INCF RXB0D5,0 MOVWF TXB0D5 INCF RXB0D6,0 MOVWF TXB0D6 INCF RXB0D7,0 MOVWF TXB0D7 ;用接收数据加1来更新发送数据 GOTO LOOP RETURN END
|
|
You can view topic.
你 不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.