jasonkong 发表于 2019-11-18 21:29

ATTINY817定时器预分频失效

#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

不对是差了多少?看来是中断服务的问题哦

jasonkong 发表于 2019-11-20 21:11

airwill 发表于 2019-11-19 21:31
不对是差了多少?看来是中断服务的问题哦

确实是中断函数有问题,需要通过“TCA0.SINGLE.INTFLAGS=1;”这句话把中断标志位清零,谢谢。
页: [1]
查看完整版本: ATTINY817定时器预分频失效