avr-gcc中关于delay延时函数的应用

发布者:cwm6269310最新更新时间:2015-12-31 来源: eefocus关键字:avr  gcc  delay  延时函数 手机看文章 扫描二维码
随时随地手机看文章
       在51中我们的延时函数都是自己编写的,无论是在汇编中还是在C言语中。虽然有模板,有时还是有点烦。呵呵。不过在应用avr 单片机的时候我们就有福了。因为avr-gcc 提供给我们很方便的delay 延时函数, 只有在源文件包含:
#i nclude
就可以使用了。这个头文件定义了两个级别的延时函数分别是:
; 在51中我们的延时函数都是自己编写的
void _delay_us (double __us) ;      //微秒级
void _delay_ms (double __ms);    //毫秒级

sp;   
不过不可以高兴的太早,因为要在你的avr-gcc中正确使用它们是有条件的,下面我将慢慢道来。

这个参数和 Makefile 中的 F_CPU 值有关,Makefile 所定义的的F_CPU 变量的值会传递给编译器。你如果用AVR_studio 4.1X来编辑和调试,用内嵌AVR-GCC的进行编译,并且让AVR_studio 帮你自动生成Makefile 的话,那你可以在:
,无论是在汇编中还是在C言语中。虽然有模
                                           Project -> Configuration Options -> Gerneral -> Frequency   如下图:
; 在51中我们的延时函数都是自己编写的
写下你的F_CPU的值,F_CPU这个值表示你的AVR单片机的工作频率。单位是 Hz ,不是 MHZ,不要写错。如 7.3728M   则 F_CPU = 7372800 。
你会发现在"delay.h" 头文件中有这个样的一个定义如下:
#ifndef F_CPU; 在51中我们的延时函数都是自己编写的
# warning "F_CPU not defined for "
# define F_CPU 1000000UL    // 1MHz
#endif
板,有时还是有点烦。呵呵。不过在应用av
这是为了在你没有定义F_CPU这个变量(包括空),或是AVR_studio Frequency没有给值的时候,提供一个默认的 1MHz频率值。让编译器编译时不至于出错。

sp;   
下面是这两个函数的实体:
void _delay_us(double __us)        // 微秒
{; 在51中我们的延时函数都是自己编写的
uint8_t __ticks;
double __tmp = ((F_CPU) / 3e6) * __us;   // 3e6 是因为调用的_delay_loop_1()是三条指令的
if (__tmp < 1.0)   &nb
   __ticks = 1;
else if (__tmp > 255)
   __ticks = 0;; 在51中我们的延时函数都是自己编写的
else
   __ticks = (uint8_t)__tmp;
_delay_loop_1(__ticks);,无论是在汇编中还是在C言语中。虽然有模
}

void _delay_ms(double __ms)       // 毫秒板,有时还是有点烦。呵呵。不过在应用av
{
uint16_t __ticks;
double __tmp = ((F_CPU) / 4e3) * __ms; // 4e3 是因为调用的_delay_loop_2()是四条指令的   &nb

if (__tmp < 1.0)
   __ticks = 1;,无论是在汇编中还是在C言语中。虽然有模
else if (__tmp > 65535)
   __ticks = 0;
else; 在51中我们的延时函数都是自己编写的
   __ticks = (uint16_t)__tmp;
_delay_loop_2(__ticks);
}
,无论是在汇编中还是在C言语中。虽然有模
你会发现他们都分别调用了   _delay_loop_1(); 和_delay_loop_2(); 这两个函数
而这两个函数又如下所示:
void _delay_loop_1(uint8_t __count)板,有时还是有点烦。呵呵。不过在应用av
{
__asm__ volatile (
   "1: dec %0" " ",无论是在汇编中还是在C言语中。虽然有模
   "brne 1b"
   : "=r" (__count)
   : "0" (__count)sp;   
);
}
void _delay_loop_2(uint16_t __count),无论是在汇编中还是在C言语中。虽然有模
{
__asm__ volatile (
   "1: sbiw %0,1" " "   &nb
   "brne 1b"
   : "=w" (__count)
   : "0" (__count)sp;   
);
}

