文档库 最新最全的文档下载
当前位置:文档库 › 从ICC AVR 到 Atmel Studio 6

从ICC AVR 到 Atmel Studio 6

从ICC AVR 到 Atmel Studio 6
从ICC AVR 到 Atmel Studio 6

以前一直在用ICCAVR 感觉生成文档方便,现在发现了Atmel Studio 6, 因为偶尔会用C#(VS2010)所以一下子就喜欢上了这个编译器,我只用8bit 的AVR 另外也是刚刚接触,所以在移植过程中会遇到各种问题,以下是自己的一些问题写出来共大家参考;

1.MCU必须的头文件

例如在ICC AVR(以下简称ICC)中使用#include 或#include ,要根据不同的mcu 型号选择头文件。而在Atmel Studio 6 (以下简称AS6)中统一用#include 。(ICC AVR 7 的版本中也可以用统一的头文件了)

2.头文件

在ICC 中,头文件包含#include 。在AVRdef.h 中,宏定义了一些常用的汇编指令和一些不常用的函数。例如:(详细内容请参考ICC 安装程序中AVRdef.h)

#define WDR() asm("wdr")

#define SEI() asm("sei")

#define CLI() asm("cli")

#define NOP() asm("nop")

#define SLEEP() asm("sleep");

#define _WDR() asm("wdr")

#define _SEI() asm("sei")

#define _CLI() asm("cli")

#define _NOP() asm("nop")

#define _SLEEP() asm ("sleep");

#define BIT(x) (1 << (x));

在AS6 中,你可以直接使用asm("xxx")格式.或者用小写的sei();(当然要包含相应的头文件);

Ps:如果移植ICC的代码比较麻烦,可以将这些宏命令添加到一个总的头文件(include.h) 中,所有c 文件都引用include.h,那么在移植过程中,将不需要修改代码。

3.延时函数

在ICC中,delay延时函数,需要自己写,往往不准。而在AS中,只需要加载一个头文件#include ,就可以使用两个标准的延时函数,分别是_delay_ms(double __ms)和_delay_us(double __us),虽然参数为double型,但可赋整型值。注意在调用前定义#define F_CPU 16000000UL(我也不知道为什么要加UL),这样延时10ms的函数写为_delay_ms(10)。

4.中断函数

例如T0 溢出中断,在ICC 中如下定义:

#pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVF

void timer0_ovf_isr(void) {…}

timer0_ovf_isr 这个函数名是自定义的。

而在A6中,需加载头文件#include ,并且函数名为ISR,不可自定义函数名,格式如下:ISR( TIMER0_OVF_vect )

{…}

TIMER0_OVF_vect 含义同iv_TIMER0_OVF ,是T0溢出中断号。不同型号mcu的中断向量号的名称不同,A6的中断向量号请从avr/iomXXX.h中查找。

5.EEPROM操作函数

在ICC中加载头文件#include 后,可以使用如下两个读写函数:

EEPROM_read(addr, var); //读EEPROM中的一个字节

EEPROM_write (addr, var); //向EEPROM中写入一个字节

在AS6中,加载头文件#include 后,可以使用如下两个读写函数:

_EEGET(var, addr) ; //读EEPROM中的一个字节

_EEPUT(addr, var) ; //向EEPROM中写入一个字节

Ps:为了移植时不修改代码,我的做法是在总的头文件(include.h)中添加以下宏定义:

#define EEPROM_read(addr, var) _EEGET(var, addr)

#define EEPROM_write (addr, var) _EEPUT(addr, var)

6.定义数据在flash区

主要用于在字符点阵或图形点阵数据存放在flash区,这样可以减少data区的使用,不至于使data 区溢出.在ICC中,用const关键字定义变量,并在ICC软件设置项中,勾选treat "const" as __flash 即可。

在AS6中,需加载头文件#include ,然后用PROGMEM

举例说明:

PROGMEM const unsigned char flash[10];在flash区声明一个unsiged char型的数组,成员个数10。

unsigned char a;

a = pgm_read_byte(flash[0]); 把flash [0]值赋给变量a。而a = flash[0]是不会从flash区读数据的,而是

读data区的数据。

二维数组:

PROGMEM const unsigned char flash[3][10]={……};

指针数组:

PROGMEM const unsigned char* const flash[3]={……};

习题(中断与接口及答案)

