版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
林夕仍然ATmega16学习笔记例程移植到AtmelStudio6.2笔记相信你已有了一定的C语言及数字电路基础,以及能定下心来,决心学点东西。假如做不到的话,麻烦您把我轻轻的放开,该干啥干啥去。
前言最近学习AVR,网上找了N多资料后,发现就算林夕仍然ATmega16学习笔记最合俺的心意。优点如下:不讲原理,直接操作,适合俺这种不愿背书的差生。每个例程都附有源程序及PROTEUS仿真文献,省了买零件的金钱及焊板的时间。缺陷当然也有:太省事了,初学者容易只跑跑例程,不求甚解(这也是市售所有学习板的通病)。基于ICCAVR,而不是最新的AtmelStudio。理论知识太少(也算是优点)。尚有一条就是这玩意是用EXE文献打包的,初次下载时,我不敢打开,生怕会给我强装软件或者开个后门什么的。后来在网上下载了一个开发板的附带光盘文献,发现里面也带着这玩意。心想这里面不该会有问题呀,才不是太放心的打开,打开后发现相见恨晚呀!好吧,先把这些例程一个一个琢磨完吧。但是看程序时发现想打瞌睡,也难怪,看这玩意也太没挑战性了。既然我的电脑中装了AtmelStudio,即然ICCAVR迟早要过时,不如把这里面的例程移植到AtmelStudio中吧!顺便也可以学习一下编程。笔记不妨公开,俺也好刷一点成在感。本文中所有例程均在AtmelStudio6.2+Proteus7.8中调试通过。本文是我个人学习时的笔记,希望后来者能少走一点弯路。学习MCU的惟一捷径是多读例程,多写程序,别无他法。林夕仍然ATmega16学习笔记下载链结如下:链接::mzah
实验1:8种LED点亮模式移植到AtmelStudio中的环节打开AtmelStudio6.2,新建一个项目。不知道啥意思,我选第二个后,在下面起好项目名称及选好项目目录后OK。这个好办,按CPU型号选就好了。终于进入编辑窗口了。一言蔽之,提取包中所有.c(C源码)、.h(C头文献)、.dsn(PROTEUS仿真文献)文献。AtmelStudio自己生成的那个.c文献要删掉,否则你懂的。移植的时候,要把头文献换一下,否则用不了所有的iom16v.h替换为avr/io.h所有#include<macros.h>所有注释掉。有这一句的文献中,所有增长#defineBIT(x) (1<<(x))当然了,移植的时候,我们懒得逐个去改BIT,才这么将就一下。那么AtmelStudio与BIT()等价的命令是什么呢?打开sfr_defs.h文献,里面有一行:没错,AtmelStudio中与BIT等价的命令是_BV。再把随项目自动生成的那个C文献(含main函数的那个)删掉。main函数要改成int型。嗯,C99是这样规定的,新出的标准C编译器都得这么干,否则会有警告。某个不仅仅是五百强的公司的编程规范中可是明文规定编译时不准有任何警告。按F7编译在项目目录中找到生成的hex文献,一般在DEBUG子目录里,用Proteus仿真。2、Proteus仿真环节假设已经装好Proteus,我装的是7.8版本。双击打开包中的DSN文献。如上图所示,双击CPU,弹出下框。在ProgramFile中找到刚才编译出来的hex文献。然后点击OK。点击程序左下角的三角形图标开始仿真我们现在可以愉悦的看着LED图标在欢快的上下滚动。3、知识点作为开山第一个实验,知识点会多一些,我会很认真的写,希望你能看懂。AtmelStudio不支持直接对单个位进行操作,若要对单个位进行操作,则要通过与或非的办法。小知识:ICCAVR位操作的宏定义C语言位操作的功能是其比较杰出的地方,现在许多微解决器都支持C编译器也可看出。汇编语言的位操作也很直观,但在某些C编译器对位操作却不能象汇编中对单个的位进行直接解决,而要转化为对一个字节的操作,在ICCAVR中这种限制充足体现出来。如要对PORTA的PORTA0置1,则应写成PORTA|=0X01;这样的位处在字节的两端还比较直观,但若是要置PORTA的第3位,第6位置1,则写出的程序可读性不强了。于是便有了一些宏操作定义#defineBIT(x)(1<<(x))(需要包含头文献macros.h)才可直接使用。下面给出两种置1和清0的宏定义:置1:1,#defineset(x)(1<<(x))2,#definesetb(temp,x)temp|=(1<<(x))清0:1,#defineclr(x)(~(1<<(x)))2,#defineclrb(temp,x)temp&=~(1<<(x))比较上述置1的两种宏定义,第1种在写1时需写成PORTA|=set(x);x表达要解决的位,第2种更象函数,使用起来也比较直观:setb(PORTA,x),可读性比较强但是第2种却并非是万能的,以MEGA8515为例,USART的UBRRH和UCSRC共用一个I/Olocation,在写UBRRH的时候最高位必须为0,写UCSRC时则正好相反。上述第2种的置1和清0操作只能对1个BIT进行操作,所以是不能解决UBRRH和UCSRC的写入工作的,而第1种置1和清0操作却可以通过或/与进行多个位操作的,比如写入UCSRC0x01可以写作:UCSRC|=set(7)|set(0);而假如用第2种宏定义则让它太为难了。两种方法有其利弊,使用的时候靠自己衡量了。#definecheckbit(var,bit)(var&(0x01<<(bit)))/*定义查询位函数*/#definesetbit(var,bit)(var|=(0x01<<(bit)))/*定义置位函数*/#defineclrbit(var,bit)(var&=(~(0x01<<(bit))))/*定义清零位函数*/#defineTGLBIT(reg,bit)reg^=bit/*定义取反函数*/
实验2:有源蜂鸣器驱动实验实验二很简朴,移植也很简朴,只要把所有#include<macros.h>所有注释掉。所有的iom16v.h替换为avr/io.h,由于没有使用BIT(),所以不用加相应的宏定义。main函数改为int型。程序就是这么个样子。voidbell(void){PORTD&=~(1<<PD5);DelayMs(50);PORTD|=(1<<PD5);DelayMs(50);}intmain(void){DDRD=0XFF;PORTD=0XFF;while(1){bell();}}其实bell()可以改得更简朴一些,由于编译器不支持端口位操作,但是PORTD只接了个蜂鸣器,所以大可以把整个PORTD取反。 PORTD=~PORTD;虽然说编译器不支持端口位操作,但是我们可以牺牲点效率,用与或非的办法实现端口位操作。 PORTD^=_BV(PD5);也许会有人问PD5是什么意思,怎么定义的?在PD5上右击,点击GotoImplementation,会自动跳到PD5的定义。恩,PD5=5;下面是我改动过后的bell(),每一种方法都是可行的。voidbell(void){ //方法一、原例,不断的输出高低电平 PORTD&=~(1<<PD5); //PD5等价于数值5,1<<5表达把1左移五位。即00000001<<5=00100000 DelayMs(50); PORTD|=(1<<PD5); DelayMs(50); //方法二、对PORTD不断的取反 PORTD=~PORTD; //对整个端口取反 DelayMs(50); //方法三、循环对单个端口置高低电平 //编译器不支持对端口进行位操作,需要使用标准C语言中位操作的技巧,可以参看谭版C程序设计,位操作一章。 PORTD|=_BV(PD5); //单独把PD5置高电平。 DelayMs(50); PORTD&=~_BV(PD5); //单独把PD5置低电平 DelayMs(50); //方法四、对单个位取反 PORTD^=_BV(PD5); //对单个端口进行取反操作 DelayMs(50);}
实验3:按键扫描(用KEY选择相应LED点亮)继续按实验一的方法解决:所有#include<macros.h>所有注释掉,有这个头文献的地方增长宏定义#defineBIT(x) (1<<(x))。所有的iom16v.h替换为avr/io.h。main函数改为int型。这个程序很简朴,先初始化端口,然后循环运营key_scan函数。key_scan函数扫描所有有开关的端口,假如其中有一个为低电平的话,则将相应LED点亮,之后检查PINA有没有电平变化,假如有的话,跳出while,然后反复上述流程。由于开关无论抖动几次,都不会影响结果,所以不需要防抖动。
实验4:按键扫描+8种LED亮灭模式控制移植方法与实验3同样同样的。程序是实验3与实验1的结合版本,很简朴。
实验5:按键扫描(用KEY选择LED点亮模式)
实验6:无源蜂鸣器驱动实验(ICC)依电脑配置及设立不同,仿真时也许会有下列警告,表达仿真时间与实际时间不符。若把两个电阻属性改为数字的,警告会消失,但是声音会异常。
实验7:外部中断INT0实验这个实验就麻烦多了。先按照之前的套路:所有#include<macros.h>所有注释掉,有这个头文献的地方增长宏定义#defineBIT(x) (1<<(x))。所有的iom16v.h替换为avr/io.h。main函数改为int型。由于main()调用了SEI(),所以要增长宏定义:#defineSEI() asm("sei")AtmelStudio的中断函数与ICCAVR不同样,需要改,如下图:前面还要增长一个头文献:#include<avr/interrupt.h>ISR表达是中断服务函数,所有中断服务函数必须叫这个名字,INT0_vect表达INT0入口,中断入口可以在iom16.h文献中找到(此为举例,实际CPU不同,文献名也会不同)。正常情况下,这样就大功告成了,实际仿真结果却与预期值大相径庭。预期值是程序运营后D0慢闪,按下INT0键后,这一组LED把戏闪烁。实际仿真结果却是按下键后似乎毫无反映,从逻辑分析仪上看,仿佛又有一点变化。我花费了好几个小时找资料排查,毫无所获,分析代码也没有发现任何问题,修改程序定位的结果DelayMs()仿佛没有执行。但是在main()中调用该函数却毫无问题。DelayMs()仅仅只是一个延时N毫秒的程序,其实我们完全可以用AtmelStudio自带的库函数替代。在main.c与functions.c文献头上增长如下定义及头文献#defineF_CPU3686400UL#define__DELAY_BACKWARD_COMPATIBLE__#include<util/delay.h>F_CPU表达CPU时钟频率,最后的UL代表无符长整型。后面一句可以参看下面的文章:现在我们可以快乐的在这两个函数中调用_delay_ms()函数了,但是改后,结果还没有改善。好吧,现在把程序复原,然后回过头把这个程序再读一遍,发现这中断服务函数也太长了吧,长就算了,哪有中断服务程序加这么延时的?再者说,这函数内的变量也定义太多了吧?一个i不就得了。但是就算这样,也不该会出这种问题吧!接着上网查资料,死了无数脑细胞后,发现本来是AtmelStudio编译时,认为延时函数没有做任何
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年专用打印机采购销售协议范本
- 2024年个人借款协议模板
- 2024年家用壁纸买卖协议模板
- 2023-2024学年浙江省余姚八中高考第四次模拟数学试题试卷
- 2024年企业融资中介协议范本
- 2024无财产瓜分离婚协议示范文本
- DB11∕T 1717-2020 动物实验管理与技术规范
- DB11∕T 1601-2018 毛白杨繁育技术规程
- 2024设备维护与保养协议范本
- 2024年专业收银员岗位聘用协议样本
- 酒店的基本概念
- 重点但位消防安全标准化管理评分细则自评表
- 挂牌仪式流程方案
- 传输s385v200v210安装手册
- 风险调查表(企业财产保险)
- 农业信息技术 chapter5 地理信息系统
- 浅谈新形势下加强企业税务管理的对策研究
- 必看!设备管理必须要懂的一、二、三、四、五
- 空冷岛专题(控制方案、谐波及变压器容量选择)
- 结合子的机械加工工艺规程及铣槽的夹具设计
- 液氧汽化站安全技术操作规程2018-07.docx
评论
0/150
提交评论