winnie 发表于 2009-5-23 11:56:09

关于PIC中断标志位利用的问题

本人做了一个程序,用到电平变化中断,不知道为什么中断标志位就是不能置位,我用的是PIC12F675,而且相关的IOC寄存器也被设置了,程序是长了一点,主要是做A/D转化,转化的结果,放在TMR1H:TMR1L。我只取高8位,做8位精度,处理后放入F2:F1,F2:F1是在0到600之间的数。它和确定的值运算放如TMR1H:TMR1L使之定时,在定时期间在GP0和GP1上输出相同的脉冲。但有另个问题:就是GP1可以实现功能,但GP0没有任何信号,不知道为什么?GP0和GP1都是进行相同的操作啊!这是个循环程序,我想通过GP4电压变化置中断标志位,跳出该段程序,就是实现不了。不知道是不是电压变化标志位处理的问题,还是外围电路有什么特殊的要求。不知道是输入电压发生变化引起置标志位,还是输出电压发生变化置标志位,或者两者皆有!
该程序A/D无问题

程序如下:
INTCON      EQU   H'0B'
STATUS       EQU   H'03'
TRISO          EQU   H'85'
ANSEL         EQU   H'9F'
ADCON0   EQU    H'1F'
ADRESH      EQU    H'1E'
F1               EQU    H'30'
F2               EQU    H'31'
F3               EQU    H'32'
F4               EQU    H'33'
OPTION_REG   EQU    81H
TMR1L         EQU   H'0E'
TMR1H         EQU   H'0F'   
T1CON         EQU   H'10'
GPIO             EQU   H'05'
PIR1            EQU   H'0C'
OSCCAL      EQU      H'90'
IOC               EQU      H'96'
WPU            EQU   H'95'
;----------------- 4MHZ ---------------------------------------------
         ORG   H'05'
         NOP
         BCF   INTCON,7             ;清全局中断使能
         BSF   STATUS,5             ;选体“1”
         MOVLW B'00010000'          ;使电平变化中断标志有效
         MOVWF IOC
         MOVLW B'00111100'          ;设置端口方向
         MOVWF TRISO
         MOVLW B'00110100'
         MOVWF WPU
         MOVLW B'00001111'          ;设置PRESCALAR->WDT,1:128
         MOVWF OPTION_REG
         BCF   STATUS,5
;----------初始化---------------------------------
START1BCF   INTCON,0             ;清电平变化中断标志位
   SUB1MOVFF2,0
            SUBLW B'11111100'          ;立即数-F2->TMR1H
            MOVWF TMR1H               
            MOVFF1,0                        
            SUBLW B'00011000'         
            MOVWF TMR1L               
            BTFSS STATUS,0
            DECFTMR1H,1
            MOVLW B'00001001'         
            MOVWF T1CON
            BSF   GPIO,0               
            BSF   GPIO,1
   YC1   BTFSS PIR1,0               ;检测Timer1是否溢出
             GOTOYC1
             BCF   PIR1,0               ;溢出清溢出中断标志
             BCF   GPIO,0               ;置端口输出GP0,GP1为"0"
             BCF   GPIO,1
             MOVLW B'00101000'          ;立即数+F1->TMR1L
             ADDWF F1,0               
             MOVWF TMR1L               
             BTFSC STATUS ,0            
             INCFF2,1
             MOVLW B'10111111'          ;立即数+F2->TMR1H
             ADDWF F2,0
             MOVWF TMR1H
             MOVLW B'00001001'         ;Timer1控制字->T1CON
             MOVWF T1CON
             CALLATOD                         ;调用A/D转化子程序
YC2    BTFSS PIR1,0               ;检测Timer1是否溢出
             GOTOYC2      
             BCF   PIR1,0               ;清Timer1溢出中断标志位
             BTFSC INTCON,0       ;实现程序跳转
             GOTOSTART2
             CLRWDT
             GOTOSUB1               ;当没有电平变化中断,循环执行以上程序
;----------------------------------------------------------------------------------------
ATOD   BSF   STATUS,5
            MOVLW B'00010100'          ;初始化ANSEL(4MHZ-8TOSC-2.0US001)
               MOVWF ANSEL      
               BCF   STATUS,5             ;体选 "0"
               MOVLW B'00001001'          ;初始化ADCON0 打开A/D转换器
               MOVWF ADCON0
               NOP
               NOP
               NOP
               NOP
               BSF   ADCON0,1             ;开始A/D转换
SATD    BTFSC ADCON0,1             ;等待A/D转换完成
               GOTOSATD
               BCF   PIR1,6               ;清A/D转换完成中断标志位
;-----------------------------------------------------------------
               CLRFF1                   ;2ADRESH+ADRESH/4+ADRESH/8---->F2F1
               CLRFF2                  
               CLRFF3
               MOVFADRESH,0             ;A/D转换结果ADRESH-->F1
               MOVWF F1
               RLF   F1,1
               BTFSC STATUS,0
               INCFF2,1
               MOVFADRESH,0
               MOVWF F3
               BCF   STATUS,0
               RRF   F3,1
               BCF   STATUS,0
               RRF   F3,1
               MOVFF3,0
               ADDWF F1,1
               BTFSC STATUS,0
               INCFF2,1
               BCF   STATUS,0
               RRF   F3,1
               MOVFF3,0
               ADDWF F1,1
               BTFSC STATUS,0
               INCF F2,1
             RETURN

winnie 发表于 2009-5-23 11:56:19

问题解决了,

GP0,GP1不能得到同样的信号,主要是因为他们默认不是作为I/O口,而是作为其他一些特殊功能来使用的。要在相关寄存器里设置一下。



电平变化引脚,确实是被设置成输入状态,我用的是GP4脚,单片机加电至正常状态,该引脚空载电压为5伏多。

不起作用,主要是我在TICON寄存器里设置T1CON<3>为“1”。这样设置,GP4读出的总是为“0”,当然不可能产生电平变化中断。
页: [1]
查看完整版本: 关于PIC中断标志位利用的问题