单片机练习三中断与接口 一.单项选择题 1. 已知MCS-51单片机系统晶振频率为12MHZ,SMOD=1,串行口工作于方式2的波特率为( A )。 A. 375K B. 1875K C. 2400K D. 1200K 2. MCS-51单片机T0作为计数器工作于不受外部信号INTO控制,T1作为定时器,T0工作于方式0,T1工作于方式1,其方式控制字的内容为( B )。 A. 00H B. 14H C. 17H D. 80H 3. 控制定时器工作方式的寄存器是( D )。 A. TCON B. PCON C. SCON D. TMOD 4. MCS-51单片机的中断允许触发器内容为83H,CPU将响应的中断请求是( D )。 A. INTO,INT1 B. T0, T1 C. T1, 串行接口 D. INTO,T0 5. 设定时器/计数器T0工作于方式3,则TH0作为一个独立的8位定时器,它的运行由控制位( D )。 A. GATE B. INTO C. TR0 D. TR1 6. 当MCS-51进行多机通信时,串行口的工作方式应选择( C )。 A.方式0 B.方式1 C. 方式2或方式3 D. 方式2 7. 8031单片机的串行口的中断程序入口地址为( B )。 B. 0023H C. 000BH D. 0003H 8. 已知单片机系统的fosc=6MHZ,执行下列延时程序的时间为( C )。 DY2: MOV R6, #2 DLP1: MOV R7, #250 DLP2: DJNZ R7, DLP2 DJNZ R6, DLP1 RET A.1ms B. C. 2ms D. 4ms 9. 串行口中断入口地址是( D )。 A. 0003H B. 000BH C. 0013H D. 0023H 10. 若MCS-51单片机的晶振频率为24MHZ,则其内部的定时器/计数利用计数器对外部输入脉冲的最高计数频率是( A )。 A. 1MHZ B. 6MHZ C. 12MHZ D. 24MHZ 11. MCS-51串行口工作于方式2时,传送的一帧信息为( C )。 A. 8位 B. 16位 C. 11位 D. 12位 12. MCS-51单片机有( B )内部中断源。 A. 2个 B. 3个 C. 4个 D. 5个 13. T1作为计数器,工作于方式2,不需门控位参于控制,其控制字为( A,C )。 A. 60H B. 06H C. 66H D. 00H 14. 已知(60H)=23H,(61H)=61H,运行下列程序62H内容为( A )。 CLR C MOV A, #9AH SUBB A,60H ADD A, 61H DA A MOV 62H, A A. 38H B. D8H C. DBH D. 3EH 15. 设系统的晶振频率为6MHZ,下列子程序DELAY的延时时间约为( B )。 DELAY: MOV R2, #0FAH L2: DJNZ R2, L2

ICCAVR入门编程

ICC AVR入门编程 下面是本试验板中的例子,点亮一个发光二极管实验。采用试验板自带的项目学习,省去了文件编写及工程创建等一大堆过程。让初学者尽快完成第一个实验,等到成功后再来学习一些创建过程及相关设置(先实践再理论),ICC AVR编程例子。 1、打开ICC AVR软件: 2、由主菜单project(工程)里选new(打开工程)选项,建立一个新项目。 3、选择新工程的存放路径,如存放在exp文件夹中。

4、给工程起个名字,如exp1。 5、点击“保存”按钮,将工程保存至exp1文件夹中 6、返回ICC界面,可以看到右边出现这个界面 7、将实验例程\1点亮1个LED\ICC代码文件夹中led.c文件复制到exp1文件夹中。 8、右击ICC界面右边EXP1下面的files文件,出现下面的界面,双击led.c文件就可以添加文件到工程exp1中。 9、由菜单上点击Project->Options->Target,在Device Configuration里选芯片型号为ATMega16;在Advanced(高级)Return Stack Size(堆栈大小)里填30。

10、完成上面的操作,现在就可以编译了,通过菜单Project->Rebuild All对项目进行编译。如果上面操作没有出错的话,会在项目相同路径下出现烧录文件exp1.hex。 11、到此ICC AVR软件的工作已经完成,将编译输出的led.hex文件烧录到芯片中,连接好硬件电路既可看到实验结果了。 本店是宛峰电子山东济南分店,宛峰电子致力于单片机的开发和学习,秉承物美价廉的宗旨,相互学习才会走的更高,看的更远的理念,锐意创新,多年来形成了自己的知识产权的系列 产品,并且公司常年从事单片机的开发,积累了不少相关的经验,相信我们产品会给你学习开发带来很大的方便 主要经营各种学习板,有: 1.全功能51学习板;AVR学习板;cpld学习板;430学习板;dsp2812学习;ARM7,9学习板,品类齐全,性价比高,全部是精英电子独立自主产权. 2.各类开发工具,包括51/AVR并口下载器,51/AVR USB下载器,AVR串口,USB仿真器,430下载器,alteraCPLD并口下载器,xilinux CPLD并口下载器等 3.各种学习视频,包括51,AVR,cpld,430,cpld,DXP2004,arm.linux系列手把手教你嵌入式视频教程,利于新手起步.

ICCAVR-AVR_BootLoader