板,有时还是有点烦。呵呵。不过在应用av
这两个函数都是avr-gcc 的 inline汇编格式写的,具体的语法规则我就不多说了。可以参考avr-libc。不过这两个函数很简单,很容易明白。一个是字节递减,一个是字递减。如果你认真看上面几个函数,你就会发现要正确使用它们是有如下条件的:
        1. 首先,你要正确定义你的 F_CPU 的值,也就是你的AVR单片机实际的频率。否则延时不准。
         2. 你在编译时一定要打开优化,Makefile中OPT 不要选 0 ,如果AVR_studio 不要选O0 。
  &nb
        3. 你在使用这两个delay()时,传递给两个函数的实参要使用常量,不要使用变量。
        4. 设置的时间参数__ms , __us 是有范围的,不要超过范围。__ms:1 - [262.14 ms / (F_CPU/1e6) ], __us:1- [768 us / (F_CPU/1e6)] 。 [...] 表取整数部分.

sp;   
对于第4条范围,来个例子:
      如果F_CPU = 7372800,则__ms范围:1 - 35 ,而__us范围:1 - 104 。

sp;   
只有具备了上面的条件你才可以正确使用延时函数 _delay_us () 和 _delay_ms () 。对于第三个条件,为什么要选用常量,还有第二个条件为什么要打开优化选项。这是为了让编译器在编译的时候就把延时的值计算好,而不是把它编译到程序中,在运行时才进行计算,那样的话,一是会增加代码的长度,还会使你的延时程序的延时时间加长,或是变得不可预料。产生时序的错误。

发现一写就写了两个多小时,看起来不长。看来说出来很容易,写下来还是要费点工夫的,希望对你的有所帮助。呵呵。分享快乐,共同进步。

关键字:avr  gcc  delay  延时函数 引用地址:avr-gcc中关于delay延时函数的应用

上一篇:关于AVR单片机的ADC使用
下一篇:AVR单片机的SPWM程序

推荐阅读最新更新时间:2024-03-16 14:42

