ATmega128在开发应用中应注意的问题
atmega128熔丝位配置
这几天一直在搞AVR ATmega128的程序,显示最基本的功能,但是因为用到了PORTG端口,而这个端口在ATmega128中是放在内部SRAM中的,是为了与ATmega103兼容,出厂时默认是不可以访问的。
因为这个问题,耽搁了几天。
现在看到如下文章,终于“柳暗花明”了。
转载于此,为记!对AVR熔丝位的配置是比较细致的工作,用户往往忽视其重要性,或感到不易掌握。
下面给出对AVR熔丝位的配置操作时的一些要点和需要注意的相关事项。
(1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态,“Unprogrammed”表示熔丝状态为“1”(禁止);“Programmed”表示熔丝状态为“0”(允许)。
因此,配置熔丝位的过程实际上是“配置熔丝位成为未编程状态“1”或成为已编程状态“0”。
(2)在使用通过选择打钩“√”方式确定熔丝位状态值的编程工具软件时,请首先仔细阅读软件的使用说明,弄清楚“√”表示设置熔丝位状态为“0”还是为“1”。
(3)使用CVAVR中的编程下载程序时应特别注意,由于CVAVR 编程下载界面初始打开时,大部分熔丝位的初始状态定义为“1”,因此不要使用其编程菜单选项中的“all”选项。
此时的“all”选项会以熔丝位的初始状态定义来配置芯片的熔丝位,而实际上其往往并不是用户所需要的配置结果。
如果要使用“all”选项,应先使用“read->fuse bits”读取芯片中熔丝位实际状态后,再使用“all”选项。
(4)新的AVR芯片在使用前,应首先查看它熔丝位的配置情况,再根据实际需要,进行熔丝位的配置,并将各个熔丝位的状态记录备案。
(5)AVR芯片加密以后仅仅是不能读取芯片内部Flash和E2PROM 中的数据,熔丝位的状态仍然可以读取但不能修改配置。
芯片擦除命令是将Flash和E2PROM中的数据清除,并同时将两位锁定位状态配置成“11”,处于无锁定状态。
ATMEGA128熔丝位配置详解
ATMEGA128熔丝位配置详解熔丝位配置2009-07-29 11:51在配置熔丝位时应特别注意,部分熔丝位(如OCDEN、JTAGEN和SPIEN等)的配置是不可逆的2009年04月17日星期五 11:28引言AVR系列单片机在仿真调试之前,首先必须对AVR的熔丝位和锁定位进行配置。
如果配置不当,则可能造成单片机不能正常工作,严重时可能导致单片机死锁。
因此,对单片机熔丝位和锁定位的正确配置显得尤为重要。
熔丝位是对单片机具体功能和工作模式的限定,其正确配置与否直接影响到单片机能否正常工作;锁定位是对单片机的程序和数据进行加密,以防止单片机中的程序和数据被读出或写入。
在进行配置时,一般先配置熔丝位,再配置锁定位。
锁定位又分为引导程序区锁定位和程序及数据存储器锁定位两类。
对引导程序区锁定位进行编程可以实现两套保护模式,即应用区保护模式和Boot Loader区保护模式;不同的编程配置可以实现不同的加密级别。
对程序及数据存储器锁定位进行编程可以禁止对并行和SPI/JTAG串行编程模式中Flash和EEPROM进一步编程,从而对程序和存储器中的数据进行保护。
由于引导程序锁定位和程序及数据存储器锁定位的配置具有可逆性,因此可根据不同的需要多次编程,灵活改变。
但是,在配置熔丝位时应特别注意,部分熔丝位(如OCDEN、JTAGEN和SPIEN等)的配置是不可逆的。
在采用单一编程下载情况下(例如只采用JTAG下载或者只采用AVRISP并行下载),一旦配置后将不可改变。
鉴于熔丝位配置的重要性,本文以AVR系列的ATmega128单片机为例,详细介绍熔丝位的配置以及在配置过程中常出现的一些问题,并给出相应的解决办法,成功地解决了因熔丝位配置不当而引起的单片机不能正常工作和死锁等一系列问题。
1 熔丝位的配置ATmega128的熔丝位共有3个字节:熔丝位扩展字节、熔丝位高字节和熔丝位低字节。
表1、表2和表3分别描述了所有熔丝位的功能、默认值以及它们是如何映射到熔丝位字节的。
PWM 正弦波
STC12C5A60S2 正弦波取自《M128》上。
供参考。
一、定时/计数器PWM设计要点根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点:1.首先应根据实际的情况,确定需要输出的PWM频率范围,这个频率与控制的对象有关。
如输出PWM 波用于控制灯的亮度,由于人眼不能分辨42Hz以上的频率,所以PWM的频率应高于42Hz,否则人眼会察觉到灯的闪烁。
2.然后根据需要PWM的频率范围确定ATmega128定时/计数器的PWM工作方式。
AVR定时/计数器的PWM模式可以分成快速PWM和频率(相位)调整PWM两大类。
3.快速PWM可以的到比较高频率的PWM输出,但占空比的调节精度稍微差一些。
此时计数器仅工作在单程正向计数方式,计数器的上限值决定PWM的频率,而比较匹配寄存器的值决定了占空比的大小。
PWM频率的计算公式为:PWM频率= 系统时钟频率/(分频系数*(1+计数器上限值))4.快速PWM模式适合要求输出PWM频率较高,但频率固定,占空比调节精度要求不高的应用。
5.频率(相位)调整PWM模式的占空比调节精度高,但输出频率比较低,因为此时计数器仅工作在双向计数方式。
同样计数器的上限值决定了PWM的频率,比较匹配寄存器的值决定了占空比的大小。
PWM频率的计算公式为:PWM频率= 系统时钟频率/(分频系数*2*计数器上限值))6.相位调整PWM模式适合要求输出PWM频率较低,但频率固定,占空比调节精度要求高的应用。
当调整占空比时,PWM的相位也相应的跟着变化(Phase Correct)。
7.频率和相位调整PWM模式适合要求输出PWM频率较低,输出频率需要变化,占空比调节精度要求高的应用。
此时应注意:不仅调整占空比时,PWM的相位会相应的跟着变化;而一但改变计数器上限值,即改变PWM的输出频率时,会使PWM的占空比和相位都相应的跟着变化(Phase and Frequency Correct)。
Atmega128开发板使用说明书
Atmega128开发板使用说明书概要介绍Atmega128开发板上硬件资源丰富,接口齐全,基本上涵盖了Atmega128单片机所能涉及到的所有功能,可以满足单片机开发工程师和电子爱好者的开发实验的需求,或者高校电子、计算机专业学生的学习实验的需要。
按照正规产品的要求设计,不纯粹是实验样品,器件选型、原理图、PCB设计的时候都充分考虑了可靠稳定性。
Atmega128的IO口资源丰富,板上所以接口都是独立使用的,不需要任何跳线进行设置, IO口外围扩展使用了2片锁存器74HC574,既可以使实验变得更加简单方便,又能让实验者掌握更多的单片机设计知识。
提供配套软件源代码,学习板的每个实验都有与其相对应的软件代码,是版主从多年的工作经验中提取出来的,并经过优化,具有较高的参考价值。
编程简单,学习板编程不需要专用烧录器,利用计算机的并口即可进行编程,速度快、操作简单。
1.产品清单Atmega128开发板的配件清单如下,当您第一次拿到产品的时候,请参照下图认真核对包装内配件是否齐全,以及各配件是否完好无损。
请按照下图安装122*32 LCD,lCD的一脚对准122*32 LCD插座的一脚,切记不要插反2.硬件布局说明步进电机接口直流电机接口数字温度传感器SD卡插座光敏电阻ADC输入电位器NTC热敏电阻JTAG接口继电器接口9V电源输入接口DAC输出接口RS485接口RS232接口红外发射管ISP编程接口LCD对比度调节电位器122 * 32点阵LCD接口16 * 2字符LCD接口红外接收管433M射频模块接口3 *4 矩阵键盘3.接口说明接口管脚顺序的确认方法●对于有卡口的接口,应对着卡口的方向看,最左边为第一个管脚,如下图所示:●对于用螺丝压线的接口,应对着入线的方向看,最左边为第一个管脚,如下图所示:特别提示:ISP下载接口与JTAG接口封装相同,下载程序时使用ISP接口,不要插到JTAG 接口上4.硬件开发环境的建立本站出售的AVR单片机学习板就是一套完整的硬件环境,它由学习板、电源、并口ISP 下载线等组成。
ATmega128开发板功能说明
开发板使用文档1、 PCB 视图:2、 开发板电源1、输入电压:9~12V2、USB 供电:5V3、 跳冒说明:J0:蜂鸣器跳冒J1:使用12864液晶时,由于不同厂家生产的液晶的19脚和20脚有所不同,为了方便使用,采用跳冒形式选择适合你液晶的接口,J2:使用1602液晶时跳冒选择:J1 A K 19脚 3‐1 3‐4 20脚2‐12‐4液晶 跳冒选择12864 2‐4(12864并行),3‐4(12864串并程序选择)16022‐4(1602必选)3、功能说明:1、温度传感器18B202、两通道ADC3、4位数码管显示4、实时时钟DS13025、串口0,串口16、SD卡读写7、IIC_24C02(TWI)8、RS485通讯9、LCD12864接口10、LCD1602接口11、6个按键(有上,下,左,右,确定,取消)12、跑马灯13、SPI14、JTAG接口15、ISP接口16、蜂蜜器17、USB供电18、I/O口扩展4、实验例程:1、跑马灯2、数码管显示3、蜂鸣器4、定时器0输出方波5、定时器2中断6、外部中断7、串口实验 8、RS4859、AT24C02 10、按键实验11、1602液晶显示 12、12864液晶显示13、ADC数码管显示实验 14、ADC在12864液晶显示15、DS18B20数码管显示 16、DS18B20液晶1620显示17、DS18B20液晶LCD12864显示 18、DS1302实时时钟1602显示19、DS1302实时时钟LCD12864显示 20、DS18B20实时时钟液晶显示21、串口多机通讯 22、RS485多机通讯23、SD卡读写 24、SPI通讯25、μCOS-II在ATmega128开发板上的移植。
Mega128单片机调试与设置
Mega128单片机调试与设置一、单片机型号为ATmega128A二、调试软件为iccavr7.22和AVRstudio4.0连调三、流程:1.在iccavr中建立工程文件。
2.在iccavr中新建一个项目,并保存。
注意保存文件名必须为.c才可以。
如下图。
3.在右上方file里面右键添加.c 文件。
4.然后编写程序。
注意一般程序包括如下库文件:#include <iom128v.h>#include <macros.h>#include <stdio.h>#include <string.h>5.在利用系统生成(build)钱,一定要进行系统相关的设置,此项非常重要,否则会出现各种问题。
特别是单片机的选取,一定要按照下图选取,选择ATmega1280是不对的。
具体设置在project -> options6.设置完毕后,建立工程。
7.无错误应该为下图8.然后打开AVRstudio,打开projectwizard -> open,然后打开后缀名为.cof 的文件,如下图所示:然后会自动生成后缀名为.aps的工程文件9.然后选择10.连接成功后直接进入到如下界面11.点击黑色的AVR进行基本的设置单片机为ATmega128,JTAG mode ,然后添加 .hex 文件。
熔丝位的设置如下,只有这几个有“√”,特别要注意将M103C 的“√”去掉。
内部1M 晶振用外部8M 晶振用注意此处要修改烧入单片机的程序名称,后缀名为 .hex ,在iccavr 建立的工程文件里添加点击program 即将程序烧写进入单片机中其他一般不要设置。
12.都设置完毕后就可以进行debug或者是烧写程序了。
Debug点击绿色按钮或者在debug里选择。
AVR单片机定时器输出PWM的设计及注意问题
一、定时/计数器PWM设计要点根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点:1.首先应根据实际的情况,确定需要输出的PWM频率范围,这个频率与控制的对象有关。
如输出PWM波用于控制灯的亮度,由于人眼不能分辨42Hz以上的频率,所以PWM的频率应高于42Hz,否则人眼会察觉到灯的闪烁。
2.然后根据需要PWM的频率范围确定ATmega128定时/计数器的PWM工作方式。
AVR定时/计数器的PWM模式可以分成快速PWM和频率(相位)调整PWM两大类。
3.快速PWM可以的到比较高频率的PWM输出,但占空比的调节精度稍微差一些。
此时计数器仅工作在单程正向计数方式,计数器的上限值决定PWM的频率,而比较匹配寄存器的值决定了占空比的大小。
PWM频率的计算公式为:PWM频率 = 系统时钟频率/(分频系数*(1+计数器上限值))4.快速PWM模式适合要求输出PWM频率较高,但频率固定,占空比调节精度要求不高的应用。
5.频率(相位)调整PWM模式的占空比调节精度高,但输出频率比较低,因为此时计数器仅工作在双向计数方式。
同样计数器的上限值决定了PWM的频率,比较匹配寄存器的值决定了占空比的大小。
PWM频率的计算公式为:PWM频率 = 系统时钟频率/(分频系数*2*计数器上限值))6.相位调整PWM模式适合要求输出PWM频率较低,但频率固定,占空比调节精度要求高的应用。
当调整占空比时,PWM的相位也相应的跟着变化(Phase Correct)。
7.频率和相位调整PWM模式适合要求输出PWM频率较低,输出频率需要变化,占空比调节精度要求高的应用。
此时应注意:不仅调整占空比时,PWM的相位会相应的跟着变化;而一但改变计数器上限值,即改变PWM的输出频率时,会使PWM的占空比和相位都相应的跟着变化(Phase And Frequency Correct)。
8.在PWM方式中,计数器的上限值有固定的0xFF(8位T/C);0xFF、0x1FF、0x3FF(16位T/C)。
ATMEGA128熔丝位配置详解
ATMEGA128熔丝位配置详解熔丝位配置2009-07-29 11:51在配置熔丝位时应特别注意,部分熔丝位(如OCDEN、JTAGEN和SPIEN等)的配置是不可逆的2009年04月17日星期五 11:28引言AVR系列单片机在仿真调试之前,首先必须对AVR的熔丝位和锁定位进行配置。
如果配置不当,则可能造成单片机不能正常工作,严重时可能导致单片机死锁。
因此,对单片机熔丝位和锁定位的正确配置显得尤为重要。
熔丝位是对单片机具体功能和工作模式的限定,其正确配置与否直接影响到单片机能否正常工作;锁定位是对单片机的程序和数据进行加密,以防止单片机中的程序和数据被读出或写入。
在进行配置时,一般先配置熔丝位,再配置锁定位。
锁定位又分为引导程序区锁定位和程序及数据存储器锁定位两类。
对引导程序区锁定位进行编程可以实现两套保护模式,即应用区保护模式和Boot Loader区保护模式;不同的编程配置可以实现不同的加密级别。
对程序及数据存储器锁定位进行编程可以禁止对并行和SPI/JTAG串行编程模式中Flash和EEPROM进一步编程,从而对程序和存储器中的数据进行保护。
由于引导程序锁定位和程序及数据存储器锁定位的配置具有可逆性,因此可根据不同的需要多次编程,灵活改变。
但是,在配置熔丝位时应特别注意,部分熔丝位(如OCDEN、JTAGEN和SPIEN等)的配置是不可逆的。
在采用单一编程下载情况下(例如只采用JTAG下载或者只采用AVRISP并行下载),一旦配置后将不可改变。
鉴于熔丝位配置的重要性,本文以AVR系列的ATmega128单片机为例,详细介绍熔丝位的配置以及在配置过程中常出现的一些问题,并给出相应的解决办法,成功地解决了因熔丝位配置不当而引起的单片机不能正常工作和死锁等一系列问题。
1 熔丝位的配置ATmega128的熔丝位共有3个字节:熔丝位扩展字节、熔丝位高字节和熔丝位低字节。
表1、表2和表3分别描述了所有熔丝位的功能、默认值以及它们是如何映射到熔丝位字节的。
AVR ATmega128全功能工业控制器设计文档说明书
AVR单片机的全功能工业控制器设计吴焕琅深圳市中天越华自动控制科技有限公司摘要:介绍一款工业级的实用全功能控制器。
该控制器能隔离采集多种输入信号,输出多种控制信号;具有实时时钟、历史数据存储功能,彩色液晶显示界面,带有触摸屏操作和远程通信接口。
核心部分CPU采用AVR ATmega128单片机。
目前已用于批量生产。
关键词:隔离采集控制单片机彩色显示485接口ATmega128DS1642引言在自动控制产品的设计过程中,实现方案的选择常常是很矛盾的。
使用可编程逻辑控制器(PLC)和人机界面(HMI)来实现,开发速度较快,但成本太高,所开发的产品没有市场竞争力;使用单片机开发,成本低但开发周期长、开发量大且通用性不好。
用户需要的是一种成本低、开发周期较短、通用性较好的控制器,因此全功能工业控制器有很大的应用市场。
全功能工业控制器的整个电路分为信号隔离输入部分、控制器输出部分、实时时钟与历史数据存储部分、彩色液晶显示和触摸屏控制部分、通信接口等。
1信号隔离输入电路信号隔离输入电路分为开关量隔离输入、模拟量隔离输入、高速电脉冲隔离输入,电路如图1所示,开关量的隔离输入较为简单,输入信号采用光耦进行隔离后送入单片的普通I/O,单片机用查询方式进行采集。
图1信号隔离输入电路高速电脉冲的采集需要注意的是,所设计的电路必须适应高速信号采集的要求,因此隔离光耦应采用高速光耦(如6N137等)。
采用查询方式采集高速脉冲容易造成采集数据的丢失,高速脉冲应采用中断方式进行采集。
模拟量隔离采集是本控制器的一个重点和难点,笔者之前采用了线性光耦等多种方式进行模拟量的隔离采集实验,均未获满意的效果。
这里采用一种先将模拟量数字化(使用AD7705),然后通过有光耦隔离的数据口送到CPU进行模拟量隔离采集的方式,效果理想。
2控制器输出电路控制器的输出方式有继电器输出、晶体管输出、模拟电压输出,如图2所示。
继电器输出和晶体管输出电路较为简单,这里不作详细的介绍。
mega128-128L原理与开发应用指南(中文)
产品特点•高性能、低功耗的 AVR® 8位微处理器•先进的 RISC 结构–133条指令 – 大多数可以在一个时钟周期内完成–32 x 8 通用工作寄存器 + 外设控制寄存器–全静态工作–工作于16 MHz时性能高达16 MIPS–只需两个时钟周期的硬件乘法器•非易失性的程序和数据存储器–128K 字节的系统内可编程Flash寿命: 10,000次写/擦除周期–具有独立锁定位、可选择的启动代码区通过片内的启动程序实现系统内编程真正的读-修改-写操作–4K字节的EEPROM寿命: 100,000次写/擦除周期–4K 字节的内部SRAM–多达64K字节的优化的外部存储器空间–可以对锁定位进行编程以实现软件加密–可以通过SPI实现系统内编程•JTAG接口(与IEEE 1149.1标准兼容)–遵循JTAG标准的边界扫描功能–支持扩展的片内调试–通过JTAG接口实现对Flash, EEPROM, 熔丝位和锁定位的编程•外设特点–两个具有独立的预分频器和比较器功能的8位定时器/计数器–两个具有预分频器、比较功能和捕捉功能的16位定时器/计数器–具有独立预分频器的实时时钟计数器–两路8位PWM–6路分辨率可编程(2到16位)的PWM–输出比较调制器–8路10位ADC8个单端通道7个差分通道2个具有可编程增益(1x, 10x, 或200x)的差分通道–面向字节的两线接口–两个可编程的串行USART–可工作于主机/从机模式的SPI串行接口–具有独立片内振荡器的可编程看门狗定时器–片内模拟比较器•特殊的处理器特点–上电复位以及可编程的掉电检测–片内经过标定的RC振荡器–片内/片外中断源–6种睡眠模式: 空闲模式、ADC噪声抑制模式、省电模式、掉电模式、Standby模式以及扩展的Standby模式–可以通过软件进行选择的时钟频率–通过熔丝位可以选择ATmega103兼容模式–全局上拉禁止功能•I/O和封装–53个可编程I/O口线–64引脚TQFP与 64引脚 MLF封装•工作电压–2.7 - 5.5V ATmega128L–4.5 - 5.5V ATmega128•速度等级–0 - 8 MHz ATmega128L–0 - 16 MHz ATmega128微处理器,具有128K字节的系统2ATmega1282467L–AVR–05/04引脚配置Figure 1. ATmega128的引脚综述ATmega128为基于AVR RISC 结构的8位低功耗CMOS 微处理器。
ATmega128几个常用程序例子要点
ATMEGA128相关例程自己学avr单片机已经有相当一段时间了,一开始用的是atmega128,觉得不是很好用。
于是自己去买了一块16L的芯片,觉得还行。
一开始用的是ICC AVR,应为它用起来比较简单,不像winavr那样,要写个Makefie,比较的麻烦,但icc avr的缺点是太过于简陋,调试程序时,感觉不是很好。
后来经同学介绍,用起了winavr,其实也是比较的简单,只不过要加一个makefile而已,其实makefile可以用软件自带的组建自动生成,只需修改几个参数就可以用。
后来又用起了code vision avr,虽然不太习惯,也谈不上不好用.需要注意的是,三个不同的软件所带的同文件不一样。
icc avr 是iom128v.h(姑且以128为例),winavr 是avr/io.h,不过makefile中要设置芯片为atmega128.而cvavr则是mega128.h。
记得一开始的时候,我对这些不同的同文件不是很理解,是从一个学长那里了解到,才弄明白的。
其实前两个软件只需把头文件稍微改一下基本上可以通用。
而最后一个软件的中断的写法似乎不太一样,因而和钱两个软件的兼容性是最差的。
总体说winavr给人的感觉是比较专业自己学习时多总结吧!1、流水灯/*硬件环境:atmega128开发板软件环境:CodeVisionAVR-C*/#include <mega128.h>#define uchar unsigned char#define uint unsigned intuchar cnt;void timer1_init(){TCCR1B=0X00; //先停止定时器1TCNT1H=0XF0; //设定定时器初值TCNT1L=0XBE;TCCR1A=0X00; //启动定时器1TCCR1B=0X05; //使用1024分频}interrupt [TIM1_OVF] void timer1_ovf_isr(void){TCNT1H=0XF0; //重载定时器初值TCNT1L=0XBE;DDRE|=1<<2;PORTE|=1<<2;DDRA=0xff;PORTA=cnt; //输出led的值到端口Bcnt++;if(cnt==255)cnt=0;}void main(){//DDRB=0XFF;SREG|=0X80;TIMSK=0X04;timer1_init();while(1){;}}2、AD转换+数码管显示/*********************************************************************** ****//*ADC测试程序*//*目标器件:ATmega128 *//*晶振:RC 8MHZ *//*编译环境:ICCAVR 7.13A *//*E-Mail:number007cool@ *//*时间:2010年11月13日*///Aref接AVCC(+5V),采用Aref作参考电压/*用数码管显示AD转换的结果*//*********************************************************************** ****//*********************************包含头文件********************************/#include <iom128v.h>#include <macros.h>/********************************数码管段码表*******************************/extern const unsigned char tab[]={0x3f,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};/*********************************全局变量**********************************/unsigned int adc_rel=0;/*********************************************************************** *****函数功能:ADC初始化函数入口参数:出口参数:************************************************************************ ****/void adc_init(void){DDRF&=0XFE; //PORTF0设置为输入,即作为ADC0口输入模拟电压PORTF&=0XFE; //PORTF0设置为输入低电平ADCSRA=0x00; //关ADCADMUX = 0X00; //采用Aref作为参考电压,ADC0单端输入,右对齐ACSR=(1<<ACD);ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1); //ADEN,启动ADC;ADSC,ADC开始转换;ADIE,ADC中断使能;ADPSx,设置分频因子64}/*********************************************************************** *****函数功能:ADC中断函数入口参数:出口参数:************************************************************************ ****/#pragma interrupt_handler adc_isr:iv_ADCvoid adc_isr(void){//int data_h,data_l;//data_l=ADCL;//data_h=ADCH;ADCSRA = 0x00;ADCSRA = (1<<ADEN)|(1<<ADSC)|(1<<ADIE);adc_rel=ADC;/*if(adc_rel>0x1ff){PORTA|=1<<2;}elsePORTA&=~(1<<2);*/}/*********************************************************************** *****函数功能:延时子程序入口参数:出口参数:************************************************************************ ****/void delay(void){int i;for(i=0;i<1800;i++);}/*********************************************************************** *****函数功能:显示子程序入口参数:k出口参数:************************************************************************ ****/void display(unsigned int k)//发光二极管显示初始化{DDRE|=1<<2;PORTE|=1<<2;DDRA=0XFF;PORTA=k;}#define SS 0#define SCK 1#define MOSI 2#define MISO 3#define SS_H() PORTB|=(1<<SS)#define SS_L() PORTB&=~(1<<SS)#define led0_en() {DDRB|=1<<4;PORTB|=(1<<4);} //开第一个数码管的位选#define led0_dis() {DDRB|=1<<4;PORTB&=~(1<<4);} //关第一个数码管的位选#define led1_en() {DDRB|=1<<5;PORTB|=(1<<5);}#define led1_dis() {DDRB|=1<<5;PORTB&=~(1<<5);}#define led2_en() {DDRB|=1<<6;PORTB|=(1<<6);}#define led2_dis() {DDRB|=1<<6;PORTB&=~(1<<6);}#define led3_en() {DDRB|=1<<7;PORTB|=(1<<7);}#define led3_dis() {DDRB|=1<<7;PORTB&=~(1<<7);}#define OE 7#define point 3#define dp 7#include <iom128v.h>#include <macros.h>const unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66, //0,1,2,3,40x6D,0x7D,0x07,0x7F,0x6F, //5,6,7,8,9 0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; //a,b,c,d,e,f volatile unsigned char led_buffer[4];void delay_1us(void) //1us延时函数{asm("nop");}void delay_nus(unsigned int n) //N us延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1us();}void delay_1ms(void) //1ms延时函数{unsigned int i;for (i=0;i<1140;i++);}void delay_nms(unsigned int n) //N ms延时函数{unsigned int i=0;for (i=0;i<n;i++)delay_1ms();}/*完成spi的初始化*/void spi_init(void){DDRB |= (1<<MOSI)|(1<<SCK)|(1<<SS);//设置MOSI,SCK输出SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0)|(1<<SPR1);//使能SPI,主机模式}/*spi主机传送数据*/void SPI_MasterTransmit(char Data){/* 启动数据传输*/SPDR = Data;/* 等待传输结束*/while(!(SPSR & (1<<SPIF)));}/*完成对HC595的初始化*/void HC_595_init(void){DDRC |= (1<<OE); //设置PORTC7为输出PORTC &= (1<<OE); //输出高电平,使能595 PORTB = 0x0F; //同时打开四个数码管的位选 spi_init();led_buffer[0]=16; //初始化数码管段码led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=16;}/*HC595完成传送数据*/void HC_595_OUT(unsigned char data){SS_L();SPI_MasterTransmit(data);SS_H();}void leddis_update(void){/*最低位数码管,第四个数码管*/if(point==0)HC_595_OUT(table[led_buffer[3]]|(1<<dp)); elseHC_595_OUT(table[led_buffer[3]]);led0_en();delay_nus(60);led0_dis();if(point==1)HC_595_OUT(table[led_buffer[2]]|(1<<dp)); elseHC_595_OUT(table[led_buffer[2]]);led1_en();delay_nus(60);led1_dis();if(point==2)HC_595_OUT(table[led_buffer[1]]|(1<<dp)); elseHC_595_OUT(table[led_buffer[1]]);led2_en();delay_nus(60);led2_dis();/*最高位数码管,第一个数码管*/if(point==3)HC_595_OUT(table[led_buffer[0]]|(1<<dp));elseHC_595_OUT(table[led_buffer[0]]);led3_en();delay_nus(60);led3_dis();}void display_led(unsigned int data){if(data>9999){HC_595_OUT(0xFF);//当计数大于9999时,四个数码管同时输出8 PORTB|=((1<<4)|(1<<5)|(1<<6)|(1<<7));}else if(data>999){led_buffer[0]=data/1000;led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>99){led_buffer[0]=data/1000; //关闭最高位的那个数码管led_buffer[1]=(data%1000)/100;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else if(data>9){led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=(data%100)/10;led_buffer[3]=data%10;leddis_update();}else{led_buffer[0]=data/1000;led_buffer[1]=16;led_buffer[2]=16;led_buffer[3]=data%10;leddis_update();}}volatile unsigned int countnum=0;void timer1_init(void){TCCR1B = 0x00; //stopTCNT1H = 0x8F; //setupTCNT1L = 0x81;OCR1AH = 0x70;OCR1AL = 0x7F;OCR1BH = 0x70;OCR1BL = 0x7F;OCR1CH = 0x70;OCR1CL = 0x7F;ICR1H = 0x70;ICR1L = 0x7F;TCCR1A = 0x00;TCCR1B = 0x04; //start Timer}#pragma interrupt_handler timer1_ovf_isr:15 void timer1_ovf_isr(void){TCNT1H = 0x8F; //reload counter high value TCNT1L = 0x81; //reload counter low value countnum++;if(countnum>9999) countnum=0;}void init_devices(void){CLI(); //disable all interruptstimer1_init();TIMSK = 0x04; //timer interrupt sourcesSEI(); //re-enable interrupts}/*********************************************************************** *****函数功能:主程序入口参数:出口参数:************************************************************************ ****/void main(void){init_devices();HC_595_init();adc_init();SEI();//开全局中断变量display(0);while(1){delay();display_led(adc_rel/1024.0*5*1000);}}3、对EEPROM进行读写操作/************************************************文件:main.c用途:注意:内部8M晶振************************************************/#include "config.h"/*向EEPROM里面写入数据输入量:地址,数据*/void EEPROM_write(unsigned int uiAddress,unsigned char ucData){while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //地址EEDR = ucData; //数据EECR |=(1<<EEMWE); //置位EEMWE,主机写使能EECR |=(1<<EEWE); //置位EEWE,写使能,启动写操作}/*从EEPROM指定的地址里面读出相应的数据*/unsigned char EEPROM_read(unsigned int uiAddress){while(EECR&(1<<EEWE)); //等待上一次写操作结束EEAR = uiAddress; //设置地址寄存器EECR |=(1<<EERE); //读使能return EEDR; //返回读入EEDR里面的数据}void main(void){unsigned char temp=123;unsigned char data;HC_595_init();EEPROM_write(0x01,temp);data=EEPROM_read(0x01);while(1){Seg7_Led_display(data); //调用显示函数将写入的数据又读出来}}文件: eeprom12.rar大小: 40KB下载: 下载4、定时器0(轮循方式)/*定时器0和2(均为八位的定时计数器)有四种工作模式,此例是工作在普通模式。
ATMEGA128实验开发板用户手册
ATMEGA128实验开发板用户手册V1.32011年5月E-mail: sdfdlut@1. ATMEGA128单片机概述ATMEGA128单片机是ATMEL公司推出的一款基于AVR内核,采用RISC结构,低功耗CMOS的8位单片机。
由于在一个周期内执行一条指令,ATMEGA128可以达到接近1MIPS/MHz的性能。
其内核将32个工作寄存器和丰富的指令集联结在一起,所有的工作寄存器都与ALU(逻辑单元)直接连接,实现了在一个时钟周期内执行一条指令可以同时访问两个独立的寄存器。
这种结构提高了代码效率,是AVR的运行速度比普通的CISC单片机高出10倍。
ATMEGA128单片机具有以下特点:128KB的可在系统编程/应用编程(ISP/IAP)Flash 程序存储器,4KB E2PROM,4KB SRAM,32个通用工作寄存器,53个通用I/O口,实时时钟计数器(RTC),4个带有比较模式灵活的定时器/计数器,2个可编程的USART接口,一个8为面向字节的TWI(I2C)总线接口,8通道单端或差分输入的10位ADC(其中一个差分通道为增益可调),可编程带内部振荡器的看门狗定时器,一个SPI接口,一个兼容IEEE 1149.1标准的JTAG接口(用于在线仿真调试和程序下载),6种可通过软件选择的节电模式。
2. ATMEGA128实验开发套件本实验开发套件包括:●测试通过的MEGA128实验板1块;●配套资料光盘1张;●AVR ISP并口下载线1条;●5110液晶模块1个;●遥控器1个;●USB ASP下载线(选配);●AVR JTAGICE仿真器(选配)。
其中资料光盘的内容主要包括:●ATMEGA128实验开发板用户手册.pdf(本文档);●AVR教程:⏹WINAVR 使用入门.pdf⏹AVR Studio 使用入门.pdf⏹AVR基本硬件线路设计与分析.pdf⏹芯艺的AVR_GCC教程.pdf⏹AVR的IO结构分析与范例.mht⏹AVR高速嵌入式单片机原理与应用●芯片手册(包括24C02、74HC595以及中文的I2C协议文档等内容)●开发工具软件;⏹AVR Studio V4.12;⏹WINAVR(GCC) 编译器;⏹IAR for AVR V4.10A;⏹并口下载工具PONYPROG V2.06;⏹ICCAVR 双龙提供;图3 新建工程对话框点击Next,进入第三步。
ATmega128在开发应用中应注意的问题
此外,ATmega128自带输入上拉电阻功能,通过设置即可以实现其功能。
例如将PA口设为输入口并且加上拉电阻,可以如下设置:DDRA=0x00;//将PA口设置为输入端口PORA=0xff;//将PA输入口加上拉电阻(2)位操作的使用方法采用ICCAVR对ATmega128的位操作的使用方法比较麻烦,不像51系列那样可以直接对某一个引脚进行置0或置1,而是要通过如下的方法进行位操作:如要对PA端口的第1位置1,则用C语言必须按PORTA|=(1<<pa1)编写;如要对pa端口的第2位置0,则用c语言必须按porta&=*(1<<pa2)编写。
<> </pa1)编写;如要对pa端口的第2位置0,则用c语言必须按porta&=*(1<<pa2)编写。
<>这样就可以单独对某一位操作而不影响其他位。
位操作对其他寄存器也同样适合,例如若要对某个口的几位设为输入,某几位设为输出,就可以通过上面的置1、置0方法来实现。
(3)中断ATmega128中断资源丰富,一共有35个中断源,在ICCAVR的iom128v.h头文件中给出了这些中断源对应的中断向量表。
当用到相应的中断时,首先应设置好对应的中断向量。
用ICCAVR设置ATmega128中断的方法与Keil51设置中断的方法截然不同,例如若需要将ATmega128的串口0设置为中断接收,就必须在程序中做如下设置:#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC否则程序不能中断接收,延长开发过程。
ATmega128作为一种功能强大的芯片,相信会在不同的领域发挥不同的作用,为此需要人们不断地提高对ATmega128的认识。
而且ATmega128与AVR等其他单片机如ATmega8、ATmega103、AT90S8535系列有相同的开发方法,掌握了ATmega128就可以在开发其他AVR类型的单片机时应用自如。
AVRATMega128自引导IAP(bootload)的应用设计
AVR ATMega128自引导IAP(boot load)的应用设计嵌入式2009-08-11 16:11 阅读43 评论0字号:大中小ATmega128具备引导加载支持的用户程序自编程功能(In-Sysytem Programming b y On-chip Boot Program),它提供了一个真正的由MCU本身自动下载和更新(采用读/写同时“Read-While-Write”进行的方式)程序代码的系统程序自编程更新的机制。
利用AV R的这个功能,可以实现在应用编程(IAP)以及实现系统程序的远程自动更新的应用。
IAP的本质就是,MCU可以灵活地运行一个常驻Flash的引导加载程序(Boot Loa der Program),实现对用户应用程序的在线自编程更新。
引导加载程序的设计可以使用任何的可用的数据接口和相关的协议读取代码,或者从程序存储器中读取代码,然后将代码写入(编程)到Flash存储器中。
引导加载程序有能力读写整个Flash存储器,包括引导加载程序所在的引导加载区本身。
引导加载程序还可以对自身进行更新修改,甚至可以将自身删除,使系统的自编程能力消失。
引导加载程序区的大小可以由芯片的熔丝位设置,该段程序区还提供两组锁定位,以便用户选择对该段程序区的不同级别的保护。
本节将给出一个实际的的Boot Loader程序,它可以配合Windows中的超级终端程序,采用Xmodem传输协议,通过RS232接口下载更新用户的应用程序。
1.1 基本设计思想1.1.1 Boot Loader程序的设计要点Boot Loader程序的设计是实现IAP的关键,它必须能过通过一个通信接口,采用某种协议正确的接收数据,再将完整的数据写入到用户程序区中。
本例Boot Loader程序的设计要点有:l 采用ATmega128的USART口实现与PC之间的简易RS232三线通信;l 采用Xmodem通信协议完成与PC机之间的数据交换;l 用户程序更新完成后自动转入用户程序执行;l Boot Loader程序采用C语言内嵌AVR汇编方式编写,阅读理解方便,可移植性强,代码小于1K字。
微控制器ATmega128时间触发嵌入式系统设计
如 图 1 示 . 用 A m g 1 8微 处 理 器 . 上 以 下几 部 分 所 采 T ea 2 加
的及 时性 上 比 实 际要 差 .最 坏 的情 况 下任 务 响应 时 间取 决 于 整个 循 环 的执 行 时 间 。 业 化 实 时 内核 虽 然 实 时性 能 好 . 价 商 但 格较高 . 不适 合 应 用 于 小 型 系统 的开 发
E e d d S s m a d a tg n r a i , O i i a p ia l n tp e lt o to y tm. mb d e y t h sa v na e i e l me S s p l b e t mi i e r a me c n r l se e t t c o y i s Ke r s tme t g e e ; co o t l r e e d d s s m; l - a k AT g 1 8 y wo d i - r g r d mi r c n r e ; m d e y t i o b e mu t ts ; me a 2 i
中 图分 类 号 : 1 7 8 T 3 11 R 9 . :P l . 3
文献 标 志 码 : B
文 章 编 号 :0 3 8 6 ( 0 7 0 — 0 3 0 10 — 8 8 2 0 )9 0 8 - 2
De i n o m e Trg r d E b d e s e b s d on ATm e a 2 s g fTi - i ge e m e d d Sy t m a e g 1 8
A src O ie T ee pa m ed dss m b s gt -r grdss m adA mea2 . l bta t be ̄ odv l ne b d e yt yui me tgee yt n T g 1 8 Me o e n i i e 蛐
atmega128熔丝位配置
这几天一直在搞AVR ATmega128的程序,显示最基本的功能,但是因为用到了PORTG端口,而这个端口在ATmega128中是放在内部SRAM中的,是为了与ATmega103兼容,出厂时默认是不可以访问的。
因为这个问题,耽搁了几天。
现在看到如下文章,终于“柳暗花明”了。
转载于此,为记!对AVR熔丝位的配置是比较细致的工作,用户往往忽视其重要性,或感到不易掌握。
下面给出对AVR熔丝位的配置操作时的一些要点和需要注意的相关事项。
(1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态,“Unprogrammed”表示熔丝状态为“1”(禁止);“Programmed”表示熔丝状态为“0”(允许)。
因此,配置熔丝位的过程实际上是“配置熔丝位成为未编程状态“1”或成为已编程状态“0”。
(2)在使用通过选择打钩“√”方式确定熔丝位状态值的编程工具软件时,请首先仔细阅读软件的使用说明,弄清楚“√”表示设置熔丝位状态为“0”还是为“1”。
(3)使用CVAVR中的编程下载程序时应特别注意,由于CVAVR 编程下载界面初始打开时,大部分熔丝位的初始状态定义为“1”,因此不要使用其编程菜单选项中的“all”选项。
此时的“all”选项会以熔丝位的初始状态定义来配置芯片的熔丝位,而实际上其往往并不是用户所需要的配置结果。
如果要使用“all”选项,应先使用“read->fuse bits”读取芯片中熔丝位实际状态后,再使用“all”选项。
(4)新的AVR芯片在使用前,应首先查看它熔丝位的配置情况,再根据实际需要,进行熔丝位的配置,并将各个熔丝位的状态记录备案。
(5)AVR芯片加密以后仅仅是不能读取芯片内部Flash和E2PROM 中的数据,熔丝位的状态仍然可以读取但不能修改配置。
芯片擦除命令是将Flash和E2PROM中的数据清除,并同时将两位锁定位状态配置成“11”,处于无锁定状态。
基于ATmega128的时间触发嵌入式系统的设计与应用
基于ATmega128的时间触发嵌入式系统的设计与应用【摘要】针对51单片机速度慢、驱动能力差、抗干扰能力低及事件触发往往带来不确定性和不稳定性等问题,提出了A VR微控制器与时间触发方式相结合的嵌入式系统。
该系统结合了A VR的硬件优势及时间触发的调度理念将系统精度有效的控制在ms级,具有占存储单元少,可靠性好,可预测性强,安全性高的特点。
实验表明,该系统适用于中小型实时控制系统,并可靠稳定运行。
【关键词】A VR;微控制器;时间触发;嵌入式系统;混合式调度器1.引言近年来,嵌入式发展迅速,采用51单片机死循环的事件触发编程方式已逐渐不能满足企业对产品稳定性和安全性的要求。
目前,嵌入式系统软件有VxWork、Linux、WinCE、μC/OS-II等,可出于成本和技术上的考虑,微控制器往往不会选取其进行设计。
在实际应用中,往往会面临同时应付多外设、多任务的情况,则对它们的相互调度必不可少。
时间触发嵌入式系统就是这样的简单实用的操作系统。
本文设计了基于A VR微控制器的时间触发多任务调度器并应用于实际。
该调度器使用传递消息(message)的方式使得微控制器在多个任务及设备间切换。
2.A VR微控制器的结构特点A VR是目前使用以该系列的ATmega128为例说明,它采用哈佛结构,RISC 指令集、低功耗、片上资源丰富的特点,极大简化了外围电路,使系统更加稳定可靠。
其特点为嵌入式系统设计提供了良好的硬件保证。
3.嵌入式两种触发方式的对比在嵌入式系统中,通常采用两种本质上不同的调度方式:事件触发和时间触发。
事件触发方式往往使用多级中断来实现,其发生时间具有随机性;而时间触发方式由一个全局时钟驱动,系统的行为在功能与时间上都是确定的,即具有可预测性。
3.1 事件触发方式存在的问题嵌入式系统开发人员有一种中断事件绝不会丢失的错误观念,这往往给开发的产品带来灾难性的后果。
中断事件丢失在实际应用中是一个不争的事实,产生的原因有多方面,但无外乎内因和外因两种。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ATmega128在开发应用中应注意的问题
摘要: ATmega128是一种与51系列不同的单片机,本文应用ICCAVR和pony prog2000作为主要开发工具,通过分析其在开发过程中特殊的开发方法,从而达到更好地掌握和使用ATmega128的目的。
关键词: ATmega128 单片机
ATmega128是AVR系列中功能最强的单片机,具有如下主要特点:
(1)先进的RISC精简指令集结构:ATmega128具有133条功能强大的指令,大部分指令在单时钟周期内执行;有32b×8个通用工作寄存器;片内带有执行时间为2个时钟周期的硬件乘法器。
(2)非易失性程序和数据存储器:ATmega128具有128KB在线可重复编程Flash、4KB的E2PROM以及4KB内部SRAM。
在其BOOT区具有独立的加密位,可通过片内的引导程序实现在系统编程,写操作时真正可读。
(3)具有JTAG接口:通过JTAG接口对Flash、E2PROM熔丝位和加密位编程。
(4)增强的硬件功能:ATmega128具有2个带预分频器和一种比较模式的8位定时/计数器;2个扩充的带预分频器和比较模式、捕获模式的16位定时/计数器;独立振荡器的实时计数器;2通道8位PWM;6通道2~16位精度PWM;8通道10位A/D转换;输出比较调节器;8个单端通道;7个微分通道;2个增益为1x、10x或200x的微分通道;二线(I2C)串行接口;2路可编程串行UART接口;主/从SPI串行接口;带内部振荡器的可编程看门狗定时器等。
(5)独有的特点:上电复位和可编程的低电压检测;内部可校准的RC振荡器;5种睡眠模式,即空闲模式、ADC噪声抑制模式、省电模式、掉电模式、待命模式和扩展待命模式;可通过软件选择时钟频率;通过1个熔丝选定ATmega103兼容模式;全局上拉禁止。
笔者通过使用ATmega128单片机,总结出在使用ATmega128过程中应注意的问题,希望能给即将使用该单片机的读者提供有用的信息。
1 ATmega128的开发工具及其应注意问题
随着用户对编译器的要求越来越高,开发商也在不断地提高编译器对用户的方便程度。
目前的大趋势是从用汇编语言开发单片机发展到用C语言开发。
笔者在对开发ATmega128编译器的选择时,考虑到时间上的局限以及开发的方便性等问题,最终选择了ImageCraft的ICCAVR工具。
ICCAVR是一种使用符合ANSI标准的C语言开发微控制器程序的工具。
它集合了编译器和工程管理器的集成工作环境(IDE),可以编译生成INTEL HEX格式文件。
ICCAVR和人们通常所用的编译器的使用的方法大同小异,故本文不再详述。
本文主要对使用中应当注意的问题作一介绍。
(1)该编译器在设置中有一项“Return Stack Size”,默认值为16,但在程序量很大而且子函数较多的情况下,该默认值就不适合了,编译时会出错。
碰到这种情况建议将该选项的值改大。
(2)在经过一段时间的使用后,发现该编译器对C语言的编译效率不是很理想。
但设置当中有一编译优化选择项“Enable Code Compression”,使用它在一定情况下可以减少程序所占的空间。
不过当程序在“default”编译优化选择的情况下所占的程序空间达到95%以上时,使用“Enable Code Compression”编译就会出错。
所以笔者认为,虽然ATmega128具有128KB的程序空间,但在使用过程中也应当考虑到数据结构方面的问题。
应用ICCAVR生成hex文件以后,下一步就是将hex文件烧录到ATmega128中去。
笔者选用的软件是PonyProg2000。
这是一款操作简单但功能强大的烧录软件,它支持包括AVR、PIC
在内的多种单片机型。
作者是通过PC机的并口以串行方式连接到ATmega128的JTAG接口的。
在烧录的整个过程当中,最关键的问题是芯片晶振的选择以及熔丝的配置。
晶振的选择较为简单,只要注意使用外部晶振还是内部晶振,并设置好相应的选项就可以了。
由于ATmega128具有IAP(应用中编程)及用户可以在应用程序中对Flash块、加密位等实现擦除和编程等操作功能,而熔丝位的设置正是实现IAP功能的必要条件,因此可以通过ATmega128的用户手册再根据自己需要的实际情况来进行设置。
正确的晶振和熔丝设置都是必不可少的,否则不能正确下载。
这一步非常重要应特别注意,以免走弯路。
下面介绍使用晶振和熔丝的设置方法。
这里采用PonyProg2000中“configruation and security bits”菜单命令来进行设置,其界面。
(1)晶振的设置方法
菜单中CKSEL0~CKSEL3是设置晶振的选项。
ATmega128由于有内部晶振,所以首先要确定是外部晶振还是内部晶振。
表1给出了内、外部晶振的范围。
表2和表3给出了内、外部晶振频率的设置方法。
(2)熔丝位的设置方法
通过JTAG接口来实现对熔丝的设置,只要设置好的相应位,就可以实现不同的功能。
关于熔丝每一位的功能,首先需要说明的是,在对熔丝位进行设置时,如果读出该位为“0”,说明该位已被设置;该位为“1”则未被设置。
ATmega128中一共有3个字节是有关熔丝的设置。
其中第1个字节只用到了低2位,分别是WDTON(看门狗始终开)和M103C(ATmega103兼容模式);第2个字节的低4位是CLK0~CLK3,高4位分别是SUT0、SUT1(启动时间选择)、BODEN(低功耗检测使能)、BODLEVEL(低功耗检测触发程度);第3个字节的每一位分别是:BOOTRST(复位向量选择)、BOOTSZ0、BOOTSZ1(BOOT区大小选择)、EESAVE(芯片擦除过程中E2PROM内容保持)、CKOPT(选择晶振操作)、SPIEN(串行下载程序使能,在PonyProg2000中没有这一位是因为PonyProg2000本身通过串行下载程序,故不能修改)、JTAGEN(JTAG使能)、OCDEN(OCD使能,OCD 即ON CHIP DEBUG)。
ATmega128有6个位锁位,其中BOOTLOCK12、BOOTLOCK11、BOOTLOCK02、BOOTLOCK01是关于BOOT区的4个位锁位,而LOCK2和LOCK1则是熔丝位的位锁位。
可以通过设置熔丝位锁位来选择使用相应的功能。
所以在使用熔丝位功能以前一定要先设置相应的“解锁”,即将LOCK2和LOCK1都设置为“1”。
若用ICCAVR来开发编译软件,再通过PonyProg2000将程序直接下载到ATmega128芯片中去,可以即时地将程序思想反映到要实现的功能上来,便于即时地修改程序中的错误,大大缩短产品的开发时间。
2 使用ATmega128芯片本身应注意的问题
ATmega128和51系列单片机基本上是2种不同的开发方式,在笔者使用过程中,总结出了以下一些常见的但必须重视的问题。
(1)管脚
ATmega128具有丰富的管脚资源,一共有8个端口共53个I/O引脚,而且每一个I/O引脚都可以通过编程来设置输入、输出方式。
ATmega128的每一个端口都有3个寄存器与之对应,现以PA口为例来说明管脚的设置。
①方向寄存器DDRA。
DDRA的每一位对应于PA口的1个I/O管脚,相应的位为1,则将该管脚设置为输出引脚;为0则设置为输入引脚。
②是输出寄存器PORTA。
用来存放ATmega128输出的数据。
③输入寄存器PINA,用来存放ATmega128输入的数据。
在对PA口进行具体操作时,首先应该设置好DDRA,然后根据DDRA来选用PORTA或者
PINA(注意一定不要搞错方向)。
此外,ATmega128自带输入上拉电阻功能,通过设置即可以实现其功能。
例如将PA口设为输入口并且加上拉电阻,可以如下设置:
DDRA=0x00; //将PA口设置为输入端口
PORA=0xff; //将PA输入口加上拉电阻
(2)位操作的使用方法
采用ICCAVR对ATmega128的位操作的使用方法比较麻烦,不像51系列那样可以直接对某一个引脚进行置0或置1,而是要通过如下的方法进行位操作:
如要对PA端口的第1位置1,则用C语言必须按PORTA|=(1
这样就可以单独对某一位操作而不影响其他位。
位操作对其他寄存器也同样适合,例如若要对某个口的几位设为输入,某几位设为输出,就可以通过上面的置1、置0方法来实现。
(3)中断
ATmega128中断资源丰富,一共有35个中断源,在ICCAVR的iom128v.h头文件中给出了这些中断源对应的中断向量表。
当用到相应的中断时,首先应设置好对应的中断向量。
用ICCAVR设置ATmega128中断的方法与Keil51设置中断的方法截然不同,例如若需要将ATmega128的串口0设置为中断接收,就必须在程序中做如下设置:
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
否则程序不能中断接收,延长开发过程。
ATmega128作为一种功能强大的芯片,相信会在不同的领域发挥不同的作用,为此需要人们不断地提高对ATmega128的认识。
而且ATmega128与AVR等其他单片机如ATmega8、ATmega103、AT90S8535系列有相同的开发方法,掌握了ATmega128就可以在开发其他AVR类型的单片机时应用自如。