历史上的今天
返回首页

历史上的今天

今天是:2024年11月16日(星期六)

2019年11月16日 | pic16f887 TMR0计时器讲解及准确定时程序

2019-11-16 来源:51hei

一、前言

TMR0 计时器

实际上 TMR0 计时器的应用很广。很少程式不用到它。它非常方便,而且很容易用来撰写产生任意期 间的脉冲的程式或副程式(subroutine)、测量时间,或是计数外部脉冲 (事件),几乎没有什么限制。

TMR0 计时器模组是 8 位元的计时器/计数器,具有下列特性:

● 8 位元计时器/计数器;

● 8 位元 prescaler (与 Watchdog timer 共享);

● 可程式的内部或外部时脉来源 (Programmable internal or external clock sources);

● 溢位中断 (Interrupt on overflow); 及

● 可程式选择的外部时脉边缘 (Programmable external clock edge selection)。


二、原理与暂存器设定说明

原理:

OPTION_REG 暂存器

1.002.jpg?imageView2/2/w/550

1.003.jpg?imageView2/2/w/550

1.004.jpg?imageView2/2/w/550


1.005.jpg?imageView2/2/w/550

1.006.jpg?imageView2/2/w/550

可以看出,PSA 位元的逻辑状态决定 prescaler 指派给 TMR0 或是 watchdog timer。

另外,值得一提的是:

● 当 prescaler 指派给 TMR0 时,任何对 TMR0 暂存器的写入动作将会清除 prescaler;

● 当 prescaler 指派给 watchdog timer 时,CLRWDT 指令将同时清除 prescaler 与 WDT;

● 当 TMR0 作为计时器用时,对 TMR0 的写入动作不会让脉冲计数立即开始,而会有两个指令周期 的延迟。因此,有必要调整写到TMR0 的值;

● 当微控制器被设成睡眠模式时,振荡器便会关闭。因为没得计数脉冲,所以就不会发生溢位 (overflow)。这就是为什么 TMR0 溢位不能将微控制器从睡眠模式中唤醒的原因;

● 当用作不含 prescaler 的外部时脉计数器时 (external clock counter),最小的脉冲长度或两个脉 冲之间的间歇必须是 2 Tosc + 20 nS. Tosc 是振荡讯号周期 (oscillator signal period);

● 当用作含 presacler 的外部计数器时,最小的脉冲长度或两个脉冲之间的间歇必须是 10nS;

● 8 位元 prescaler 暂存器不提供给使用者,这表示不能直接读写 prescaler 暂存器;

当从 TMR0 将 prescaler 指派给 watchdog timer 时,必须按下列指令次序执行以免发生重置 (reset):

view source    print?

01 BANKSEL TMR0   02 CLRWDT ;CLEAR WDT   03 CLRF TMR0 ;CLEAR TMR0 AND PRESCALER    04 BANKSEL OPTION_REG   05 BSF OPTION_REG,PSA ;PRESCALER IS ASSIGNED TO THE WDT        06 CLRWDT ;CLEAR WDT   07 MOVLW b’11111000’ ;SELECT BITS PS2,PS1,PS0 AND CLEAR      08 ANDWF OPTION_REG,W ;THEM BY INSTRUCTION “LOGICAL AND”  09 IORLW b’00000101’ ;BITS PS2, PS1, AND PS0 SET        10 MOVWF OPTION_REG ;PRESCALER RATE TO 1:32

● 同样的,当从 WDT 将 prescaler 指派给 TMR0 时,必须按下列指令次序执行以免发生重置:

view source    print?     1 BANKSEL TMR0   2 CLRWDT ;CLEAR WDT AND PRESCALER      3 BANKSEL OPTION_REG

4 MOVLW b’11110000’ ;SELECT ONLY BITS PSA,PS2,PS1,PS0               5 ANDWF OPTION_REG,W ;CLEAR THEM AFTERWARDS BY INSTRUCTION 6 ;“LOGICAL AND”         7 IORLW b’00000011’ ;PRESCALER RATE IS 1:16    8 MOVWF OPTION_REG

暂存器设定说明:

为了恰当地使用 TMR0,必须:

1、要选择模式:

● 计时器模式是借由 OPTION_REG 暂存器的 T0CS 来选择。 (T0CS: 0=timer, 1=counter);

● 使用的时候,必须借由清除 OPTION_REG 暂存器的 PSA 位元将 prescaler 指派给 TMR0。 prescaler 比率 (Prescaler rate) 的设定是透过OPTION_REG 暂存器的 PS2-PS0 位元,及

