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