资讯详情

IAR使用时报错处理与AVR精确延时

一、出现“IAR unknown or ambiguous symbol.main”

project==>options==>linker,format设置成debug。

IAR下必须进入DEBUG模式才能进行调试,如果不连接的话,断点也是不行的

二、处于调试状态,但是不能在C语言上单步运行,也不能设置断点

project==>options==>C/C++Compiler,将Generate debug information打上勾。

好了,废话不多说,不浪费中断的情况下的精确延时啊~~,当然是软件自带的单周期的空操作了~~,你懂得为什么,比如_nop_();(当然这个家伙是51单片机中用到的c程序,汇编就是nop;喽)

在IAR for AVR中的库函数#include"intrinsics.h"里面有个单周期的延时函数__delay_cycles();(相当于_nop_();),

如果__delay_cycles(100)就是100个mclk的周期延时。

然后就是下面的操作了:

1)建立一个.h文件,用Keilc51这个是必须懂得,我就不多解释了

2)输入代码:

#ifndef __delay_h #define __delay_h #include"intrinsics.h" #define xtal 8 //这里就是你要使用的晶振的频率(单位NHZ) #define delay_us(x) __delay_cycles((unsigned long)(x*xtal)) #define delay_ms(x) __delay_cycles((unsigned long)(x*xtal*1000)) #define delay_s(x) __delay_cycles((unsigned long)(x*xtal*1000000)) #endif

3)就是在你用到延时的函数里面调用#include"Delay.h"(这里是不区分大小写的,哈,不用担心这个)

这就在不浪费中断情况下的软件延时,当然你要非得精确,那非得定时不可了

补充一下:

我用的是IAR for AVR,别的软件什么的似乎也有延时函数,如果没有可以用下面的这个延时(听说也是相当准的,在8MHZ晶振下,不管是外接还是内部晶振,哈都一样):

//------------------------------------------------------------------------------ //延时函数 void delay_ms(uint k) { uint i,j; for(i=0;i for(j=0;j<1140;j++); }

还有一个:差点忘记(这个不知道是那个哥们想到的,也可以改变晶振的~~~都贴出来,反正没事干):

//------------------------------------------------------------------------------ //延时1ms的函数,没有参数传递 void delay_1ms() { uint i; for(i=1;i<(uint)(xtal*143-2);i++) ; } //------------------------------------------------------------------------------ //延时nms的函数,有参数传递 void delay_nms(uint n) { uint i=0; while(i { delay_1ms(); i++; } }

-电子元器件采购网(www.ruidan.com)是本土元器件目录分销商,采用“小批量、现货、样品”销售模式,致力于满足客户多型号、高质量、快速交付的采购需求。 自建高效智能仓储,拥有自营库存超过50,000种,提供一站式正品现货采购、个性化解决方案、选型替代等多元化服务。
锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台