第九章 AVR C语言的应用.PDF_第1页
第九章 AVR C语言的应用.PDF_第2页
第九章 AVR C语言的应用.PDF_第3页
第九章 AVR C语言的应用.PDF_第4页
第九章 AVR C语言的应用.PDF_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第九章 AVR C语言的应用 9 1 第九章 AVR C语言的应用 本章程序是用IAR C正版软件编译通过的,并可产生*.HEX烧录文件,用其它C语言 编译是有差异的,不一定能通过,请用户注意这点!本章最后附几种C语言的比较,不仿一 读 更详细资料参阅光盘文件 9.1 AVR 支持 C 和高级语言编程的结构 一般高级语言 提高了MCU的重要性缩短产品上市的时间 简化了维护工作,可读性好 轻便 缩短学习时间 可重复使用,便于移植 方便调用库文件 潜在的缺点 代码较大 执行速度慢 为什么 AVR适宜用高级语言编程? 因为它是为高级语言而设计的! IAR对AVR结构和指令集的影响 在结构/指令集确定之前编译器的开发就开始了 潜在的瓶颈得到确认并消除 IAR 的反馈在硬件设计上得到了反映 几次循环反复 修改后的结果从代码当中可看出来 存储器 32 通用寄存器 数量多 直接 与 ALU 连接 可保存变量指针和之间结果 线性程序存储空间 1KBytes - 8MBytes 无需页寻址 常数区(SPM 可修改) 线性数据存储空间 16 MBytes 无需页寻址 类似于C的寻址模式 C 源代码 无符号的字符*var1, *var2; *var1+ = *-var2; 第九章 AVR C语言的应用 9 2 产生的代码 LD R16,-X ST Z+,R16 带偏移量的间接寻址 有效访问数组和结构 Auto (local variables)放置于软件堆栈之中 为适应重入的要求高级语言都基于堆栈结构 四种指针 16和32位支持 加法指令 加和减 寄存器之间 寄存器和立即数之间 Zero 标志的传播 SUB R16,R24 SUBI R16,1 SBC R17,R25 SBCI R17,0 所有的跳转都基于最后结果 两个16位数相减 第九章 AVR C语言的应用 9 3 Non-destructive comparison CP R16,R24 CPC R17,R25 CPC R18,R26 CPC R19,R27 带进位比较 Zero 传播 无需保存结果 可使用所有形式的跳转 Switch 支持 Switches 在 CASE 语句中经常遇到 Straight forward approach 效率低 间接跳转适合于紧凑的 switch 结构 switch 由通用库管理 摘 要 AVR 结构从一开始就是针对高级语言设计的 Atmel 与 IAR 在结构和指令调整上的合作 第九章 AVR C语言的应用 9 4 从而编译器可以产生高效的代码 AVR高效的C编译器 减少代码的提示和诀窍汇编(Assembly) 与 C 比较 汇编: 可以完全控制资源 在小应用当中可以产生紧凑的高速的代码 在大的应用当中代码效率低 可读性差Cryptic code 不好维护 不易移植Non-portable C 编译器: 对资源的控制有限 在小应中产生的代码量大执行速度慢 在大的应用当中代码效率高 结构化的代码 容易维护 容易移植 访问 I/O 读I/O: temp = PIND; IN R16,LOW(16) 写I/O: TCCR0 = 0x4F; LDI R16,79 OUT LOW(51),R16 I/O的位设置与清除 地址小于0x1F的I/O: PORTB |= (1sec+; temp-min+; temp-t_count+; 带参数的函数调用 使用参数将数据传递到函数中去 char add(char number1, char number2) return number1+number2; 函数间参数的传递通过 R16-R23 来实现 循 环 死循环 for(; ;) 循环 char counter = 100; do while(-counter) ; 预减变量Pre-decrement代码效率最高 优化代码的选项 代码大小优化编译 使用局部变量 使用允许的最小数据类型 将全局变量收集到结构中去 死循环使用 for(;) 使用预减的 do while; C AVR的程序设计 内 容, 安装必须的工具 第九章 AVR C语言的应用 9 7 9.2 C编译的介绍 练习 边学边做 用 C 编程 设置编译和链接文件 用 C 访问外围 中断处理 高级调试,使用不同的 AVR 外围 定时器/计数器 UART 外部中断Tool flow 器件: AT90S8515 C Compiler C 编译器 AVR Studio AVR 仿真调试器 SL-AVR AVR 下载编程测试器 测试程序:死循环 读 Port D 的值 (按键输入口) 将其值写到 Port B (LED, 输出口) 测试程序(设文件名为 920.c) #include /* 定义 AT90S8515 */ void main(void) char c; DDRB = 0xFF; /* PortB all outputs */ for(;) /* Eternal loop */ c = PIND; /* Read Port D */ PORTB = c; /* 回写到 Port B */ 9.2.1. 安装C编译器 根据 IAR Readme 要求,从光盘安装编译器, 文件安装好后,可把图标移到桌面成快捷工作图 标,如图 921 正版软件有加密狗,只有把狗插在打印口上, 双击快捷图标,才能进入工作窗口 9.2.2 设置 C 编译器 启动 IAR 嵌入式工作台 可双击快捷图标, 进入 I A R 编译器窗口 图 9 2 1 快捷工作图标 1 . 创建工程文件: 按序操作, - F i l e N e w P r o j e c t 创建新工程文件, 如图 9 2 2 新建工程文件窗口 选择 C P U 为 A 9 0 , 并输入工程文件名, 如: 9 2 0 第九章 AVR C语言的应用 9 8 图922 新建工程文件窗口 2 . 编辑 C 源程序文件设置, 关于 C 语言知识, 请参阅有关书籍 图923 编辑源程序文件 第九章 AVR C语言的应用 9 9 3 . 编辑 C 源程序, 设置编译器选项 按序操作: Project - Options 选择源文件对应器件( 本例为 M a x 6 4 K b y t e d a t a , 8 K b y t e c o d ( 8 5 1 5 , 4 4 1 4 . . . ) ) 及内存模式 ( S m a l l ) , 见 图 9 2 4 图 9 2 4 编辑源程序设置选项 4 . 设置链接器文件 X L I N K 选项 在图 9 2 5中选择 X L I N K选项, 为生成下载文件, 必须设定为 i n t e l - e x t e n d e d 输出格式 ( r e l e a s e o n l y ) ; 图 9 2 5 X L I N K 选项, 生成下载文件 第九章 AVR C语言的应用 9 10 5 . 设置链接器文件 X L I N K 选项, 选择处理器配置, 设定内存模式见图 9 2 6 图 9 2 6 处理器配置及内存模式选项 6 . 生成调试文件选项, 见图 9 2 7 图 9 2 7 为生成调试文件选项 以上选项可以统统选完后, 一次 O K 第九章 AVR C语言的应用 9 11 7 . 将源程序加入到工程文件 按序操作 - P r o j e c t - F i l e s . , 见图 9 2 8 选择源程序, 按 A d d按钮, 把上部窗口程序加到下部窗口, 如有几个文件需链接, 都应加到下部窗 口然后按 O K 按钮, 设置编译器选项结束, 显示工程文件窗口图 9 2 9 图 928 将源程序加入到工程文件 8 . 对工程文件进行链接编译 如图 9 2 9 , 双击 * . C 文件, 将会弹出源程序窗口 图 929 对工程文件进行链接编译 按序操作, Project Make 或键 F9,或快捷工具条图标如有编译错误提示,请修改程序或检 查编译器选项是否有问题,请改正,再编译,直到无错误报告,见图 929 报文窗口 第九章 AVR C语言的应用 9 12 9. 查看编译生成的文件 根据编译器的选项要求,程序编译后生成程序调试文件 *.d90,编程下载文件 *.a90 等, 见图 9210 图 9210 编译生成的文件 9.2.3 使用AVR Studio调试 如程序编译通过,可进入程序调试C 语言的调试,见第三章 3.2 模拟调试窗口 1. 启动 AVR Studio ,双击桌面快捷图标 2. 装入调试文件 (TestProg.d90) - File - Open 如图 9211 选择 AT90S8515 (只需在开始时选择一次) 加入视图VIEW I/O (PinB, PortD) Processor Watch c PORTB PIND 单步执行, Toggle PIND bits 图 9211 “Debug”调试窗口 9.2.4 对器件编程 选择编程下载窗口 (见第三章图 3.30 AVR下载窗口) 第九章 AVR C语言的应用 9 13 9.3 测试应用程序 Main函数 “main” 是所有 C 程序的入口点 不要加入参数也不要返回值 语法: void main(void) /* 代码 */ 访问外围 所有 I/O 寄存器在头文件里都被定义为特殊功能寄存器 象普通变量一样访问 #include /* 定义 8515 */ void main(void) DDRD = 0xFF; /* Port D 输出 */ 9.3.1 读/写口 #include /* 定义 AT90S8515 */ void main(void) char c; DDRB = 0xFF; /* PortB 输出 */ for(;) /* 死循环 */ c = PIND; /* 读 Port D */ PORTB = c; /* 回写到 Port B */ 9.3.2 延时函数 #include /* 定义 8515 */ void delay(unsigned int delayValue) unsigned int i; for(i=0;i #include void main(void) char temp = 0; _EEPUT(0x10,temp); /* 写 E2PROM 地址0x10 */ _EEGET(temp,0x10); /* 读 E2PROM 地址 0x10 */ 9 . 3 . 4 A V R的 P B口变速移位 / * 文件名: S L A V R 9 3 4 . A S M * / / * 本程序及以下所有程序, 编译后在 S L - A V R 编程开发实验器上验证通过 * / / * 位运算符: 按位取反; 右移; 按位与; 按位或; 按位异或; ; i + + 相当于 i = i + 1 ; i - - 相当于 i = i - 1 * / # i n c l u d e ; / * 器件配置文件 * / # d e f i n e B I T ( x ) ( 1 / * 预处理命令, 头文件 * / # d e f i n e B I T ( x ) ( 1 0 ; i - - ) / * L E D 的 1 位亮灯从 A 口 P A 7 P A 0 * / P O R T A = B I T ( i - 1 ) ; d e l a y ( t ) ; P O R T A = 0 x f f ; v o i d m a i n ( v o i d ) ; / * 主函数 * / u n s i g n e d c h a r d t ; w h i l e ( 1 ) / * 循环 * / f o r ( d t = 5 ; d t / * 预处理命令 * / # d e f i n e u c h a r u n s i g n e d c h a r # d e f i n e u i n t u n s i g n e d i n t v o i d d e l a y ( u c h a r t ) u c h a r i , j ; f o r ( i = 0 ; i / * 器件配置文件* / # d e f i n e u c h a r u n s i g n e d c h a r / * 定义缩写* / # d e f i n e u i n t u n s i g n e d i n t v o i d d e l a y ( u i n t t ) u i n t i ; f o r ( i = 0 ; i / * 头文件* / # d e f i n e u c h a r u n s i g n e d c h a r / * 缩写定义* / # d e f i n e u i n t u n s i g n e d i n t f l a s h u c h a r D A T A _ 7 S E G = 0 x 3 f , 0 x 0 6 , 0 x 5 b , 0 x 4 f , 0 x 6 6 , 0 x 6 d , 0 x 7 d , 0 x 0 7 , 0 x 7 f , 0 x 6 f , 0 x 7 7 , 0 x 7 c , 0 x 3 9 , 0 x 5 e , 0 x 7 9 , 0 x 7 1 ; / * L E D 字形表* / u c h a r l e d 6 ; / * 显示缓冲* / u i n t c o u n t ; / * 延时子程序* / v o i d d e l a y ( u i n t t ) u i n t i ; f o r ( i = 0 ; i v o i d D e l a y ( v o i d ) u n s i g n e d c h a r a , b ; f o r ( a = 1 ; a ; a + + ) f o r ( b = 1 ; b ; b + + ) ; v o i d L E D _ O n ( i n t i ) P O R T B = ( 1 0 ; i - - ) L E D _ O n ( i ) ; f o r ( i = 0 ; i 0 ; i - = 2 ) L E D _ O n ( i ) ; 编译后生成的程序代码 编译器 程序代码字节数 I A R 4 1 3 I C C A V R 3 1 1 C o d e V i s i o n A V R 3 2 7 K E I L 5 1 1 3 6 L E D 变化的速度明显慢得多 注对于 K E I L P O R T B 换成 P 1 又比如对 A T M E L 文档中的例子程序 第九章 AVR C语言的应用 9 26 i n t m a x ( i n t * a r r a y ) c h a r a ; i n t m a x i m u m = - 3 2 7 6 8 ; f o r ( a = 0 ; a m a x i m u m ) m a x i m u m = a r r a y a ; r e t u r n ( m a x i m u m ) ; 编译后生成的代码和在 8 M H Z 晶振下运行所需时间对比如下 编译器名称 代码字节数 执行时间8 M H Z 效率 I A R 5 8 4 7 . 6 3 u s 2 3 . 5 8 I C C A V R 6 2 5 0 . 7 5 u s 2 2 . 1 4 C o d e V i s i o n A V R 6 0 1 7 9 . 3 8 u s 6 . 2 6 K E I L 5 1 5 7 1 . 1 2 3 5 m s 1 最后我们再看一个浮点运算程序 # i n c l u d e v o i d m a i n (v o i d) f l o a t x , y , z ; x = 1 . 0 ; y = 2 . 0 ; z = s i n ( x + y ) ; 编译后生成的代码和在 8 M H Z 晶振下运行所需时间对比如下 编译器名称 代码字节数 执行时间8 M H Z 效率 I A R 1 2 3 7 7 4 7 . 5 u s 7 . 0 9 I C C A V R 1 9 9 1 9 5 0 . 7 5 u s 5 . 5 8 C o d e V i s i o n A V R 1 2 6 7 5 2 1 u s 1 0 . 1 7 K E I L 5 1 1 4 0 3 5 . 3

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论