DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2137|回复: 2
打印 上一主题 下一主题

AVR单灯闪烁的实现

  [复制链接]
跳转到指定楼层
楼主
发表于 2012-1-27 19:43:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  
         
    1.硬件连接
  1.1 时钟源
  与AT89系列单片机相比,ATMEGA8515单片机具有更多种的时钟产生方式,通常可选用:
  1)外接晶振/陶瓷振荡器方式
  2)外接低频晶振方式
  3)外接RC元件构成的振荡电路
  4)标定的内部RC振荡电路
  5)外接信号源
  这些信号源的选择是在编程通过对CKSEL3、CKSEL2、CKSEL1和CKSEL0这4个位的选择来确定的。
  下表是选择不同的时钟源时,应写入的CKSEL3…0的值。
              时钟源选择
芯片时钟选项      CKSEL3..0
外部晶体/陶瓷振荡器 1111-1010
外部低频晶体      1001
外部RC振荡器      1000-0101
标定的内部RC振荡器      0100-0001
外部时钟           0000
  说明:对于所有的熔丝位, “1” 表示未编程, “0” 代表已编程。
  1.2 启动延时
  用于给芯片供电的电源特征各不相同,有一些电源,回路中有大电容,接通电源后其电压上升速度较慢,当电源升高到一定程度时,电路的各部份都开始工作但却不能稳定地工作,如果此时让芯片进入到工作状态,往往会导致运算出错、程序跑飞、片内EEPROM数据被乱改等后果,致使单片机的工作出现不正常,为解决这一问题,ATMEGA8515芯片在芯片完成复位后并不立即开始工作,而是延迟一段时间再进入正常工作状态,这个延时的时间可以由用户自行设定,系统中有SU1和SU0位,在编程时对这两位进行设定即可获得不同时长的延时。
  芯片在出厂时CKSEL = “0001”, SUT = “10”。默认时钟源为有最长启动时间的内部RC振荡器。默认设置可以保证用户使用在线编程或并行编程时都能获得所期望的时钟源。
  关于振荡电路选择的更详细资料,请参考ATMEGA8515的数据手册。
本实验板在设计时,用了11.0592M的晶振,这是为了使用51单片机而设定的。如果你用的芯片是ATMEGA8515,那么完全不用担心,因为该芯片的最高频率可以达到16M,如果你用的芯片是ATMEGA8515L,理论上,其最高工作频率为8M,但经过实践,用到11.0592M也同完全没有问题的,当然,这里仅是在实验板上使用,真正制作产品时不要这么做。
  1.3 I/O口的连接
  ATMEGA8515具有4个8位的I/O口(PA、PB、PC和PD)和一个附加的3位I/O口(PE),作为通用数字I/O 使用时,所有AVR I/O 端口都具有真正的“读- 修改- 写”功能。这意味着用SBI 或CBI 指令对一些管脚进行诸如改变方向、更改端口电平、禁止/ 使能上拉电阻等操作时,不会影响到其他的管脚。和51单片机不同,ATMEGA8515单片机的输出缓冲器具有对称的驱动能力,可以输出或吸收大电流,直接驱动LED。所有的端口引脚都具有与电压无关的上拉电阻。作为输入使用时,若内部上拉电阻使能,端口被外部电路拉低时将输出电流。
  每个端口引脚都具有三个寄存器位: DDxn、 PORTxn 和PINxn,这里的X代表A、B、C、D和E中的一个,以下同。DDxn 以来选择引脚的方向。当DDxn 为"1“ 时, Pxn 配置为输出;否则为输入。当引脚配置为输入时,若PORTxn 为"1“,上拉电阻将被接入电路中。如果不需要这个上拉电阻起作用,可以将PORTxn 清零,或者将这个引脚配置为输出。复位时各引脚为高阻态,即使此时时钟没有工作也是如此。
  当引脚配置为输出时,若PORTxn 为"1“,引脚输出高电平("1“),否则输出低电平(“0“)。在 高阻态({DDxn, PORTxn} = 0b00)和 输出高电平({DDxn, PORTxn} = 0b11) 两种状态之间进行切换时,上拉电阻接入电路({DDxn, PORTxn} = 0b01) 或输出低电平{DDxn,PORTxn} = 0b10) 这两种模式必然会有一个发生。通常,上拉电阻被接入电路是完全可以接受的,因为高阻环境不在意是强高电平输出还是上拉输出。如果外围电路不允许接入上拉电阻,可以通过置位SFIOR 寄存器的PUD 来禁止所有端口的上拉电阻。在上拉输入和输出低电平之间切换也有同样的问题。用户必须选择高阻态({DDxn,PORTxn} = 0b00) 或输出高电平({DDxn, ORTxn} = 0b10) 作为中间步骤。
  DSB-1A板在设计时,PB口接有8个发光二极管,同时接有排电阻PZ1作为二极管的限流电阻,如图1所示,这是51单片机的典型设计,同样可用于ATMEGA8515单片机。


