leonid 发表于 2009-4-23 10:35:24

今天遇到一个很奇怪的问题,有没有高手能解答解答

M128的定时器有点蒙我了 , 时间减半!!!
void timer0_init(void)
{
        TCCR0= 0x00;//停止定时器
        TCNT0= 0x06;//初始值 //16M 1ms
        OCR0   = 0x05;//匹配值
        TIMSK |= 0x01;//中断允许
        TCCR0= 0x03;//启动定时器//64分频
       
       
}

SIGNAL(SIG_OVERFLOW0)                //全局中断禁止,不允许中断嵌套.
        {
        TCNT0= 0x06;//初始值 1ms 定时 系统时钟 16M
        OCR0   = 0x05;//匹配值
        Timer_kick++;   //系统定时节拍
        MilionSecond_kick++;
        PORTA ^=0x01; //IO 测量
       
        if(MilionSecond_kick>2000)//????
        {
                Second_kick++;
                Second_cnt++;
                MilionSecond_kick = 0;
        }
}

在IO测量处测出频率是 1K ,按道理这里应该测出0.5K才对 ,MilionSecond_kick 要记到 2000才得到1S的定时 16M的系统时钟,64分频。


void timer3_init(void)
{
        TCCR3B = 0x00;//停止定时器
        ETIMSK |= 0x04;//中断允许
        TCNT3H = 0xFF;
        TCNT3L = 0xF0;//初始值 16M --> 10us
        OCR3AH = 0xFF;
        OCR3AL = 0xFF;//匹配A值
        OCR3BH = 0xFF;
        OCR3BL = 0xFF;//匹配B值
        ICR3H= 0xFF;
        ICR3L= 0xFF;//输入捕捉匹配值
        TCCR3A = 0x00;
        TCCR3B = 0x02;//启动定时器 8分频
}

       
SIGNAL(SIG_OVERFLOW3)                //全局中断禁止,不允许中断嵌套.
        {//10us
        TCNT3H = 0xff;
        TCNT3L = 0xf0;//初始值
        LoadSuplyTimer++;
                PORTA ^=0x04;       
       
       
        }
这个时钟却是准确的,百思不得其解!请教高手

machao 发表于 2009-4-23 11:20:32

//TIMER0 initialize - prescale:64
// WGM: Normal
// desired value: 1mSec
// actual value:1.000mSec (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
ASSR= 0x00; //set async mode
TCNT0 = 0x06; //set count
OCR0= 0xFA;
TCCR0 = 0x04; //start timer
}
页: [1]
查看完整版本: 今天遇到一个很奇怪的问题,有没有高手能解答解答