我不明白,关于这个接收中断,设置参考了书本的范例写的寄存器,而且第一次中断也都进去了,接收数据很正常,为啥第二次RCIF 那个标志始终不会置1呢??
另外想问一下,关于X1226时钟芯片,为什么读到的数总是FF啊?
现在把程序贴上来,请大家帮忙看看哪儿有问题,该程序涉及到两个串口的中断,通过串口扩展芯片GM8123,和对PORTB的0,1,2,3脚可以实现串口切换,中断服务部分里含有串口切换部分,来自不同串口的中断处理不同,也贴出来了;另外还涉及到时钟芯片的读写,这个部分没有写好,但是不影响接收中断,在此略去,发送数据部分因为没有问题了,所以也略去
现在存在的问题还是,第一次接收中断来临程序很正常,但是第二次中断就跳不进去了,很费解。
恳请大家再帮我看看~~~~~~~~万分感谢!!!
ERRORLEVEL -302 LIST P=16f876A #INCLUDE<P16F876A.INC> #DEFINE STADD0 PORTB,0 #DEFINE STADD1 PORTB,1 #DEFINE SRADD0 PORTB,2 #DEFINE SRADD1 PORTB,3 ;GM8123 #DEFINE SDA PORTB,4 ; RB4, 时钟芯片数据输入输出 #DEFINE SCL PORTB,5 ; RB5, 时钟芯片串行时钟 #DEFINE SDAIO TRISB,4 ; 数据线输入输出状态 #DEFINE SCLIO TRISB,5 ; 时钟线输入输出状态 ;-------------------------------------------------------- TXBUF EQU 71H ; SOU 发送数据缓冲器 RXBUF EQU 72H ; SOUH接收数据缓冲器 BCOUNT EQU 73H ; CNT 位计数 ;AX EQU 74H AH EQU 74H AL EQU 75H BH EQU 77H ;CCR状态寄存器 BL EQU 76H ;写入的字节数 CX EQU 78H ;CCR状态寄存器地址 ;CX+1 EQU 79H DX EQU 7AH ;写入数据的首地址 ;DX+1 EQU 7BH ;--------------------------------------------------------- STATUS EQU 03H Z EQU 02H INTCON EQU 0BH PORTA EQU 05H PORTB EQU 06H PORTC EQU 07H TRSIC EQU 87H RP0 EQU 05H PIE1 EQU 8CH RCSTA EQU 18H TXSTA EQU 98H SPBRG EQU 99H RCREG EQU 1AH TXREG EQU 19H GIE EQU 7 PEIE EQU 6 RCIE EQU 5 RCIF EQU 5 ;-----------变量寄存器---------- W_TEMP EQU 07FH ;现场保护中保存W的地址 STATUS_TEMP EQU 07EH DQ_DELAY1 EQU 20H DQ_DELAY2 EQU 21H SOU EQU 7BH TEMP1 EQU 7CH TEMP2 EQU 7DH TEMP3 EQU 0F6H TEMP4 EQU 0F1H TEMP5 EQU 0F2H CNT EQU 0F3H X EQU 0F4H Y EQU 0F5H SADR EQU 0F7H ;校验数据块首地址 DADR EQU 0F8H ;接收字节首地址寄存器 ERRO EQU 0F9H CF EQU 0FAH COUNT EQU 0FBH COUNT2 EQU 0FCH COUNT3 EQU 0FDH COUNT_MS EQU 0FEH CS EQU 0FFH N1 EQU 171H N2 EQU 172H VAL_US EQU .249 ;短延时定时参数 VAL_MS EQU .200 ;长延时定时参数 TMR0_VALUE EQU 0AH ;寄存器初值为6,预分频比1:4,中断一次时间为4*(256-6)=1000us DQ_DELAY_VALUE1 EQU 0FAH DQ_DELAY_VALUE2 EQU 04H M1 EQU 173H M2 EQU 174H M3 EQU 175H
;***************************************************************** ;******************************程序部分*************************** ;复位 ORG 00H NOP GOTO MAIN ;-----------------中断向量和中断服务子程序-------------- ORG 04H GOTO serv ;***************************主程序*************************** MAIN ;--------------初始化寄存器--------------- call intX1226 ;初始化时钟芯片 ;------------------------------ call gmTTL ;串口切换至02
CALL INTURRT ;初始化接收中断 (关于接收中断的设置放在后面突出显示部分) CALL SETURRT ;接收中断相关寄存器设置 ;-----------------循环等待---------------- loop call writeX1226 ;写时钟芯片 goto loop
;*******************中断服务子程序***************** serv MOVWF W_TEMP SWAPF STATUS,W CLRF STATUS MOVWF STATUS_TEMP ;**********************调查中断源****************** BTFSC PIR1,RCIF GOTO URRAT GOTO RETFIE0 ;***************连续接收多个字节中断处理部分************* ;数据存放首地址:DADR ;总共发送的字节数:TEMP4 ;数据从SOU中接收后,依次存放在DADR为首地址的预定义空间里 URRAT banksel PIR1 BCF PIR1,RCIF ;清中断标志 BCF STATUS,RP0 MOVF RCREG,W MOVWF INDF INCF FSR,F DECFSZ TEMP4,F GOTO RETFIE0 call d01or02 ;判断是01串口中断还是02串口中断
;******************恢复现场部分*************************** RETFIE0 SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W RETFIE ;中断返回 ;------------------------------------------------- d01or02 ;通过接收后存在61H中;的字节判断中断来至于哪个串口 movlw 68H subwf 61H,W btfsc STATUS,Z goto d01or02_02 ;61H=68 02 goto d01or02_01 ;61H=5B 01主机 d01or02_02 ;来至02的中断 call readX1226 ;读时钟芯片 call send02 ;发送部分
call gm232 ;切换串口至232 goto return33 d01or02_01 ;来至01的中断 call getX1226 ;读时钟芯片X1226 call send01 ;发送部分 call writeX1226 ;写时钟芯片 call gmTTL ;切换串口到02 return33 return
;**************************************************************************** ;----------------子程序------------------- gmTTL ;切换GM8123到子串口02 BSF STATUS,RP0 ;选体1 CLRF TRISB ;B口所有先设置为输出 BCF STATUS,RP0 MOVLW 0AH MOVWF PORTB return gm232 CALL DELAY_MS ;切换GM8123到子串口01 BSF STATUS,RP0 ;选体1 CLRF TRISB ;B口所有先设置为输出 BCF STATUS,RP0 MOVLW 05H MOVWF PORTB return ;----------------接收初始化------------------ INTURRT BCF STATUS,RP0 ;清理数据存储空间 MOVLW D'16' MOVWF COUNT MOVLW 60H MOVWF FSR NEXT00 CLRF INDF INCF FSR,1 DECFSZ COUNT,1 GOTO NEXT00 BSF STATUS,RP0 ;选择体1 (BANKSEL TRISC) BSF TRISC,6 ;设RC6为TX 、RC7为RX NOP BSF TRISC,7 MOVLW 19H MOVWF SPBRG ;BSF TXSTA,BRGH ;高速模式,波特率为9600 ;BCF TXSTA,SYNC ;异步模式 ;BCF TXSTA,TX9 ;发送9位数据 ;BSF TXSTA,TXEN ;工作在发送方式 MOVLW 24H MOVWF TXSTA RETURN ;---------------------------------------- SETURRT BCF STATUS,RP0 BCF RCSTA,FERR ; BCF RCSTA,RX9 ;接收9位数据 BSF RCSTA,CREN ;开始连续接收 BSF RCSTA,SPEN ;使能串行口
BSF INTCON,PEIE ;BCF PIR1,RCIF ;清中断标志 BSF INTCON,GIE MOVLW D'16' ;接收字节数16 MOVWF TEMP4 MOVLW 60H MOVWF DADR ;接收字节存储在60H为首的单元里 MOVF DADR,W MOVWF FSR BSF STATUS,RP0 BSF PIE1,RCIE ;开串行口接收中断 RETURN
END
|
|