AVR单片机ATMEGA16编译软件ICCAVR的使用技巧与应用示例

本文介绍了如何使用ICCAVR编译软件进行AVR单片机ATMEGA16的程序开发,从新建工程到设置晶振频率、定时器中断,再到生成机器代码和使用PROGISP烧录下载。同时提到了USBASP下载线和熔丝位设置的重要性,适合初学者入门参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、先来一段朴实的独白吧

        写这篇文的时间是2018年3月21日。大学2013毕业,专业是机械,但喜欢电子。篇首声明:哪一行都有鄙视链,就连打个游戏都不例外。如果大神路过这里,请您show your mercy然后walk away就当nothing happened.  当然,大牛都是很低调的,因为他们身心都沉进编程的世界里不能自拨。好了本文就ICCAVR的使用说明作一个入门式的引导,方便新、老网友作一种可供使用的参考。

        上大学并不是为了纯读书,而是自我发现、反馈、然后决定的心理成熟过程,好吧这就是我的层次。上学时为了搞懂一个东西,在网上查找所有的有用的信息资料,当然必须免费的,唉不谈。。现在如果需要一些资源直接买买买,省时省力省心。嗯回不去的过去。感谢在知识产权还不严谨的当时网络给了我很多。我想现在终于有些时间了,可以做一些反馈了。同时,希望一切都回归理性。

二、介绍ICCAVR

AVR单片机是ATMEL公司开发的高速8位处理。

低档Tiny系列AVR单片机: 主要有Tiny11/12/13/15/26/28等;

中档AT90S系列AVR 单片机: 主要有AT90S1200/2313/8515/8535等; (正在淘汰或转型到Mega中)

高档ATmega系列AVR单片机: 主要有ATmega8/16/32/64/128( 存储容量为8/16/32/64/128 KB)以及ATmega8515/8535等。

ICCAVR编译软件是ATMEL公司推荐的第三方编译器之一,目前ICCAVR7.22版本在网上可下载使用。

那么如何新建一个工程项目,做好准备工作,然后开始写程序代码呢,下面按步骤一步一步说明:

1 菜单》Project》New,先新建一个工程

2 在弹出的窗口中选择保存在哪个文件夹中,最好单独建个文件存放该工程。然后输入工程文件名,比如test,然后点保存。

3 菜单》File》New,来新建一个存放程序的文件

4 新建了一个窗口,窗口默认名为Untitled-1,点击一个该窗口空白处随便输入几个字符,可以看到保存按钮由灰色变成彩色,点击 菜单》File》Save,在弹出的窗口中选择保存在哪个文件夹中,最好与刚才新建的工程保存在同一个文件夹下。然后输入程序文件名,比如testpro0000.c 此处注意,要以.C结尾,表明是一个C程序文件声明,然后点保存。

5 可以看到默认的文件名Untitled-1被保存成我们输入的testpro0000.c,在界面右边目录树上鼠标右键 选择Add file(s),将此程序文件添加到第一步新建的项目test中去。

6 在弹出的窗口中 找到我们刚才建的程序文件testpro0000.c,点击打开

7 如下图,该.c文件已经在项目的目录下了,准备工作结束

8 接下来说一下重点有用的一个功能:应用生成器,就是下图中像扫把一个的小图标

9 不要犹豫,点它,弹出一个向导窗口,在CPU选项里选择我们用的型号,例如Target CPU,选M16,即ATMEGA16,Xtal speed 即晶振频率,选择你所用的晶振频率,最右边 External interrputs 即外部中断,我选中打开INT0,中断触发方式为Low level,即低电平触发。

10 在Timer0选项里选中Use Timer0 打开定时器T0,旁边Overflow interrupt意思是定时器中断溢出处理函数打开与否,选中(即一个小叉叉表示选中)打开它,因为到时我们要在这个函数里处理一些变量。Desired value 意思是你需要的数值,旁边的Units 是单位表示。比如我要定时4us,就可如下图这么选。下边Prescale select 是预分频,选择8或其它数值,可以看到右侧Actual value 表示能实现的实际精度。此项目中我们就打开INT0和T0,其它的功能先不做示例。点击OK.

