本帖最后由 sky_假装 于 2010-9-12 10:19 编辑
想用mega16做一个频率和占空比都可调的方波,频率为1K~10Khz(折算成周期是:100us~1000us),单片机外部晶振16M,输出管脚PD7(初始化输出高电平,程序中定义为PWM)。
小弟使用的方法是timer0比较中断,分频为1,比较中断出一个1us的中断,用一个变量int_time(16位无符号整型,初始值为0,每次进中断+1),然后去和两个标识符常量freq_h(16位无符号整型,表示方波周期里高电平所占时间,int_time加到等于freq_h时,PD7=0)和freq_time(16位无符号整型,表示方波周期,int_time加到等于freq_time时,PD7=1,把int_time也重新置零)匹配,改变PD7的输出,设置和中断代码如下:
void init_timer()
{
TCCR0 = 0x00;//停止定时器
TCNT0 = 0x00;//初始值
OCR0 = 0x07;//匹配值
TIMSK |= 0x02;//中断允许
TCCR0 = 0x09;//启动定时器
SREG |= 0x80;
}
//T0比较中断服务程序
#pragma vector = TIMER0_COMP_vect
__interrupt void timer0_int(void)
{
int_time++;
if(int_time==freq_h)
{
PWM = 0;
}
if(int_time==freq_time)
{
PWM = 1;
int_time = 0;
}
}
现在的情况是,hex文件放到proteus里面仿真,输出的方波频率(预置5555hz)只有1200hz差不多,会不会是我的中断里面东西太多了,执行中断里面的东西花了太长时间,以至于输出周期变大,频率变小?主程序的while(1)里面什么都没有的,是空的。
另外以前做东西有个疑问,以前有看到说,delay函数(就是那种用for,或者while的直接i--的那种)执行的时候,cpu是满载的,这样子的话,如果单片机里面还有定时中断,会导致定时中断变得不准?那我想再问一下,如果一方面要用动态扫描显示led数码管(一般动态扫描不是都会用到delay的嘛),另一方面要开定时器中断,遇到这种情况怎么办?
刚学avr单片机,第一次发帖,不知道描述清楚了没有,请大家帮忙啊 |