ICCAVR-AVR_BootLoader-AVR BootLoader详解 ATmega128具备引导加载支持的用户程序自编程功能(In-System Programming by On-chipBoot Program),它提供了一个真正的由MCU 本身自动下载和更新(采用读/写同时"Read-While-Write"进行的方式)程序代码的系统程序自编程更新的机制。利用AVR的这个功能,可以实现在应用编程(IAP)以及实现系统程序的远程自动更新的应用。 IAP的本质就是,MCU可以灵活地运行一个常驻Flash的引导加载程序(Boot Loader Program),实现对用户应用程序的在线自编程更新。引导加载程序的设计可以使用任何的可用的数据接口和相关的协议读取代码,或者从程序存储器中读取代码,然后将代码写入(编程)到Flash存储器中。 引导加载程序有能力读写整个Flash存储器,包括引导加载程序所在的引导加载区本身。引导加载程序还可以对自身进行更新修改,甚至可以将自身删除,使系统的自编程能力消失。引导加载程序区的大小可以由芯片的熔丝位设置,该段程序区还提供两组锁定位,以便用户选择对该段程序区的不同级别的保护。 本节将给出一个实际的的Boot Loader程序,它可以配合Windows中的超级终端程序,采用Xmodem传输协议,通过RS232接口下载更新用户的应用程序。 5.2.1 基本设计思想 1.Boot Loader程序的设计要点 Boot Loader程序的设计是实现IAP的关键,它必须能过通过一个通信接口,采用某种协议正确的接收数据,再将完整的数据写入到用户程序区中。本例Boot Loader程序的设计要点有: (1)采用ATmega128的USART口实现与PC之间的简易RS232三线通信; (2)采用Xmodem通信协议完成与PC机之间的数据交换; (3)用户程序更新完成后自动转入用户程序执行; (4)Boot Loader程序采用C语言内嵌AVR汇编方式编写,阅读理解方便,可移植性强,代码小于1K字。 2.Xmodem通信协议 Xmodem协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据,并且每个块都使用一个校验和过程来进行错误检测。如果接收方关于一个块的校验和与它在发送方的校验和相同时,接收方就向发送方发送一个认可字节。为了便于读者阅读程序,下面简要说明该协议的主要特点,有关Xmoden的完整的协议请参考其它相关的资料。 (1)Xmodem的控制字符:01H、04H、06H、15H、18H、1AH。 (2)Xmodem传输数据块格式:" 个字节的数据块...> "。其中为起始字节; 为数据块编号字节,每次加一;是前一字节的反码;接下来是长度为128字节的数据块;最后的是128字节数据的CRC校验码,长度为2个字节。 (3)接收端收到一个数据块并校验正确时,回送;接收错误回送;而回送表示要发送端停止发送。 (4)发送端收到后,可继续发送下一个数据块(packNO+1);而收到则可再次重发上一个数据块。 (5)发送端发送表示全部数据发送完成。如果最后需要发送的数据不足128个字节,用填满一个数据块。 (6)控制字符"C"有特殊的作用,当发送端收到"C"控制字符时,它回重新开始以CRC校验方式发送数据块(packNO = 1)。 (7)每发送一个新的数据块 加1,加到OxFF后下一个数据块的 为零。 (8)校验方式采用16位CRC校验(X^16 + X^12 + X^5 + 1)。 5.2.2 源程序代码 下面给出的源程序是在ICCAVR中实现的。 /***************************************************** 采用串行接口实现Boot_load应用的实例 华东师大电子系马潮2004.07 Compiler: ICC-AVR 6.31

习题(中断定时部分)

1、2 填空题 1、单片机计数器最大的计数值为 _____________ 。 2、当把定时器/计数器T0 定义为可自动重新装入初值的8 位定时器/计数器 时,________为8 位计数器,______为常数寄存器。 3、若系统晶振频率是12MHz,利用定时器/计数器T1 定时1ms,在方式1 下定时初值为__________。 4、当计数器产生计数溢出时,把定时器/计数器的TF0(TF1)位置“1”。对计数溢出的处理,在中断方式时,该位作为 _____位使用;在查询方式时,该位作_____位使用。 5、在定时器T0工作方式3下,欲使TH0停止工作,应执行一条______的指令。 6、在定时器工作方式1下,计数器的宽度为16位,如果系统晶振频率为6MHz,则最大定时时间为 _______,若系统晶振频率为12MHz,则最大定时时间为 ______。 7、8051单片机内部设有两个16位定时器/计数器,即_____ 和 _____。 8、T0由两个8位特殊功能寄存器_______和________组成,T1由 ______ 和______组成。 9、定时时间与定时器的______ 及______有关。 10、MCS-51的定时器/计数器T0的门控信号GATE设置为1时,只有______引脚为高电平且由软件使______置1时,才能启动定时器/计数器T0工作。 11、当T0为方式______ ,T1为方式______的时候,8051单片机的定时器可提供3个8位定时器/计数器。 12、定时器/计数器的工作方式3是指的将____________拆成两个独立的8位计数器。而另一个定时器/计数器此时通常只可作为_________________使用。13、8051单片机外部中断请求信号有电平触发方式和__________触发方式两种。在电平触发方式下,当采集到INT0、INT1的有效信号为__________时,激活外部中断。 14、8051单片机的P0~P3口均是______位I/O口,其中的P0口和P2口除了可以进行数据的输入/输出外,通常还用来构建系统的______________和 _____________。当连接输入/输出设备时,常选_________做输入/输出口。 二、选择题 1、在下列寄存器中,与定时/计数控制无关的是() A、TCON B、TMOD C、SCON D、IE 2、在工作方式0下,计数器是由TH的全部8位和TL的5位组成,因此其计数范围是() A、1~8192 B、0~8191 C、0~8192 D、1~4096 3、如果以查询方式进行定时应用,则应用程序中的初始化内容应包括()

#pragma data code ICCAVR的使用

#pragma data:code 在Keil中为了节省数据存储器的空间,通过“code”关键字来定义一个数组或字符串将被存储在程序存储器中: uchar code buffer[]={0,1,2,3,4,5}; uchar code string[]="Armoric" ; 而这类代码移值到ICCAVR上时是不能编译通过的。我们可以通过"const" 限定词来实现对存储器的分配: #pragma data:code const unsigned char buffer[]={0,1,2,3,4,5}; const unsigned char string[]="Armoric"; #pragma data:data 注意: 《1》使用ICCAVR6.31时,#pragma data :code ;#pragma data:data ; 这些语法时在"data:cod"、"data:data"字符串中间不能加空格,否则编译不能通过。 《2》const 在ICCAVR是一个扩展关键词,它与ANSIC标准有冲突,移值到其它的编译器使用时也需要修改相关的地方。 在ICCAVR中对数组和字符串的五种不同空间分配: const unsigned char buffer[]={0,1,2,3,4,5}; //buffer数组被分配在程序存储区中 const unsigned char string[]="Armoric" ; //stringp字符串被分配在程序存储区中 const unsigned char *pt //指针变量pt被分配在数据存储区中,指向程序存储区中的字符类型数据 unsigned char *const pt //指针变量pt被分配在程序存储区中,指向数据存储区中的字符类型数据 const unsigned char *const pt //指针变量pt被分配在程序存储区,指向程序存储区中的字符类型数据 unsigned char *pt //指针变量pt被分配在数据存储区中,指向数据存储区中的数据 请问#pragma data:code和#pragma data:data是什么意思? 前者表示:随后的数据将存贮在程序区,即FLASH区,此区只能存贮常量,比如表格之类。

习题(中断与接口及答案)

中断与接口及答案 一.单项选择题 1. 已知MCS-51单片机系统晶振频率为12MHZ,SMOD=1,串行口工作于方式2的波特率为()。A. 3750K B. 1875K C. 2400K D. 1200K 2. MCS-51单片机T0作为计数器工作于不受外部信号INTO控制,T1作为定时器,T0工作于方式0,T1工作于方式1,其方式控制字的内容为()。 A. 00H B. 14H C. 17H D. 80H 3. 控制定时器工作方式的寄存器是()。 A. TCON B. PCON C. SCON D. TMOD 4. MCS-51单片机的中断允许触发器内容为83H,CPU将响应的中断请求是()。 A. INTO,INT1 B. T0, T1 C. T1, 串行接口 D. INTO,T0 5. 设定时器/计数器T0工作于方式3,则TH0作为一个独立的8位定时器,它的运行由控制位()。 A. GATE B. INTO C. TR0 D. TR1 6. 当MCS-51进行多机通信时,串行口的工作方式应选择()。 A.方式0 B.方式1 C. 方式2或方式3 D. 方式2 7. 8031单片机的串行口的中断程序入口地址为()。 A.001BH B. 0023H C. 000BH D. 0003H 8. 已知单片机系统的fosc=6MHZ,执行下列延时程序的时间为()。 DY2:MOV R6,#2 DLP1:MOV R7,#250 DLP2:DJNZ R7,DLP2 DJNZ R6,DLP1 RET A.1ms B. 1.5ms C. 2ms D. 4ms 9. 串行口中断入口地址是()。 A. 0003H B. 000BH C. 0013H D. 0023H 10. 若MCS-51单片机的晶振频率为24MHZ,则其内部的定时器/计数利用计数器对外部输入脉冲的最高计数频率是()。 A. 1MHZ B. 6MHZ C. 12MHZ D. 24MHZ 11. MCS-51串行口工作于方式2时,传送的一帧信息为()。 A. 8位 B. 16位 C. 11位 D. 12位 12. MCS-51单片机有()内部中断源。 A. 2个 B. 3个 C. 4个 D. 5个 13. T1作为计数器,工作于方式2,不需门控位参于控制,其控制字为()。 A. 60H B. 06H C. 66H D. 00H 14. 已知(60H)=23H,(61H)=61H,运行下列程序62H内容为()。 CLR C MOV A,#9AH SUBB A,60H ADD A,61H DA A MOV 62H,A A. 38H B. D8H C. DBH D. 3EH

中断习题和参考题参考答案(课后)

中断习题和参考题 1、什么是中断向量?中断向量表是什么?非屏蔽中断的类型为多少?8086 中断系统优先级顺序怎样? ①所谓中断响量,实际上就是中断处理子程序的入口地址,每个中断类型对应一个中断响量 ②中断向量按照中断类型的顺序在内存0段0单元开始有规则排列的一张表 ③类型02H ④内部中断>非屏蔽中断>可屏蔽中断>单步中断 2、8259的全嵌套和特殊全嵌套方式有何异同?优先级自动循环是什么?什么特殊屏蔽方式?如何设置成该方式? ①全嵌套方式是8259A最常用的工作方式,只有在单片情况下,在全嵌套方式中,中断请求按优先级0-7进行处理,0级中断的优先级最高。特殊全嵌套方式和全嵌套方式基本相同,只有一点不同,就是在特殊全嵌套方式下,还可满足同级中断打断同级中断,从而实现一种对同级中断请求的特殊嵌套,而在全嵌套方式中,只有当更高级的中断到时,才会进行嵌套。 ②优先级自动循环方式一般在系统中多个中断源优先级相等的场合。在这种方式下,优先级队列是在变化的,一个设备受到中断服务以后,它的优先级自动降为最低。 ③仅仅禁止同级中断嵌套,开放高级中断和低级中断④两步:1步设置OCW 3 , 设置成特殊屏蔽方式,2步设置OCW 1 屏蔽某级中断。 3、8259有几种中断结束方式?应用场合如何? 1.中断自动结束方式,不需要设置中断结束命令,在单片系统中且不会出现中断嵌套时用。 2.一般中断结束方式,在全嵌套方式下用。 3.特殊中断结束方式,在任何场合均可使用。 4、8259的ICW 2 与中断类型码有什么关系?说明类型码为30H,36H,38H的异同。 ①高五位相同,低三位不同(中断类型码的低三位和引脚的编码有关,ICW2的低三位无意义) ②30H,36H高五位相同,ICW 2=30H, 30H为8259A IR 对应的中断类型码, 36H为8259A IR 对应的中断类型码。 38H ICW 2=38H 38H为8259A IR 对应的中断类型码

习题(中断与接口及答案)

一.单项选择题 1. 已知MCS-51单片机系统晶振频率为12MHZ,SMOD=1,串行口工作于方式2的波特率为()。 A. 3750K B. 1875K C. 2400K D. 1200K 2. MCS-51单片机T0作为计数器工作于不受外部信号INTO控制,T1作为定时器,T0工作于方式0,T1工作于方式1,其方式控制字的内容为()。 A. 00H B. 14H C. 17H D. 80H 3. 控制定时器工作方式的寄存器是()。 A. TCON B. PCON C. SCON D. TMOD 4. MCS-51单片机的中断允许触发器内容为83H,CPU将响应的中断请求是()。 A. INTO,INT1 B. T0, T1 C. T1, 串行接口 D. INTO,T0 5. 设定时器/计数器T0工作于方式3,则TH0作为一个独立的8位定时器,它的运行由控制位()。 A. GATE B. INTO C. TR0 D. TR1 6. 当MCS-51进行多机通信时,串行口的工作方式应选择()。 A.方式0 B.方式1 C. 方式2或方式3 D. 方式2 7. 8031单片机的串行口的中断程序入口地址为()。 B. 0023H C. 000BH D. 0003H 8. 已知单片机系统的fosc=6MHZ,执行下列延时程序的时间为()。 DY2: MOV R6, #2 DLP1: MOV R7, #250 DLP2: DJNZ R7, DLP2 DJNZ R6, DLP1 RET A.1ms B. C. 2ms D. 4ms 9. 串行口中断入口地址是()。 A. 0003H B. 000BH C. 0013H D. 0023H 10. 若MCS-51单片机的晶振频率为24MHZ,则其内部的定时器/计数利用计数器对外部输入脉冲的最高计数频率是()。 A. 1MHZ B. 6MHZ C. 12MHZ D. 24MHZ

iccavr编译时出现的错误解决办法

初学者初用ICCAVR编程的时候,经常会出现一些错误,现在将常见的错误报告整理如下。这里的一些错误是为了展示说明而故意制造的,欢迎你提供你遇到的错误和解决方法。 一、正常编译通过 CODE: C:\icc\bin\imakew -f main.mak iccavr -c -IC:\icc\include\ -e -DA TMEGA -DA TMega16 -l -g -Mavr_enhanced D:\桌面\实验教程\LED应用\霓虹灯\main.c iccavr -o main -LC:\icc\lib\ -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:16 -beeprom:1.512 -fihx_coff -S2 @main.lk -lcatmega Device 1% full. Done. [url="][/url] 这是我们最想看到的了,万事大吉。 二、工程中未加入.C文件 CODE: C:\icc\bin\imakew -f main.mak iccavr -o main -LC:\icc\lib\ -g -ucrtatmega.o -bfunc_lit:0x54.0x4000 -dram_end:0x45f -bdata:0x60.0x45f -dhwstk_size:16 -beeprom:1.512 -fihx_coff -S2 @main.lk -lcatmega unknown file type @main.lk, passed to linker !ERROR unknown file type '@main.lk' C:\icc\bin\imakew.exe: Error code 1 Done: there are error(s). Exit code: 1 解决办法:将你的程序加入工程中,可以右键程序区>>ADD to project 三、程序没有后缀名,或者后缀名不正确。 CODE: C:\icc\bin\imakew -f main.mak C:\icc\bin\imakew.exe: 'main' is up to date Done. 这是一个很难理解的错误,它是由工程中的程序文件没有后缀名造成的。 解决办法:将原有文件移出工程,将文件的后缀名改为.C,然后再加入工程中。 四、没有main函数

中断扫描工作方式键盘程序

中断扫描工作方式键盘程序 #include /*定义0?9,A?F十六个字符的字型码表*/ unsigned char table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71}; /*10ms延时程序*/ void delay10ms(void) { unsigned char i,j; for(i=20;i>0;i--) for(j=248;j>0;j--); } /*键盘扫描子程序*/ unsigned char scan_key(void) { unsigned char n,scan,col,rol,tmp; bit flag=0; //设有键按下标志位 scan=0xef; P0=0x0f; //P0 口低四位做输入口,先输出全1 for(n=0;n<4;n++) //循环扫描 4 列,从0 列开始

P0=scan; //逐列送出低电平 tmp=~P0; //读行值,并取反tmp=tmp&0x0f; col=n; //保存列号到col flag=1; /* 判断哪一行有键按下,并保存行号到rol*/ if(tmp==0x01) { rol=0; break;} else if(tmp==0x02) { rol=1; break;} else if(tmp==0x04) { rol=2; break;} else if(tmp==0x08) { rol=3; break;} else flag=0; scan=(scan<<1)+1; } if(flag==0) return -1; else return(rol*4+col); //第0 行有键按下 //第 1 行有键按下 //第 2 行有键按下

中断传送方式原理

一、中断传送方式的原理 从原理上看,查询式传送比无条件传送可靠,因此使用场合也较多。但在查询方式下,CPU 不断地读取状态字和检测状态字,如果状态字表明外设未准备好,则CPU 须等待。这些过程占用了CPU 的大量工作时间,而CPU 真正用于传输数据的时间却很少。 另外,用查询方式工作时,如果一个系统有多个外设,那么CPU 只能轮流对每个外设进行查询,而这些外设的速度往往不同。这时CPU 显然不能很好满足各个外设随机性的对CPU 提出的输入输出服务要求,所以,不具备实时性。可见,在实时系统以及多个外设的系统中,采用查询方式进行数据传送往往是不相宜的。 为了提高CPU 的效率和使系统有实时性能,可以采用中断传送方式。在中断传送方式下,外设具有申请CPU 服务的主动权,当输入设备将数据准备好或者输出设备可以接收数据时,便可以向CPU 发出中断请求,使CPU 暂时停下目前的工作而和外设进行一次数据传输。等输入或者输出操作完成以后,CPU 继续进行原来的工作。 二、8088的中断类型8088的中断类型如图所示,中断类型共有256种,包括硬件中断和软件中断。它们均通过中断逻辑向CPU 申请中断。硬件中断是由外部设备产生的,在8088的CPU 引脚中设置了非屏蔽NMI 中断及可屏蔽INTR 中断两个引脚。通常NMI 仅一级,而INTR 还受中断标志IF 状态的控制,INTR 通过中断控制器8259A 向外扩展,可达上百个中断。软件中断是CPU 根据软件中某条指令或软件所设置的某个标志而产生的。 三、NMI,INTR 及软件中断的区别 8088中的各种中断的响应和处理过程是不相同的,但主要区别在于如何获取相应的中断类型码。 对于外部中断,CPU 是在当前指令周期的T 状态采样中断请求输入信号,如果有可屏蔽中断请求,且CPU 处在开中断状态,则CPU 转入两个连续的中断响应周期,在第二个中断响应周期的 状态前沿,采样数据线获取由外设输入的中断类型码。若是采样到非屏蔽中断请求,则CPU 不经过上述两个中断响应周期,而在内部自动产生中断向量号2。 对于内部中断,中断类型码也是自动生成的,对于用户自定义的软件中断INT n 指令,则向量号即为指令中给定的n ,而不需要从外部中断设备中得到中断向量号。软件中断有如下特点: 1、可用一条指令进入中断处理程序,由指令提供中断类型码。 2、通过执行指令进入中断,不需要执行中断响应周期,故也无须从总线上获得中断类型码。 3、何时产生中断,只和中断指令设置有关,不受中断允许标志状态的影响。 4、由于软件中断是由程序中的中断指令引发的,中断指令置于程序的何处,何时执行是事 先知道的,因此软件中断没有随机性,不像硬件中断。 5、外部设备随时都可以发出中断申请。由于软件中断的这个特性,使得在软件中断中,主程序和中断处理子程序间可进行参数传递,相互之间独立性较差。而硬件中断的随机性则又决定了主程序和中断处理子程序之间的关系是相互独立的,只能通过I/O 类指令完成CPU 与外设之间的信息传递。 4 T

第5章中断系统课后习题答案

第5章中断系统 1)作业题 1.8051微控制器中,有几个中断源?几个中断优先级?中断优先级是如何控制的?在出 现同级中断申请时,CPU按什么顺序响应(按由高级到低级的顺序写出各个中断源)? 各个中断源的入口地址是多少? 答:8051微控制器中有五个中断源,两个中断优先级。通过IP进行优先级控制。IP为中断优先级寄存器,物理地址为B8H,其中的后五位PS PT1 PX1 PT0 PX0分别控制串行口、定时器/计数器1、外部中断1、定时器/计数器0、外部中断0的优先级。在出现同级中断申请时,CPU按如下顺序响应各个中断源的请求:INT0、T0、INT1、T1、串行口,各个中断源的入口地址分别是0003H、000BH、0013H、001BH、0023H。 2.8051微控制器中,各中断标志是如何产生的,又如何清0的? 答:每个中断源请求中断时会在SFR的某些寄存器中产生响应的标志位,表示该中断源请求了中断。INT0、INT1、T0和T1的中断标志存放在TCON(定时器/计数器控制寄存器)中,占4位;串行口的中断标志存放在SCON(串行口控制寄存器)中,占2位。 TF0:T0溢出标志,溢出时由硬件置1,并且请求中断,CPU响应后,由硬件自动将TF0清0;不用中断方式时,要用软件清0。 TF1:T1溢出标志,溢出时由硬件置1,并且请求中断,CPU响应后,由硬件自动将TF1清0;不用中断方式时,要用软件清0。 IE0:INT0中断标志,发生INT0中断时,硬件置IE0为1,并向CPU请求中断。 IE1:INT1中断标志,发生INT1中断时,硬件置IE1为1,并向CPU请求中断。SCON:串行口控制寄存器。 TI:串行口发送中断标志,发送完一帧数据时由硬件置位,并请求中断。 RI:串行口接受中断标志,接收到一帧数据时,由硬件置位,并且请求中断。 TI、RI标志,必须用软件清0。 3.简述8051微控制器中中断响应的过程。 答:单片机响应中断的条件:中断源有请求(响应的中断标志位置1),CPU允许所有中断(CPU中断允许位EA=1),中断允许寄存器IE中,相应中断源允许位置1;没有同级或者高级中断正在服务,现行指令已经执行完毕,若执行指令为RETI或者读/写IE或者IP指令时则该指令的下一条指令也执行完毕。 中断响应的过程: 1)CPU在每个机器周期的S5P2检测中断源。在下一个机器周期的S6按照优先次序查询各个中断标志。若查询到有中断标志为1时,按照优先级别进行处理,即响应中断;2)置相应的“优先级状态”触发器为1,即指出CPU当前正在处理的中断优先级,以阻断同级或者低级中断请求; 3)自动保护断点,即将现行PC内容(即断点地址)压入堆栈,并且根据中断源把相应的