11 弹出一个新的未命名Untitled窗口,里面就是我们刚才用生成器生成的程序构架,我在//后做了注释,因为并未保存该文件,所以里面的字体也没有被ICC编译器识别并以彩色颜色表示。那么,我们知道了这些函数是干什么用的,就可以开心的复制-粘贴到我们的程序文件testpro0000.c中去了,有用的信息COPY之后,下图中的Untitled-3窗口使命也就完成了,选择File》close,在弹出的窗口中选择 不保存 即可。然后就可以在testpro0000.c里写代码了、改程序 、新建变量、调试程序了,然后点击红色的编译程序按钮,显示0 errors,0 warnings 即大功告成!

12 程序编译通过以后,在我们第一步建的项目文件夹下,会产生以.hex结尾的文件,这个文件就是编译器生成的机器代码,我们可以用工具将此HEX文件烧录下载到我们的AVR单片机中去,单片机就可以执行代码了。这个软件就是 PROGISP 目前版本1.72在网上可供下载。

步1:例如调入我自己生成的Flash文件:MCU13B.hex

步2:点图上所示【自动】即可。

当然,我们要先需要一根下载线,连接电脑和AVR单片机。这根线的关键词是 USBASP ,请自行搜索,网上很多卖的,买个带保护的等等。买个次品把主板烧了就不划算了。下载很简单,选择目标CPU为ATMEGA16后,第1步【调入flash】,找到目标hex打开,第2步点【自动】即可。

13 AVR单片机熔丝位设置,在PROGISP软件中点击三个小点的一个按钮,请参见上面PROGISP主界面图中的标注,会弹出一个小窗口,有位配置方式,向导方式,选择向导方式,即可在不了解各种参数的意义下,实现编程熔丝位。请提前做些小功课,不要手抖锁死芯片哦!

14 一个小例子,仅作看看。

//ICC-AVR application builder : 2016/5/24 16:38:13
// Target : M16
// Crystal: 11.059Mhz

#include <iom16v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
uchar flag0=0,flag1=0,flag2=0;
uchar i,j,k;
void port_init(void)
{
 DDRA  = 0xFF;
 PORTA = 0xF8;

}

#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{
 i=PIND;
 i=i&0X04;
 if(i==0X00)
 {flag0=1;//external interupt on INT0
 PORTA|=0X01;}//&=0XFE
}

#pragma interrupt_handler int1_isr:iv_INT1
void int1_isr(void)
{
 j=PIND;
 j=j&0X08;
 if(j==0x00)
 {flag1=1;//external interupt on INT1
 PORTA|=0X02;}//&=0XFD
}

#pragma interrupt_handler int2_isr:iv_INT2
void int2_isr(void)
{
 k=PINB;
 k=k&0X04;
 if(k==0X00)
 {flag2=1;//external interupt on INT2
 PORTA|=0X04;}//&0XFB
}

void delayms(unsigned int ms) //16MHZ
 {
 unsigned int x,y;
  for(x=0;x<ms;x++)
    for(y=0;y<2282;y++)
	;
 }

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();
 delayms(360);//等待传感器进入稳定状态
 MCUCR = 0x0A;
 GICR  = 0xE0;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

void main( void )
{
 init_devices(); 
 while(1)
 {
   if (flag0==1)
   {
    GICR&=~(1<<INT0);
   	delayms(5000);
	//i=PIND;
    //i=i&0X04;
     //if(i==0X00)
	 //{
     PORTA&=0XFE;
	 delayms(1);
	 GICR|=(1<<INT0);
	 flag0=0;
	 //}
    }
   	   if (flag0!=1)
   	   {
   	   i=PIND;
	   i=i&0X04;
	   if(i!=0X00)
	     {
		  PORTA|=0X01;
		 }
   	    }
   if (flag1==1)
   {
    GICR&=~(1<<INT1);
    delayms(5000);
	j=PIND;
    j=j&0X08;
     if(j==0x00)
	 {
	 PORTA&=0XFD;
	 delayms(1);
	 GICR|=(1<<INT1);
	 flag1=0;
	 }
    }
      	 if (flag1!=1)
   	  	{
   	  	 j=PIND;
	  	 j=j&0X08;
	  	 if(j!=0X00)
	   	 {
		  PORTA|=0X02;
		  }
   	  	 }
   if (flag2==1)
   {
    GICR&=~(1<<INT2);
    delayms(5000);
	k=PINB;
    k=k&0X04;
	 if(k==0X00)
	 {
	 PORTA&=0XFB;
	 delayms(1);
	 GICR|=(1<<INT2);
	 flag2=0;
	 }
    }
   	   if (flag2!=1)
   	   {
   	   k=PINB;
	   k=k&0X04;
	   if(k!=0X00)
	     {
		  PORTA|=0X04;
		 }
   	    }     
 }
}

