yorkwilliam 发表于 2006-11-24 22:32:55

求教[马老师讲义第8章例8.3]:使用定时器0中断实现N分频的原理是什么?

马老师好:

    我在做您编写的讲义第8章《8位计数器的应用》上的例8.3“N分频系统设计”时遇到了不明白的地方,特向您请教。

    该例程采用定时器0的普通方式和CTC(比较匹配时清零定时器)方式结合的办法来对外部输入的脉冲进行任意频率的分频(当然分频也是有范围的)。

    要求是进行5分频,程序中有如下一段定义:

    TCNT0=0xFB;   //设置T/R寄存器值

    OCR0=0xFD;    //设置OCR0的比较值,>TCNT0 的初始值,<0xFF

    我的理解是在外部脉冲作用下,TCNT0加1,直到和OCR0相等,则进入比较匹配中断服务程序;而后TCNT0继续在外部脉冲条件下加1,直到加到0x00时进入溢出中断服务程序。(在中断服务程序中设置输出电平高低以控制输出波形)。

    我的疑问是:当TCNT0和OCR0相匹配时,按照器件手册上的说法,似乎应该是将TCNT0清0了,如果确实是这样,那在执行完比较匹配中断服务程序后TCNT0又怎么能够溢出呢?程序不是永远执行不了溢出中断服务程序了吗?

    这个疑问百思不得其解,望老师赐教!不胜感激!

machao 发表于 2006-11-27 02:07:38

你还没有彻底了解T/C0的工作方式。

在例8.3中采用的是T/C0工作方式为普通模式(不可能同时还工作在CTC方式的),结合比较匹配中断实现的。



当TCNT0与与OCR0相等时,T/C0不会清另(不是CTC方式),但会进入比较匹配中断服务的。



理解了这个例子,就容易知道利用T/C如何实现PWM了。



下面是T/C0的初始化代码,你怎么要漏掉一句呢?



// T/C0 初始化

TCCR0=0x07;                        // T/C0工作于普通模式,T0上升沿触发

TCNT0=0xFB;

OCR0=0xFD;                        // 设置OCR0的比较值,>TCNT0的初始值,<0xFF

yorkwilliam 发表于 2006-11-27 23:40:29

呵呵,太谢谢马老师了。我对T/C0的工作方式确实没有真正理解。

    一语值千金啊,让我茅塞顿开:)

    再次诚挚感谢马老师的悉心指导*_*
-----此内容被yorkwilliam于2006-11-27,23:44:14编辑过

linglong 发表于 2010-2-5 10:19:02

马老师你好,我还是不明白你怎么计算出是5分频的,谢谢
页: [1]
查看完整版本: 求教[马老师讲义第8章例8.3]:使用定时器0中断实现N分频的原理是什么?