whimsyB 发表于 2013-6-9 15:12:45

请教:lgt8f08a,TIME1工作在CTC模式下,二次启动定时器异常

我现在的故障现象是:
8MHz晶振,用于产生125KHz,Time1设置如下

void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0x0; //setup
TCNT1L = 0x0;
OCR1AH = 0x00;
OCR1AL = 0x1F;
OCR1BH = 0x00;
OCR1BL = 0x1F;
ICR1H= 0x00;
ICR1L= 0x1F;
TCCR1A = 0x50;
TCCR1B = 0x09; //start Timer
}

T1启动后,OC1A,OC1B能正常输出我要的125KHz信号,我中途随机停止T1
TCCR1B = 0;
再次启动定时器时,之前停止T1的时候,TCNT的值不确定,需要对定时器的计数器进行清除
TCNT1H=0;
TCNT1L=0;
TCCR1B = 0x09; //start Timer

这时发现,OC1A,OC1B就不能输出波形了
如果不修改TCNT的值,直接启动定时器就没这问题



whimsyB 发表于 2013-6-9 15:20:10

Mega48下,类似的功能代码,修改TCNT1的值,定时器都是没问题的,都能达到预期的效果

jianghu-00091 发表于 2013-7-23 18:21:17

试了一下你的程序 完全没问题的。 你相应的端口设为输出了么?

whimsyB 发表于 2013-7-24 01:50:51

本帖最后由 whimsyB 于 2013-7-24 01:52 编辑

jianghu-00091 发表于 2013-7-23 18:21 static/image/common/back.gif
试了一下你的程序 完全没问题的。 你相应的端口设为输出了么?

端口在程序的开始肯定是设置为输出了,关闭定时器,我没有改变端口的模式,按道理重新开启定时器就可以延续之前的输出模式

难不成关闭后,要重新配置端口? 不知道你的测试,是否在关闭后有重新配置端口? 我也自己测试下重新配置端口看是否有效果

你是否测试过重新:TCNT1H=0;TCNT1L=0;清空计数器

jianghu-00091 发表于 2013-7-24 10:24:23

whimsyB 发表于 2013-7-24 01:50 static/image/common/back.gif
端口在程序的开始肯定是设置为输出了,关闭定时器,我没有改变端口的模式,按道理重新开启定时器就可以延 ...

我就在一开始设置的端口后面就没变过下面是我的程序就是照你的程序写的
void timer1_init(void)
{
        TCCR1B = 0x00; //stop
        TCNT1H = 0x0; //setup
        TCNT1L = 0x0;
        OCR1AH = 0x00;
        OCR1AL = 0x1F;
        OCR1BH = 0x00;
        OCR1BL = 0x1F;
        ICR1H= 0x00;
        ICR1L= 0x1F;
        TCCR1A = 0x50;
        TCCR1B = 0x09; //start Timer
        DDRD |= 0x30;
}

int main(void)
{
       timer1_init();
       while(1)
                {
                        Delay_ms(300);
                        TCCR1B = 0;
                        Delay_ms(300);
                       
                        TCNT1H = 0;
                        TCNT1L = 0;
                        TCCR1B = 0x09;
                }
}
页: [1]
查看完整版本: 请教:lgt8f08a,TIME1工作在CTC模式下,二次启动定时器异常