从ICC AVR 到 Atmel Studio 6

以前一直在用ICCAVR 感觉生成文档方便,现在发现了Atmel Studio 6, 因为偶尔会用C#(VS2010)所以一下子就喜欢上了这个编译器,我只用8bit 的AVR 另外也是刚刚接触,所以在移植过程中会遇到各种问题,以下是自己的一些问题写出来共大家参考; 1.MCU必须的头文件 例如在ICC AVR(以下简称ICC)中使用#include 或#include ,要根据不同的mcu 型号选择头文件。而在Atmel Studio 6 (以下简称AS6)中统一用#include 。(ICC AVR 7 的版本中也可以用统一的头文件了) 2.头文件 在ICC 中,头文件包含#include 。在AVRdef.h 中,宏定义了一些常用的汇编指令和一些不常用的函数。例如:(详细内容请参考ICC 安装程序中AVRdef.h) #define WDR() asm("wdr") #define SEI() asm("sei") #define CLI() asm("cli") #define NOP() asm("nop") #define SLEEP() asm("sleep"); #define _WDR() asm("wdr") #define _SEI() asm("sei") #define _CLI() asm("cli") #define _NOP() asm("nop") #define _SLEEP() asm ("sleep"); #define BIT(x) (1 << (x)); 在AS6 中,你可以直接使用asm("xxx")格式.或者用小写的sei();(当然要包含相应的头文件); Ps:如果移植ICC的代码比较麻烦,可以将这些宏命令添加到一个总的头文件(include.h) 中,所有c 文件都引用include.h,那么在移植过程中,将不需要修改代码。 3.延时函数 在ICC中,delay延时函数,需要自己写,往往不准。而在AS中,只需要加载一个头文件#include ,就可以使用两个标准的延时函数,分别是_delay_ms(double __ms)和_delay_us(double __us),虽然参数为double型,但可赋整型值。注意在调用前定义#define F_CPU 16000000UL(我也不知道为什么要加UL),这样延时10ms的函数写为_delay_ms(10)。 4.中断函数 例如T0 溢出中断,在ICC 中如下定义: #pragma interrupt_handler timer0_ovf_isr:iv_TIMER0_OVF void timer0_ovf_isr(void) {…} timer0_ovf_isr 这个函数名是自定义的。 而在A6中,需加载头文件#include ,并且函数名为ISR,不可自定义函数名,格式如下:ISR( TIMER0_OVF_vect ) {…} TIMER0_OVF_vect 含义同iv_TIMER0_OVF ,是T0溢出中断号。不同型号mcu的中断向量号的名称不同,A6的中断向量号请从avr/iomXXX.h中查找。 5.EEPROM操作函数 在ICC中加载头文件#include 后,可以使用如下两个读写函数: EEPROM_read(addr, var); //读EEPROM中的一个字节 EEPROM_write (addr, var); //向EEPROM中写入一个字节