500)this.style.width=500;">
                 图1
2.程序
/**************************************************
;    平凡单片机工作室
;  [img]http://www.mcustudio.com]http://www.mcustudio.com
;    Copyright 2003 pingfan's mcustudio
;    All rights Reserved
;作者:周坚   
;ddss.c
;单灯闪烁程序,用于AT89S8515,ATMEG8515,在DSB-1A型实验板上实现
;**************************************************/
#include "avr/delay.h"
#include "avr/io.h"
static void io_init(void)
{
PORTA = 0x0;
DDRA = 0x0;
// PortB
PORTB = 0x0;
DDRB = 0x01;
// PortC
PORTC = 0x0;
DDRC = 0x0;
// PortD
PORTD = 0x0;
DDRD = 0x0;
}
void mDelay(uint16_t DelayTim)
{ uint16_t i;
for(;DelayTim>0;DelayTim--)
{ for(i=0;i<40000;i++)
{;}
for(i=0;i<39000;i++)
{;}
}
}
int main(void)
{
io_init();
while(1)
{
mDelay(500);
PORTB&=0xfe;
mDelay(500);
PORTB|=0x01;
}
}

2.程序分析
  1.C程序是由函数构成的,一个C源程序至少包括一个函数,一个C源程序有且只有一个名为main()的函数,也可能包含其它函数。这个程序中有一个main函数和两个用户自定义函数:mDelay()和io_init()。
  2.和51单片机不同,AVR单片机的端口在使用之前必须先设定好输入或输出,并决定是否接上拉电阻,因此,AVR单片机编程时比51要稍复杂一点,但却提供了更为强大的功能。
    AVR单片机的端口一共有3个寄存器,即DDxn、 PORTxn 和PINxn,其中DDXn是用来设定端口的输出方向的,这里仅需要将PB.0设为输出即可,因此,在初始化程序中有: DDRB = 0x01;
这样一行,即将PB.0设为输出。其他的均为0。
  3.这里仍用了51中常用的延时程序编写的方式即空循环的方式来产生延时,延时程序如mDelay()所示。需要说明的是,由于AVR单片机运算速度极快,应此,空循环次数当多才能产生足够长的延时,这里用了2段延时,才达到1ms的延时效果,这个循环次数是经过实际测试得到的,当参数为1时,延时1ms。
  4.实现过程
    有了上述程序之后,我们介绍两种实现的方式,即用winavr和atmanavr来实现。
  4.1 用WINAVR实现
  开启winavr―>Programmer Notpads,将上述源程序输入其中。保存源程序,设保存在E盘AVR文件夹下的DDSS文件夹下,文件名为ddss.c。
开启winavr->Mfile,编缉Makefile,开启之后,即有一个makefile的模板,如图2所示。

            图2 Makefile的模板
  点击菜单Makefile->Main file name……即出现如图3所示的对话框,通常不需要更改此选项,最终产生的hex文件即main.hex。

       图3 设置主文件名
  接着点击Makefile->Mcu type,设定所用单片机的型号,如图4所示。
  
       图4 设置单片机型号
  我们选择Atmega8515为我们所用的型号。
    其他选项的说明如第一课《AVR的C语言开发环境的建立》一文所作的说明。
    设置好后,点击file->save as将其存到e:\avr\ddss文件夹。
    然后在Programmer Notepads中,点击:Tools->Make All,即可对该文件进行编译、链接等处理,有关信息在output窗口中呈现。如有错误,单击错误行,即可定位,以便对此进行修改,直到编译、链接完全正确为止。此时,output窗口显示:
> Process Exit Code: 0
  此时,即可进入调试。启动AVRStudio,点击file->open,即出现open的通用对话框,进入ddss所在文件夹,打开文件时,可选一切文件,而AVRStudio会自动识别文件类型,如图5所示。
  
      图5 打开文件时的对话框
  选择main.elf文件,即出现如图6所示的对话框。

      图6 选择仿真器及芯片
    这里我们选择Avr Simalator,芯片选择Atmgea8515。
    点击finish即调入仿真文件并进入仿真界面,如图7所示。
  
      图7 进入仿真界面
  4.2 用ATMENAVR实现
  启动Atmenavr,选择“文件->新建”,即图现如图8所示界面。
  
      图8 AtmanAVR新建向导
  选择AVR C Wizard(exe),然后在右侧“工程名:”和“目录:”中设置正确的目录并命名一个工程名。我们设定为E:\AVR\atman目录,工程名为ddss。
    点击确定后,进入向导,首先选择芯片,这里我们选择Atmega8515,时钟频率选为11.0592M,看门狗无效,不对外部RAM进行设置。设置完成后如图9所示。
  
      图9 工程设置向导第一步
  点击下一步,进入Step 2,这一步是设置端口方向,点击PORTB页面卡,选择Bit0为0(点击I即可),其余不需要更改。然后即可以点击“完成”。完成后即进入AtmanAvr的主界面,并自动产生了一些文件,如ddss.c,ddss.h等,双击ddss.c,打开后,可以发现已根据需要做好了io口的初始化的工作。
