打印
[AVR单片机]

ATTINY817定时器预分频失效

[复制链接]
665|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jasonkong|  楼主 | 2019-11-18 21:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
unsigned int a=0;
unsigned int b=0;
unsigned int c=0;
unsigned int d=0;
int main(void)
{
        _PROTECTED_WRITE(CLKCTRL_MCLKCTRLB, (CLKCTRL_PDIV_16X_gc | CLKCTRL_PEN_bm));//16分频
        PORTB_DIRSET|=(1<<4);//PB4设置为输出
        //PORTB_OUTCLR|=(1<<4);//PB4输出低电平
        TCA0.SINGLE.PER = 0xFFFF; /* Period: 0xffff 周期和它无关??*/
        TCA0.SINGLE.CNTH = 0; /* Count: 0x0 */
        TCA0.SINGLE.CNTL=0xFF;
        TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV16_gc | 1 << TCA_SINGLE_ENABLE_bp; /* Module Enable: disabled */
        TCA0.SINGLE.INTCTRL=1 << TCA_SINGLE_OVF_bp;//中断使能
        sei();
       
    while (1)
    {
    }
}
ISR (TCA0_OVF_vect)//中断函数
{
        a++;
        TCA0.SINGLE.CNTH = 0; /* Count: 0x0 */
        TCA0.SINGLE.CNTL=0xFF;
        d=TCA0.SINGLE.CNT ;
        if (a<=1000)
        {
                PORTB_OUTCLR|=(1<<4);//PB4输出低电平
        }
        else if(a>1000 && a<2000)
        {
                //a=0;
                PORTB_OUTSET|=(1<<4);//PB4输出高电平
        }
        else a=0;   
}
以上是ATTINY817的代码,现在不论怎么改TCA0.SINGLE.CTRLA寄存器中的TCA_SINGLE_CLKSEL_DIV16_gc还是改TCA0.SINGLE.CNTH和TCA0.SINGLE.CNTL都改变不了定时时间呢?哪位大神帮忙看看,多谢了,困扰我两周了。

使用特权

评论回复

相关帖子

沙发
airwill| | 2019-11-18 21:35 | 只看该作者
分频器, 是定时器的基本功能, 不应该有问题。 建议找个调试器检查一下寄存器的值?

使用特权

评论回复
板凳
jasonkong|  楼主 | 2019-11-18 21:43 | 只看该作者
airwill 发表于 2019-11-18 21:35
分频器, 是定时器的基本功能, 不应该有问题。 建议找个调试器检查一下寄存器的值? ...

谢谢,第一次进入的时候是对的,进到中断以后好像就不对了

使用特权

评论回复
地板
airwill| | 2019-11-19 21:31 | 只看该作者
不对是差了多少?  看来是中断服务的问题哦

使用特权

评论回复
5
jasonkong|  楼主 | 2019-11-20 21:11 | 只看该作者
airwill 发表于 2019-11-19 21:31
不对是差了多少?  看来是中断服务的问题哦

确实是中断函数有问题,需要通过“TCA0.SINGLE.INTFLAGS=1;”这句话把中断标志位清零,谢谢。

使用特权

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

本版积分规则

1

主题

3

帖子

0

粉丝