打印
[AVR单片机]

将ATMEGA128的定时器1TCNT1软件清零,PWM输出异常。。。。

[复制链接]
1924|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hm_315|  楼主 | 2014-8-29 11:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hm_315 于 2014-8-29 12:03 编辑

如题,由于设计需要,在外部中断3的中断服务程序中,我会将定时器1的技术器TCNT1清零,实现简单的锁相功能。

定时器1初始化:
上升沿匹配置位,下降沿匹配清零;
选择为相位和频率修正模式,TOP值由ICR指定;
但是定时器1的所有中断都没有使能!
void PWM_Init(void)
{
    //端口输出在上升匹配时置位,在下降匹配时清零
    //同时配合TCCR1B选择工作方式为相频修正PWM,TOP值由ICR1指定。
    //OCR1A/B/C值在BOTTOM时更新,TOV溢出在BOTTOM处
   
    TCCR1A=0xFC;    //1111 1100
    //无预分频,配合TCCR1B选择工作方式为相频修正PWM。
    TCCR1B=0x11;    //0001 0001
    TCCR1C=0x00;
    TCNT1=0x0000;
   

    TIMSK=0x00;
    ETIMSK=0x00;
   
    ICR1=1000;
}

外部中断3的中断服务函数(上升沿):
ISR(SIG_INTERRUPT3)
{
    uchar sreg;                                                                              //保存全局中断寄存器
    sreg=SREG;

     TCNT1=0x0000;
      
    SREG=sreg;                                                                                            //还原全局中断寄存器
}

但是这时就出现了问题,只要外部中断工作,将TCNT1清零,定时器T1的输出引脚上(OC1A/OC1B/OC1C)上就会出现波形(T1所有中断都没有使能,连中断函数都没有写!),波形的时间也为时间中断时间,这里是125us。。。。

很奇怪啊,大家有没有遇到这样的问题呢?求解啊

相关帖子

沙发
hm_315|  楼主 | 2014-8-29 12:03 | 只看该作者
@airwill    版主求解。。。

使用特权

评论回复
板凳
wangch_sh| | 2014-8-29 13:22 | 只看该作者
PWM波用到定时器1了吧?

使用特权

评论回复
地板
hm_315|  楼主 | 2014-8-29 15:12 | 只看该作者
wangch_sh 发表于 2014-8-29 13:22
PWM波用到定时器1了吧?

恩,是的,PWM用到了定时器1。定时器1的设置如上面所述的代码所示。我上电就初始化定时器1,但是整个程序都没有响应定时器的中断(下溢中断、匹配中断等),但是它的那个计数器TCNT1是一直在递增然后递减。我期待的功能是在我外面的中断响应时,则将定时器1的计数器TCNT1置零,那么发出的PWM波就和外部同步。然后后面就遇到上面的问题。

使用特权

评论回复
5
airwill| | 2014-8-29 19:37 | 只看该作者
所以啊, 我很不建议随意在软件中修改 TCNT, 以及禁止定时器的操作.
因为多次在一些单片机中发现, 这类操作会触发一些奇怪的中断或标志. 而且这些特性往往手册没有说清楚.

比如仅仅提到, 初始化定时器后, 要清除一次中断标志, 再开启中断允许位, 至于什么原因导致的, 却没有描述.

使用特权

评论回复
6
hm_315|  楼主 | 2014-9-1 09:23 | 只看该作者
airwill 发表于 2014-8-29 19:37
所以啊, 我很不建议随意在软件中修改 TCNT, 以及禁止定时器的操作.
因为多次在一些单片机中发现, 这类操作 ...

哦,原来单片机还有这样的问题,真是始料未及啊。。
我按照你第3段的提示,就是先关中断,清标志位,使能中断,还是依旧出现问题。
今天我尝试下,将PWM的生成方式改为“在TOP中断更新,在BOTTOM中断下溢中断”,暂时还没有出现之前的问题。不知道后面的工作能不能行,但是还是谢谢版主了!

使用特权

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

本版积分规则

10

主题

35

帖子

0

粉丝