● 使用中断时,必须设定 INTCON 暂存器的 GIE 与 TMR0IE 位元。

2、要测量时间:

● 重设 TMR0 暂存器或写入已知的值到 TMR0;

● 经过时间 (单位是毫秒,当使用 4 MHz 石英晶体时) 的获得方式是透过读取 TMR0 暂存器

● 每当 TMR0 暂存器溢位时,INTCON 暂存器的 TMR0IF 旗号便会自动竖起来,如果中断有启用, 会引发中断。

3、要计数脉冲:

● 位于 RA4 脚位,要计数的脉冲极性 (polarity) 的选择是透过设定 OPTION_REG 暂存器的 T0SE 位元 (T0SE: 0=负向缘, 1=正向缘); 及

● 脉冲数可从 TMR0 暂存器中取得。如同计时器模式,presacler 和中断的用法是一样的。


三、程式与电路图

程式:

// FOSC=16MHz  Fcy=4Mhz  Tcy=1/Fcy

#include

__CONFIG ( FOSC_HS & WDTE_OFF & PWRTE_OFF & MCLRE_ON & CP_OFF & CPD_OFF &  BOREN_OFF &     IESO_OFF  &  FCMEN_OFF & LVP_OFF ); //配置位元设置为外接晶振

__CONFIG ( BOR4V_BOR40V & WRT_OFF );

unsigned char data=0;//定义变数data并赋值为0

main()

{  

unsigned  int i=0;//定义i为无符号整形并赋值为0

   T0CS=0;   // 选通Fosc/4

   PSA=0;    //设定为用TIMER0,而不是WDT

   PS2=0; //1:16 预除4倍,数完250次=(4MHz/1)*250=1ms

   PS1=1;//PS2,PS1,PS0为除频设置

PS0=1;

   T0IF=0;//设置溢位初始值为0

   TMR0=6; //预设TMR0=6,运行250次会进位

TRISD=0;// 埠初始化D0--D7设置为输出

PORTD=0; //D埠输出低电频,8个LED全灭掉

data=0b00000001;//data赋值为1

   while(1)       // 主回圈必须是闭环

{

      if(T0IF==1)//如果溢位为1则执行if下语句

{

           T0IF=0;    //if成立将溢位再次置0

           i++;         //i=i+1

            if(i==1000)   //i=1000时执行下面语句

{

                    i=0;    //i重新置0,进行下一轮计时

data=data<<1;   //data左移1位

if(data==0)   //如果data=0时执行下面语句

data=0b00000001;   //data重新置为1

                       PORTD=data;  //D埠输出资料为data

                       TMR0=6;//使TMR0等于6

              }

         }

   }

}




电路图:


1.007.jpg?imageView2/2/w/550 四、结论

1.008.jpg?imageView2/2/w/550



1.009.jpg?imageView2/2/w/550

1.010.jpg?imageView2/2/w/550

1.011.jpg?imageView2/2/w/550

1.012.jpg?imageView2/2/w/550

1.013.jpg?imageView2/2/w/550

1.014.jpg?imageView2/2/w/550



1.015.jpg?imageView2/2/w/550


推荐阅读

史海拾趣

Corporation Soneet公司的发展小趣事

然而,随着市场竞争的加剧,Soneet也面临着来自同行的挑战。为了应对这些挑战,Soneet不断加强研发投入,提升技术创新能力。同时,公司还通过优化生产流程、降低成本等方式,提高产品的竞争力。这些措施使得Soneet能够在激烈的市场竞争中保持领先地位。

Gamma Microelectronics ( APM )公司的发展小趣事

为了进一步满足市场需求,G24i在英国威尔士卡迪夫建成了世界上第一条25MW的大规模生产基于钛衬底的DSSC基地。这一基地的建成标志着G24i在DSSC领域实现了从研发到生产的全链条覆盖。大规模生产不仅降低了产品的制造成本,也提高了生产效率和质量稳定性。G24i通过不断优化生产流程和提升管理水平,确保了产品的市场竞争力。

Dell公司的发展小趣事

G24i的成立可以追溯到2006年,它自称是世界上首家生产商业化应用等级DSSC的公司。公司的技术根基源自瑞士洛桑联邦理工学院的M. Gratzel团队,该团队是DSSC技术的先驱。G24i由美国Kanorka Technologies公司投资,而Kanorka则得到了美国军方的资助。这一强大的技术背景为G24i的商业化之路奠定了坚实的基础。公司成立后不久,便致力于将实验室级别的DSSC技术推向市场,开启了其商业化探索的征程。

AC Interface Inc公司的发展小趣事