avr单片机秒表Proteus仿真程序 tm1637数码管显示
单片机源程序如下: /** *版权所有(c)2018,艁ukasz Marcin Podkalicki *2009年12月13日 *简单定时器(启动/复位/停止),使用基于TM1637的一个按钮和7段显示模块。 * *注意,这个ATtiny13项目使用的内部时钟并不精确 *时间可以向前或向后流动,但是嘿! *它仍然足够做一个好的鸡蛋计时器:) */ //#include stdint.h #include avr/io.h #include util/delay.h #include avr/interrupt.h #include tm1
[单片机]
<font color='red'>avr</font>单片机秒表Proteus仿真程序 tm1637数码管显示
AVR的INT外部中断和PCINT中断之区别与使用
INT外部中断是几乎所有通用单片机,嵌入机中都会带有的,早期的51系列和arm系列也都有,然而大多数因为设计原因,多只有带两个INT,最近别人提到了一个“所有端口都可以外部中断”这样的说法,因为表示存疑,因此找了些资料,也就找到了avr328p自带的PCINT引脚功能 INT外部中断和AVR和PCINT具体区别如下: 差别1. INT限制在了两个端口上面,而PCINT则是所有接口都具备。 差别2. INT具有上沿,下沿,低电平,高电平触发这几种模式,而PCINT只有测量电平的变化这一个模式。 差别3. INT可以了解具体是哪个口触发的,而PCINT不行。 差别4. PCINT不会直接跳转入指定的程序,用
[单片机]
<font color='red'>AVR</font>的INT外部中断和PCINT中断之区别与使用
AVR单片机内部RC振荡器和能隙电压基准的稳定性研究
曾经在反复研究 MEGA 48 的内部 RC 振荡器 和 能隙 电压 基准的稳定性后,选择了 MEGA 48, 用内部 RC 来驱动 做串口通信.一直都比较成功! 突然前些天, 发现上次能正常通信的软件, 通信不了了! 反复检查后, 很仔细才发现 mega48 的振荡 频率 在示波器上,略有些偏大了! 为此,我对 OS CC AL 直接加大 3 后, 通信完全正常! 于是,就该芯片我对 振荡的温度漂移做了简单的试验.希望能给大家一些参考.由于条件简陋, 我唯一改变温度的办法是 热风枪. 为了便于对比,我使用了外部的稳定的频率作参考,然后应用自己编写的自动校准软件对 片内 RC 振荡器频率进行测量 该芯片的 出厂校正参数为 A3
[单片机]
GCC中的内嵌汇编语言
一.声明 虽然Linux的核心代码大部分是用C语言编写的,但是不可避免的其中还是有一部分是用汇编语言写成的。有些汇编语言代码是直接写在汇编源程序中的,特别是Linux的启动代码部分;还有一些则是利用gcc的内嵌汇编语言嵌在C语言程序中的。这篇文章简单介绍了gcc中的内嵌式汇编语言,主要想帮助那些才开始阅读Linux核心代码的朋友们能够更快的入手。 写这篇文章的主要信息来源是GNU的两个info文件:as.info和gcc.info,如果你觉得这篇文章中的介绍还不够详细的话,你可以查阅这两个文件。当然,直接查阅这两个文件可以获得更加权威的信息。如果你不想被这两篇文档中的一大堆信息搞迷糊的话,我建议你先阅读一下这篇文章,然后在必要
[单片机]
AVR基本硬件电路的设计与分析
基本的AVR硬件线路,包括几部分: 复位线路,晶振线路,AD转换滤波线路,ISP下载接口,JTAG仿真接口,电源电路。   下面以本网站推荐的AVR入门芯片 ATmega16L-8AI 分析上述基本线路。(-8AI表示8M频率的TQFP贴片封装,工业级,更详细的型号含义资料,请参考:AVR芯片入门知识) 复位线路的设计   Mega16已经内置了上电复位设计。并且在熔丝位里,可以控制复位时的额外时间,故AVR外部的复位线路在上电时,可以设计得很简单:直接拉一只10K的电阻到VCC即可(R0)。   为了可靠,再加上一只0.1uF的电容(C0)以消除干扰、杂波。   D3(1N4148)的作用有两个:作用一是将复位输
[单片机]
<font color='red'>AVR</font>基本硬件电路的设计与分析
基于AVR单片机PWM功能的数控恒流源研制
随着电子技术的深入发展,各种智能仪器越来越多,涉及领域越来越广,而仪器对电源的要求也越来越高。现今,电源设备有朝着数字化方向发展的趋势。然而绝大多数数控电源设计是通过高位数的A/D和D/A芯片来实现的,这虽然能获得较高的精度,但也使得成本大为增加。本文介绍一种基于AVR单片机PWM功能的低成本高精度数控恒流源,能够精确实现0~2A恒流。 系统框图 图1为系统的总体框图。本系统通过小键盘和LCD实现人机交流,小键盘负责接收要实现的电流值,LCD 12864负责显示。AVR单片机根据输入的电流值产生对应的PWM波,经过滤波和功放电路后对压控恒流元件进行控制,产生电流,电流再经过采样电阻到达负载。同时,对采样电阻两端信号进行差分和
[单片机]
基于<font color='red'>AVR</font>单片机PWM功能的数控恒流源研制
AVR烧错熔丝到恢复的一次经验----详细分析与解决方案
环境 目标器件:MEGA64L 烧录软件:PonyProg2000 (Version 2.06c Beta Jul 27 2003) 烧录硬件:按http://www.LancOS.com用224自制的烧录线 烧录过程 新制了几块DEMO板,焊好后,烧第一块OK。烧第二块时,用了错误的步骤: 1)读一次“Configurion and Security bits”,发现好象全都打勾,先不管它。 2)加载HEX文件与EEPROM文件到PonyProg2000。 3)按“Write DEVICE”,想写入FLASH与EEPROM。 现象 再烧录时,出现“Alert”窗口,信息“DEVICE Missing or UNKNOWN DEV
[单片机]
AVR单片机在跳频系统数字信号处理中的应用
ATmega103单片机是ATMEL公司推出的精简指令集(RISC)AVR(ADVANCE RISC)系列单片机产品,这是一种增强型RISC结构,采用了CMOS技术的8位微控制器?该结构能有效支持高级语言以及密集度极大的汇编器代码程序。 跳频系统(FH)是指载波频率按某种跳频图案(跳频序列)在很宽的频带范围内跳变的通信系统,由于该系统具有抗干扰、抗多径和抗衰落性等能力,故在军用和民用领域都得到了广泛的应用。本系统方案中,信号处理模块主要完成跳频模式(FH)下有关数字信号的处理,包括话音编解码、话音组织及与同步有关的操作等,这些技术目前是跳频系统的关键技术之一。 本文介绍ATmega103单片机的特点及其在FH系统数字信号处
[单片机]
<font color='red'>AVR</font>单片机在跳频系统数字信号处理中的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved