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);
}
} 1M的时钟,一个周期就是1us,还要入栈出栈怎么算都不止1us了,你想累死M8啊 M8想定时1微秒是不是很难呀?
You simply have no idea what you are doing.
你的实测表明,AVR对中断的处理效率还是蛮高的{:lol:} 很容易做到的, 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可以较精确的定义最小的时间量是多少呢? 仿真调延时,或者定时器吧
页:
[1]