三、本文供基础参考,想深入还需要花些时间在上面。在东西比较杂的情况下,发散思维帮助融汇贯通。

2025年新春伊始,回头再看自己先前写的文章,有这么多的阅读量,感谢大家的支持。这么些年下来CSDN系统更新导致博客图片显示有点问题,而且被系统自动加入了VIP文章,导致大家阅读不便。之前都没怎么上号不知道发生了这些,25年3月17日我再次将此博文维护一下,并公开显示,提供给更多有需要的同学,祝大家事事顺利、万事如意~

欢迎关注,不定期更新,谢谢!

索奥科技中心倾情奉献 1 第2讲 AVR单片机软件开发环境 一、实验目的 1.熟悉CodeVision AVR集成开发环境 2.掌握单片机C语言开发 二、实验内容 1.在CodeVision AVR软件开发平台下创建一个工程并编译下载。 三、实验所用仪表及设备 硬件:PC机一台、AVR_SA_11实验板 软件:CodeVision AVR集成开发软件progisp下载软件 四、实验步骤 使用CodeVision AVR软件的CodeWizardAVR功能,创建一个简单的工程,编译并下载。 新建项目 (1)打开CodeVision AVR(版本V2.03.4),打开File->New,选择Project->OK,弹出一个Confirm对话框,选择Yes。如图2.1所示。 图2.1 (2)在弹出的CodeWizardAVR窗口中进行选择。在Chip选项卡中:Chip->ATmega16,Clock->1MHz。在Port选项卡中:选择PortA,修改Bit0为Out,Output Value改为1。如图2.2所示。 索奥科技中心倾情奉献 2 图2.2 (3)在CodeWizardAVR窗口中,File->Generate,Save and Exit,创建新工程。如图2.3所示。 图2.3 将新生成的源程序(.c),工程文件(.prj),CodeWizardAVR文件(.cwp),保存在一个新建文件夹下。如图2.4所示新生成的源程序。 索奥科技中心倾情奉献 3 图2.4 (4)修改源程序 在源程序在开始处添加 #include 。 在while(1)处添加四句语句。如图2.5所示。 图2.5 (5)保存。 编译项目 选择Project->Build All(Ctrl + F9),弹出Information窗口,其中No errors,No warnings表示编译成功。如图2.6所示。如果出现错误,根据错误提示修改源程序。 索奥科技中心倾情奉献 4 图2.6 下载程序 由于CodeVision AVR自带的下载软件Code Programmer修改熔丝不够灵活,我们选用progisp下载软件进行程序下载。 (1)打开progispUSBASP彩色表示使用USBASP方式下载,PRGISP彩色表示USBASP下载器连接成功,选择芯片型号。最终配置成图2.7的样子。 图2.7 (2)点击“调入Flash”选项,在工程文件夹下找到Exe文件夹,选择xx.hex文件,点击确定。如图2.8所示。 索奥科技中心倾情奉献 5 图2.8 (3)编程选项修改。按照图2.9进行选择。(注意“编程熔丝”选项,一定不要选择) 图2.9 (4)将下载器PC机USB口相连,另一端连接实验板ISP接口。使用杜邦线将任意一个LED灯PA0相连。 (5)点击“自动”,如图2.11所示为编程成功。观察LED,发现它在一闪一闪。 图2.11 五、思考题 1.用CodeWizardAVR创建工程的有什么优点? 2.创建工程的过程中应注意哪些问题? 索奥科技中心倾情奉献 6 附一:关于 avr熔丝使用和设置 (马潮) 对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”,处于无锁定状态。但芯片擦除命令并不改变其它熔丝的状态。 (6)正确的操作程序是:在芯片无锁定状态下,下载运行代码和数据,配置相关的熔丝,最后配置芯片的锁定。芯片被锁定后,如果发现熔丝配置不对,必须使用芯片擦除命令,清除芯片中的数据,并解除锁定。然后重新下载运行代码和数据,修改配置相关的熔丝,最后再次配置芯片的锁定。 (7)使用ISP串行方式下载编程时,应配置SPIEN熔丝为“0”。芯片出厂时SPIEN的状态默认为“0”,表示允许ISP串行方式下载数据。只有该处于编程状态“0”,才可以通过AVR的SPI口进行ISP下载,如果该被配置为未编程“1”后,ISP串行方式下载数据立即被禁止,此时只能通过并行方式或 JTAG编程方式才能将SPIEN的状态重新设置为“0”,开放ISP。通常情况下,应保持 SPIEN的状态为“0”,允许ISP编程不会影响其引脚的I/O功能,只要在硬件电路设计时,注意ISP接口其并接的器件进行必要的隔离,如使用串接电阻或 断路跳线等。 (8)当你的系统中,不使用 JTAG接口下载编程或实时在线仿真调试,且 JTAG接口的引脚需要作为I/O口使用时,必须设置熔丝JTAGEN的状态为“1”。芯片出厂时JTAGEN的状态默认为“0”,表示允许JTAG接口,JTAG的外部引脚不能作为I/O口使用。当JTAGEN的状态设置为“1”后,JTAG接口立即被禁止,此时只能通过并行方式或ISP编程方式才能将JTAG重新设置为“0”,开放JTAG。 (9)一般情况下不要设置熔丝把RESET引脚定义成I/O使用(如设置ATmega8熔丝RSTDISBL的状态为“0”),这样会造成ISP的下载编程无法进行,因为在进入ISP方式编程时前,需要将 RESET引脚拉低,使芯片先进入复状态。 (10)使用内部有RC振荡器的AVR芯片时,要特别注意熔丝CKSEL的配置。一般情况下,芯片出厂时CKSEL的状态默认为使用内部1MHz的RC振荡器作为系统的时钟 索奥科技中心倾情奉献 7 源。如果你使用了外部振荡器作为系统的时钟源时,不要忘记首先正确配置CKSEL熔丝,否则你整个系统的定时都会出现问题。而当在你的设计 中没有使用外部振荡器(或某钟特定的振荡源)作为系统的时钟源时,千万不要误操作或错误的把CKSEL熔丝配置成使用外部振荡器(或其它不同类型的振荡源)。一旦这种情况产生,使用ISP编程方式则无法对芯片操作了(因为ISP方式需要芯片的系统时钟工作并产生定时控制信号),芯片看上去“坏了”。此时只有使用取下芯片使用并行编程方式,或使用JTAG方式(如果JTAG为允许时且目标板上留有JTAG接口)来解救了。另一种解救的方式是:尝试在芯片的晶体引脚上临时人为的叠加上不同类型的振荡时钟信号,一旦ISP可以对芯片操作,立即将 CKSEL配置成使用内部1MHz的RC振荡器作为系统的时钟源,然后再根据实际情况重新正确配置CKSEL。 (11)使用支持IAP的AVR芯片时,如果你不使用BOOTLOADER功能,注意不要把熔丝BOOTRST设置为“0”状态,它会使芯片在上电时不是从Flash的0x0000处开始执行程序。芯片出厂时BOOTRST的状态默认为“1”。 (关于ATMega16熔丝使用和设置更详细的内容请参考《AVR单片机嵌入式系统原理应用实践》附录A或者数据手册。) 附二:CVAVR编程下载配置 下载环境配置 (1)选择“Settings——>Programmer”,其中AVR Chip Programmer Type选择“Kanda Systems STK200+/300”;Printer Port(并口号)根据电脑的实际情况选择,如图2.12所示。 图2.12 (2)然后就可以在“Tools”中选择“Chip programmer”进行程序的下载和熔丝的修改等。(比较麻烦,不建议初学者使用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值