随着国内市场的饱和,ABC Electronics Inc. 开始寻求国际化的发展道路。公司首先在欧洲设立了分支机构,通过参加国际电子展会、与欧洲企业建立合作伙伴关系等方式,逐步打开了欧洲市场。随后,公司又进军北美和亚洲市场,通过本地化运营和定制化服务,满足了不同国家和地区的需求。这一国际化战略不仅拓展了公司的市场份额,也提升了其品牌影响力。

BSI公司的发展小趣事

在全球化的背景下,电子行业的国际合作日益加强。BSI作为国际标准化组织的重要成员,积极推动了电子行业的国际合作和交流。通过组织国际会议、研讨会等活动,BSI为各国政府、行业协会和企业提供了一个交流和合作的平台。这些活动不仅促进了电子行业的国际合作和交流,还推动了电子行业的全球化发展。

虽然以上并非具体的发展故事,但通过这些描述,可以看出BSI在电子行业发展中扮演了重要角色,通过标准制定、产品测试与认证、推动绿色发展、支持技术创新以及促进国际合作等方式,为电子行业的健康发展做出了积极贡献。如需更多关于BSI公司具体发展故事的信息,建议查阅公司官方发布的资料或相关新闻报道。

Capital Advanced Technologies公司的发展小趣事

品质管理是CAT发展的重要保障。公司建立了严格的质量管理体系,从原材料采购到产品制造、检验、包装等各个环节都进行严格的品质控制。CAT还注重与客户的沟通与协作,及时了解客户需求,为客户提供个性化的解决方案和优质的售后服务。这些举措使得CAT赢得了客户的广泛信赖和长期合作。

问答坊 | AI 解惑

matlab第三课

数组与矩阵运算 这是今天讨论的重点!…

查看全部问答>

定制的win ce 5.0 COM1不能输出调试信息,请问这是怎么回事。

我也使用RETAILMSG函数在驱动中添加调试信息,但同样没有调试信息输出。 我修改过WINCE500\\PLATFORM\\smdk2440\\KERNEL\\HAL目录下的debug.c文件中的“NODEBUG”我也修改为0了。 #define                ...…

查看全部问答>

一道汇编题?

25. 内存地址是0000H,若有4KB的存储空间,其内存的最终地址是(  ). A.400H        B.FFFH         C.4FFH      D.1000H 答案是什么?为什么?请高手 ...…

查看全部问答>

北京佳能诚聘c/c++嵌入式开发人员!

公司:佳能 职位:研发工程师 语言:c/c++ 平台:WINCE 经验:3年以上 地点:北京 有意向者,请速联系 msn:mygy2006@hotmail.com 13910500391…

查看全部问答>

wince4.2如何调用软键盘

我装了wince4.2 再装了EVC4.0 后来装了STANDARD_SDK.msi 写了个简单的hello程序 想调用SIP 头文件包含了#include \"sipapi.h\" 工程里添加了连接coredll.lib,调用SipShowIM(SIPF_ON); 怎么就是编译不过去 提示如下 Mystest.obj : error LNK2019: ...…

查看全部问答>

ARM入门

我刚开始上班,好多东西都不懂,经理把板子给我了.让我自己弄. 问其他同事,他们都说忙,好郁闷呀! 主机,ARM开发板,uC OS/II,ADS1.2集成开发环境,JTAG仿真器.都有了. 我下一步该做什么. 是不是安装uC OS/II,然后在上面编程序. 我以前从来没有接触 ...…

查看全部问答>

力科公司确立其在示波器领域的绝对领导地位

力科公司确立其在示波器领域的绝对领导地位…

查看全部问答>

有哪位大侠有功仙童的KA5L0380?

最近再调一块电源板,是用变压器原边反馈方式,基本电路是仿造TOP系列的应用电路,但是反馈就是不行,输出为0,芯片没有启动,测所有电压脚都是在正常范围内?论坛哪位仁兄做过这种方式的电路?…

查看全部问答>

用团购模拟芯片DIY LCR自平衡电桥【不定期不定时更新】

准备使用 这次的团购的运放 基准源 ADC做一个LCR电桥。 写此帖的目的: 1,正好有活动,能比较低的价格买到芯片,买了芯片之后手痒就做点东西; 2,做东西的时候顺便学些东西; 3,做的过程中肯定会碰到很多问题,希望得到各位大大的帮助; 4 ...…

查看全部问答>

DA5571的用法

在msp430F149中十年没有DA模块的,所以想求助各位大神有没有用DA5571的,想问问这个芯片的用法和怎么模拟I2c时钟,如果有代码解析更好,谢谢啦…

查看全部问答>