中断方式

6.3中断方式 ?查询方式的主要缺点:CPU效率低;响应慢 ?中断方式的引入:提高CPU效率;实时响应 6.3.2中断概念 一、中断和中断源 主程序事件请求 响应中断: CPU中止正在执行的(断点)事件主程序,转去处理中 处理断事件,之后返回继 返回续执行主程序。 继续执行 主程序(中断服务程序、断点) 中断源:引起中断的事件(内部错误、外设请求、时钟等)。 ?外部中断源——外部中断 ?内部中断源——内部中断 (软中断)

二、中断的一般过程 以外部中断为例: ①中断请求:外设 CPU ②中断响应: CPU 外设 ?中断确认主程序①中断请求 ?断点保护 ?中断源识别②中断响应 ③中断处理:中断服务程序ISR③ ④中断返回:断点中断 ?断点恢复处理 ?返回 ④中断返回 三、实现中断的软硬件技术 1.中断请求信号的有效性 ⑴电平类中断请求信号: ?中断请求信号应保持至CPU发现; ?CPU响应后,应及时撤除中断请求信号。 ⑵边沿类中断请求信号: ?中断请求信号的锁存和撤消 2.中断响应的条件 可屏蔽外部中断: ?一条指令执行结束(CPU在每条指令的最后一个时钟周期检测中断请求)特殊指令:STI、IRET 前缀指令,如: REP MOVSB ?CPU允许中断(开中断); ?无更紧迫的事务,如:复位、DMA、更高级中断等。 3.中断源识别: ⑴、软件查询法 CPU ⑵、中断向量法:中断源中断向量码 ISR入口地址CS:IP

