打印

为何PIC时间中断不准确?

[复制链接]
2196|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hopewise|  楼主 | 2012-4-23 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pic, ST, ov, go, gp
org        0X0000
       goto      START_BEGIAN      ; On power-up begin at label "START_BEGIAN"
       nop
       nop
       nop
       movwf    acc_bak                 ;现场保护
       swapf     STATUS,W                ;用SWAPF才不会影响标志位
       movwf    status_bak              ;将W和STATUS存入各保护寄存器
       goto       ISR         ;Int. vector @ loc'n STARTUP+4
START_BEGIAN:                           ;I/O口初始化
banksel  OPTION_REG
       movlw    0X08
       movwf    OPTION_REG          ;分频器给WDT用,且分频比1:1,INT下降沿触发,GPIO带上拉
       bcf         STATUS,RP0          ;bank0
       clrf         GPIO                     ;初始化端口引脚电平为0
       movlw    07h                       ;关闭比较器功能
       movwf    CMCON
       bsf        STATUS,RP0           ;bank1
       clrf         ANSEL                   ;端口设置为数字I/O
       movlw    0x04
       movwf    WPU                     ;GP2带上拉电阻,其他I/O口不带
       movlw    0ch
       movwf    TRISIO           ;GP2(INT),GP3(MCLR)为输入,GP1(负载2),GP0(负载1),GP4,GP5为输出
       clrf         STATUS                  ;bank0
       movlw    0X20
       movwf    FSR
clrram_loop:
       clrf          INDF                          ;变量初始化
       incf         FSR,f
       btfss       FSR,4
       goto       clrram_loop                    
              
       banksel  INTCON
       clrf         INTCON
       movlw    0x85           ;133(16进制是85H)=256-125+2---125是定是器tmr0每隔125us中断一次
       movwf    TMR0
       bsf         INTCON,T0IE             ;开启tmr0中断允许位
       bsf         INTCON,INTE             ;开启INT中断允许位
       bsf         INTCON,GIE              ;开启全局中断允许位
       bsf         temp,f_heat
       movlw    10
       movwf    ten_sec_test
;************************************
;***********主程序区*****************
main:
        btfss    t_125us,3               ;到了1ms吗?      
        goto     main                      ;没到,则返回到main处
        clrf       t_125us                   ;到了,则清t_125us变量
        ;CLRWDT
        ;call      rtc_man                   ;实时检测流量信号时间管理               
        call       time_man                 ;标准时间管理
        goto     main
;************************************
;***********中断判断区***************
ISR:
       btfss     INTCON,T0IE            ;测试是否tmer0中断允许
       goto     other_int                  ;T0IE=0,不可能是tmer0中断进入
       btfss     INTCON,T0IF            ;测试是否tmer0中断
       goto     other_int                  ;非tmer0中断,判断其它中断标志
      
       bcf         INTCON,T0IF           ;清除T0IF标志
       incf        t_125us
       movlw    0x85
       addwf    TMR0,f
       btfss      temp,f_heat             ;f_heat=1?
       goto      off_all_load              ;没有的话,则关闭所有负载.   
       movlw    0
       xorwf     ten_sec_test,W
       btfss      STATUS,Z                  ;有延时功能吗?
       goto       isr_out_last               ;是的,则退出中断子程序
       movlw    0x03                       ;没有,则直接方波驱动:Frelay=4kHZ  
       xorwf     GPIO,f
       goto       isr_out_last
off_all_load:
       bcf        GPIO,relay1
       bcf        GPIO,relay2
isr_out_last:
       swapf    status_bak,W            ;用SWAPF才不会影响标志位
       movwf    STATUS  
       swapf    acc_bak,F
       swapf    acc_bak,W   
       RETFIE   
other_int:
       btfss    INTCON,INTE               ;测试是否外部中断允许
       goto     isr_out_last                 ;INTE=0,不可能是外部中断进入,退出中断子程序
       btfss    INTCON,INTF                ;测试是否外部中断
       goto     isr_out_last                 ;非外部中断,退出中断子程序
       bcf       INTCON,INTF               
       incf      zero_n                          ;脉冲次数加一
       btfsc    temp,f_start                 ;f_start为0吗?
       goto     isr_out_last
       bsf       temp,f_start                  ;不是,则置流量信号有的标志位(f_start=1)      
       clrf       t_4ms
       goto     isr_out_last


        goto     main

相关帖子

沙发
Ryanhsiung| | 2012-4-23 18:53 | 只看该作者
汇编看不懂,也不想看!问题也没有描述清楚!
   注意:进入中断第一步就要把TXCONbits.TXON=0,否则TIMER还在跑!

使用特权

评论回复
板凳
hopewise|  楼主 | 2012-4-23 19:22 | 只看该作者
之前是用合泰HT46R47编程的,用到4MHZ外部晶振,来测量外部脉冲,主周期是1ms,每隔200个主周期(即0.2s)来检测外部脉冲,结果非常理想,因老板用改用PIC12F675,因之前几乎没编过PIC程序,准备从合泰改编程pic(用到它的内部4MHZ),发现如下几个问题:
1.定时0中断不准确.
   我原先设定是每隔125us中断一次,并输出4KHZ方波.
   实际是4.6KHZ多些儿,问题出在哪里?
   备注:
      当我把付给TMRO的值从0x85改为0X74时,可以输出4KHZ方波,但环镜变化一点,它又变为4.1KHZ.
2.外中断不工作
   好像我写的中断设置对的,但为何不工作?
   我这里没有PIC仿真器,烧写一下,看结果怎样来调试程续.
请高手帮忙解答一下,Thanks.

使用特权

评论回复
地板
lyjian| | 2012-4-23 19:46 | 只看该作者
不知道该怎么说你好,RC振荡能和晶振比吗?
RC振荡频率和工作电压、温度都是有关系的。
还有,12F675内部的RC振荡出厂前都是有校准的,要准的话你要把校准值写到OSCCAL寄存器里。

使用特权

评论回复
5
NE5532| | 2012-4-23 20:11 | 只看该作者
1.内部RC精度不高,2%-5%的精度,说清楚自己需要多高,再选时钟方案。
2.注意核对相关寄存器设置,特别是操作寄存器时候页面对不对。

使用特权

评论回复
6
hopewise|  楼主 | 2012-4-24 09:19 | 只看该作者
多谢上面几位高手,但内部4MHZ RC晶振应没问题.之前我用合泰HT48R066也是内部4MHZ RC晶振,从来没有定时器中断不准的问题.
     我上面的关于中断设置,只有在初始化和中断里才有的.
     问个问题:
     我想每隔125us中断一次,除了初始化要设置外,定时中断子程序也应给tmer0付给一个初值,对吗?看它的规格书,它好像没提到这点.

使用特权

评论回复
7
lyjian| | 2012-4-24 12:28 | 只看该作者
定时中断子程序也应给tmer0付给一个初值

使用特权

评论回复
8
hopewise|  楼主 | 2012-4-24 13:07 | 只看该作者
也给了,但找不出问题.

使用特权

评论回复
9
gtekled| | 2012-4-24 15:59 | 只看该作者
来学习下,虽然不能完全看懂,但我用心看了!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

468

帖子

3

粉丝