打印

跪求高手帮忙解决PIC16F876A串口接收问题

[复制链接]
1804|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
diudiu22|  楼主 | 2009-3-24 19:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我不明白,关于这个接收中断,设置参考了书本的范例写的寄存器,而且第一次中断也都进去了,接收数据很正常,为啥第二次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
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

3

帖子

0

粉丝