4.断点保护及恢复 断点信息——断点地址、断点状态 ?断点保护: PSW、CS、IP压栈(CPU硬件自动完成) 其它寄存器(AX、BX … )压栈(ISR完成) ?断点恢复: IP、CS、PSW弹栈(CPU硬件自动完成) 其它寄存器(AX、BX … )弹栈(ISR完成) 5、中断优先级 当系统中有多个中断源时,需要安排中断优先级。 中断优先级控制应解决2种情况: 1)不同优先级的中断源同时提出中断请求 2)CPU正在进行中断服务时,更高优先级的中断源提出中断请求 情况2)有两种处理方法: (不允许中断)(允许高优先级中断) ?中断优先级控制的实现 软件查询 优先级串行排队(链式)电路 硬件控制优先级并行排队(编码比较)电路 中断控制器 5.中断嵌套 当高优先级中断可以中断低优先级中断时会产生中断嵌套或称多级中断、多重中断。

中断体系结构

中断体系结构 ARM体系CPU有以下7种工作模式。 .用户模式(usr):ARM处理器正常的程序执行状态。 .快速中断模式(fiq):用于高速数据传输或通道处理。 .中断模式(irq):用于通用的中断处理。 .管理模式(svc):操作系统使用的保护模式。 .数据访问终止模式(abt):当数据或指令预取终止时进入该模式,可用于虚拟存储及存储保护。 .系统模式(sys):运行具有特权的操作系统任务。 .未定义指令中止模式(und):当未定义的指令执行时进入该模式,可用于支持硬件协处理器的软件仿真。 可以通过软件来进行模式切换,或者发生各类中断、异常时CPU自动进入相应的模式。除用户模式外,其它6种工作模式都属于特权模式。大多数程序运行于用户模式,进入特权模式是为了处理中断、异常,或者访问被保护的系统资源。 ARM920T有31个通用的32位寄存器和6个程序状态寄存器。这37个寄存器分为7组,进入某个工作模式时就使用它那组的寄存器。有些寄存器,不同的工作模式下有自己的副本,当切换到另一个工作模式时,那个工作模式的寄存器副本将被使用:这些寄存器被称为备份寄存器。 在ARM状态下,每种工作模式都有16个通用寄存器和1个(或2个,这取决于工作模式)程序状态寄存器。 图中R0~R15可以直接访问,这些寄存器中除R15外都是通用寄存器,即它