查看main函数,可以看到有这样的程序行:
while(1)
{
// TODO: Add your code here
}
即可在此处加上自己的处理代码。我们在此处加上:
mDelay(500);
PORTB&=0xfe;
mDelay(500);
PORTB|=0x01;
    然后,再自行编写mDelay函数,即可。
    源程序编写好后,按F7进行编译、链接,如果有错误,会显示在输出窗口中,双击可定位。修改源程序,直到编译通过为止。
编译通过后,点击编译->开始调试->Go即可进入调试。如图10所示。
  
      图10 进入调试
  至此,用winavr和Atmenavr进行程序设计、调试的基本步骤都已经结束。
3.进入调试
    3.1用AvrStudio进行调试
    进入AVRStudio后,如图1所示,可以看到,除了标准的菜单、工具条等之外,下面就是若干个窗口。其中中部左侧是Workspace窗口,该窗口有3个页面卡,进入调试后自动转到I/O页面,这里有单片机内部的各种资源。从这里,可以看出为什么在进入调试时要选定型号了,选了型号,这里出现的内容也各不相同。我们点击Portb将Portb展开,可以看到有3个项:
    PORTB  端口寄存器
    DDRB  端口方向寄存器
    PINB   引脚
    用十六进制和二进制方式清晰地表达出了各位的清况。
    右侧是源程序窗口,黄色箭头指向主程序。
    这两个窗口下面又有两个窗口,左侧是OutPut窗口,进入调试后自动切换到信息页面。显示了调入文件的各种信息。右侧是观察窗口,有若干个页面卡,可以分组在各种页面卡中显示变量值。
除此之外,还可以通过菜单View分别调出寄存器、内存等各个不同的观察窗口。

       图1 AvrStudio的窗口
    按下F11,即可单步执行程序,按下F10可以用过程单步的方式执行程序(将一个函数作为一个语句来执行,不进入这个函数的内部)。
    按下F10以过程单步的方式执行(很奇怪,io_init()按说应该一次执行完毕,但却跟踪进入了这个函数体,原因暂未明),执行到:DDRB=0x01后可以看到左侧窗口中DDRB的相应变化。如图2所示。

    图2 DDRB的变化
    继续按F10执行程序,可以看到PORTB和PINB都发生了变化,如图3所示

    图3 PORTB和PINB发生变化
    执行一个循环后,我们按F11,跟踪到函数内部看一看,如图4所示是跟踪进入了mDelay函数。
    此时,可以看到,观察窗口中原来没有显示的变量此时已显示出了其数值。
  
    图4 进入mDelay函数
    这样,一步一步执行程序,即可观察各变量的变化。如果跟踪一段时间后已查看到结果,觉得这样的查看太慢了,也可以将光标置于本函数的未一行,然后点击Debug->Run to Cursor,即可全速执行到该光标处。
    在调试时,我们也感到AvrStudio的模拟执行速度较慢,比如mDelay(500)在实际中延时约0.5s,但在作者的机器上却要执行好长一段时间―――我的机器还算是新的。因此,在调试时希望先给一个较小的数值,以免影响调试的效率。为此,回到winavr的Programmer Notpad中,将mDelay(500)改为mDelay(5),然后重新编译,切换回AvrSTudio时,可以发现AVRStudio已“察觉”这种变化,并询问是否要重新加载,如图5所示。
  
    图5 重新加载更新了的目标文件
    除了以上的一些调试方法外,Debug菜单还提供了诸如Reset(复位)、AutoStep(自动单步)等调试手段,大家可以自行测试。
    3.2用AtmanAvr进行调试
    如果使用AtmanAvr,那么在编译完成后,按F5进入调试。此时,可以看到菜单上多出一项Debug项,同时,在菜单、工具条的下方多出了一些窗口,如图6所示。从图中可以看出,其窗口与图1有些类似,事实上,Atmavr应该是嵌入的AvrStudio的早期版本的调试窗口。
    除了这些窗口外,还可以通过查看->调试窗口 选项来获得更多的窗口,除了AvrStudio原有的一些窗口外,AtmanAvr还得供了LCD、LED和键盘这样三个窗口,可用于真实仿真。
  
    图6 AtmanAvr进入仿真状态
    进行调试的方法和3.1节的叙述基本类似,通过Debug菜单进行单步、过程单步、全速、自动单步、设置断点、运行到光标处等方法进行程序的调试,这里就不再一一叙述了。Debug菜单条如图7所示。

图7 AtmAvr的Debug菜单条

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
沙发
发表于 2013-10-5 00:37:25 | 只看该作者
怎么没很多图片都挂了啊~~~
板凳
发表于 2021-11-6 16:00:30 | 只看该作者
有很多图片无法查看.....
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-5-5 08:05 , 耗时 0.087708 秒, 17 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表