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
分频器, 是定时器的基本功能, 不应该有问题。 建议找个调试器检查一下寄存器的值? ...
谢谢,第一次进入的时候是对的,进到中断以后好像就不对了 不对是差了多少?看来是中断服务的问题哦 airwill 发表于 2019-11-19 21:31
不对是差了多少?看来是中断服务的问题哦
确实是中断函数有问题,需要通过“TCA0.SINGLE.INTFLAGS=1;”这句话把中断标志位清零,谢谢。
页:
[1]