|
本人做了一个程序,用到电平变化中断,不知道为什么中断标志位就是不能置位,我用的是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
;----------初始化---------------------------------
START1 BCF INTCON,0 ;清电平变化中断标志位
SUB1 MOVF F2,0
SUBLW B'11111100' ;立即数-F2->TMR1H
MOVWF TMR1H
MOVF F1,0
SUBLW B'00011000'
MOVWF TMR1L
BTFSS STATUS,0
DECF TMR1H,1
MOVLW B'00001001'
MOVWF T1CON
BSF GPIO,0
BSF GPIO,1
YC1 BTFSS PIR1,0 ;检测Timer1是否溢出
GOTO YC1
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
INCF F2,1
MOVLW B'10111111' ;立即数+F2->TMR1H
ADDWF F2,0
MOVWF TMR1H
MOVLW B'00001001' ;Timer1控制字->T1CON
MOVWF T1CON
CALL ATOD ;调用A/D转化子程序
YC2 BTFSS PIR1,0 ;检测Timer1是否溢出
GOTO YC2
BCF PIR1,0 ;清Timer1溢出中断标志位
BTFSC INTCON,0 ;实现程序跳转
GOTO START2
CLRWDT
GOTO SUB1 ;当没有电平变化中断,循环执行以上程序
;----------------------------------------------------------------------------------------
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转换完成
GOTO SATD
BCF PIR1,6 ;清A/D转换完成中断标志位
;-----------------------------------------------------------------
CLRF F1 ;2ADRESH+ADRESH/4+ADRESH/8---->F2F1
CLRF F2
CLRF F3
MOVF ADRESH,0 ;A/D转换结果ADRESH-->F1
MOVWF F1
RLF F1,1
BTFSC STATUS,0
INCF F2,1
MOVF ADRESH,0
MOVWF F3
BCF STATUS,0
RRF F3,1
BCF STATUS,0
RRF F3,1
MOVF F3,0
ADDWF F1,1
BTFSC STATUS,0
INCF F2,1
BCF STATUS,0
RRF F3,1
MOVF F3,0
ADDWF F1,1
BTFSC STATUS,0
INCF F2,1
RETURN |
|