patli 发表于 2012-12-2 21:27:49

M8想定时1微秒是不是很难呀?附上两个例子。

期望产生一个1s的方波,让PD0口的小灯0.5秒闪烁一次,实测后发现4.41秒闪一次。但是使用8分频产生1毫秒就没有问题。

以下为错误的代码:#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>

volatile uint16_t count0 = 0;

void port_init(void)
{
    DDRD = 0xFF;//输出
    PORTD = 0x00;
}

void T0_init(void)
{
    TCCR0 |= (1<<CS00); // 不分频,1M内部晶振
    TCNT0= 0xFF; //1微秒后溢出
    TIMSK |= (1<<TOIE0);// 使能T/C0中断
    SREG|= 0x80;//全局全局中断
}


int main(void)
{
    port_init();
    T0_init();

    while(1)
    {
    }
}

ISR (TIMER0_OVF_vect)
{
    //(256-TCNT0)/1M = 1us,TCNT0 = 0xFF
    TCNT0= 0xFF;
    count0++;

    if (count0 >= 50000) //50毫秒
    {
      count0 = 0;
      PORTD ^= (1<<PD0);
    }
}
以下为正确的代码:/* 1M RC, 定时500ms
* T0, T1
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <inttypes.h>

volatile uint16_t count0 = 0,count2 = 0;

void port_init(void)
{
    DDRD = 0xFF;//输出
    PORTD = 0x00;
}

void T0_init(void)
{
    TCCR0 |= (1<<CS01); // 8分频,1M
    TCNT0= 0x83;
    TIMSK |= (1<<TOIE0);// 使能T/C0中断
    SREG|= 0x80;//全局全局中断
}

void T2_init(void)
{
    TCCR2 |= (1<<CS21); // 8分频,1M
    TCNT2= 0x83;
    TIMSK |= (1<<TOIE2);// 使能T/C2中断
    SREG|= 0x80;//全局全局中断
}

int main(void)
{
    port_init();
    T0_init();
    T2_init();

    while(1)
    {
    }
}

ISR (TIMER0_OVF_vect)
{
    //(256-TCNT0)*8/1M = 1ms,TCNT0 = 0x83
    TCNT0= 0x83;
    count0++;

    if (count0 >= 500)
    {
      count0 = 0;
      PORTD ^= (1<<PD0);
    }
}

ISR (TIMER2_OVF_vect)
{
    //(256-TCNT0)*8/1M = 1ms, TCNT2 = 0x83
    TCNT2= 0x83;
    count2++;

    if (count2 >= 500)
    {
      count2 = 0;
      PORTD ^= (1<<PD1);
    }
}

little_Monkey 发表于 2012-12-2 21:41:52

1M的时钟,一个周期就是1us,还要入栈出栈怎么算都不止1us了,你想累死M8啊

millwood0 发表于 2012-12-2 21:48:31

M8想定时1微秒是不是很难呀?

You simply have no idea what you are doing.

jimmy_xt 发表于 2012-12-2 21:53:15

你的实测表明,AVR对中断的处理效率还是蛮高的{:lol:}

zcx2012 发表于 2012-12-2 22:52:01

很容易做到的,

patli 发表于 2012-12-3 19:13:00

millwood0 发表于 2012-12-2 21:48 static/image/common/back.gif
You simply have no idea what you are doing.

我就是想写一个可以定义一个很小的时间量的函数,以后用起来方便些。
比如delay_us(1000)就可以延时1个毫秒。

现在的问题变成了:m8可以较精确的定义最小的时间量是多少呢?

JamesErik 发表于 2012-12-3 20:06:14

仿真调延时,或者定时器吧
页: [1]
查看完整版本: M8想定时1微秒是不是很难呀?附上两个例子。