们既可以用于保存数据也可以用于保存地址。另外,R13~R15稍有些特殊。R13又被称为栈指针寄存器,通常被用于保存栈指针。R14又被称为程序连接寄存器或连接寄存器,当执行BL子程序调用指令时,R14得到R15(程序计数器PC)的备份。而当发生中断或异常时,对应的R14_svc、R14_irq、R14_fiq、R14_abt 或R14_und中保存R15返回值。 快速中断模式有7个备份寄存器R8_fiq~R14_fiq,这使得进入快速中断模式执行很大部分程序时,甚至不需要保存任何寄存器(只要它们不改变R0~R7)。 每种工作模式除R0~R15共16个寄存器外,还有第17个寄存器CPSR,即“当前程序状态寄存器”。CPSR中一些位被用于标识各种状态,一些位被用于标识当前处于什么工作模式。 除CPSR外,还有快速中断模式、中断模式、管理模式、数据访问终止模式和未定义指令中止模式等5种工作模式和一个寄存器——SPSR,即“程序状态保存寄存器”。当切换进入这些工作模式时,在SPSR中保存前一个工作模式的CPSR 值,这样,当返回前一个工作模式时,可以将SPSR的值恢复到CPSR中。 综上所述,当一个异常发生时,将切换进入相应的工作模式(为表述方便,下文中将它称为异常模式),这时ARM920T CPU核将自动完成如下事情。 a.在异常工作模式的连接寄存器R14中保存前一个工作模式的下一条,即将执行的指令的地址。对于ARM状态,这个值是当前PC值加4或加8.

ICCAVR 和AVR Stdio之间的转化

列出ICC AVR 过渡到 AVR STUDIO时要注意的几个问题 1.头文件更改 ICCAVR使用的是“#include ” AVR STUDIO更改为“#include ” 在ICC中使用不同MCU的头文件是不同的,在AVR studio中所有MCU的头文件都用“#include ” 2.AVR studio中延时函数可直接使用“#include ”头文件中的延时函数: void _delay_us (double __us); void _delay_ms(double __ms); 两个函数的参数均为double型的,通常使用整数延时即可。 (函数最大延时时间是有限制的,参考“util/delay.h”) 3.中断函数写法不同 在ICC 中断函数名可以自定义 列出ATmega16的向量表: #define IT_RESET 1 #define IT_INT0 2 #define IT_INT1 3 #define IT_TIMER2_COMP 4 #define IT_TIMER2_OVF 5 #define IT_TIMER1_CAPT 6 #define IT_TIMER1_COMPA 7 #define IT_TIMER1_COMPB 8 #define IT_TIMER1_OVF 9 #define IT_TIMER0_OVF 10

#define IT_SPI_STC 11 #define IT_USART_RXC 12 #define IT_USART_UDRE 13 #define IT_USART_TXC 14 #define IT_ADC 15 #define IT_EE_RDY 16 #define IT_ANA_COMP 17 #define IT_TWI 18 #define IT_INT2 19 #define IT_TIMER0_COMP 20 #define IT_SPM_RDY 21 #pragma interrupt_handler user_fuc:Interrupt vector number 如: #pragma interrupt_handler Time2:iv_TIMER2_COMP void Time2() { } AVR studio中需添加“#include ”头文件且中断函数名不能自定义 如: #include ISR(SIG_OVERFLOW0) //定时器/计数器0溢出中断(ICC AVR 过渡到 AVR STUDIO 4.一些库函数的不同 ICC AVR studio nop() asm("nop")

相关文档