Atmega128外部中断程序
第2章_ATmega128硬件结构
广州大学 机电学院 庞志
$100CA
$1006:LDI R1,$0A $1008:LDS R2,$FF00 $100A:ADD R2,R1 $100C:STS $$FFFF0000(($$110A)) $FF00,R2
R1=$0A R2=$$11AA0
2020年5月19日星期二
广州大学 机电学院 庞志
广州大学 机电学院 庞志
ATmega128
单 片 机 方 框 图
2020年5月19日星期二
广州大学 机电学院 庞志
ATmega128
单 片 机 指 令 执 行 过 程
2020年5月19日星期二
广州大学 机电学院 庞志
$1006
10+(0xFF00$)1=0>0(60:xLFDFI 0R0)1,$0A
当RAMPZ0=1: ELPM/SPM可以访问程序存储器地址 $8000——$FFFF(高64K字节)
2020年5月19日星期二
广州大学 机电学院 庞志
2.2.3 指令执行时序
AVR CPU由系统时钟clkCPU驱动。
并行取指和执行时序
2020年5月19日星期二
广州大学 机电学院 庞志
单时钟周期ALU 操作
模拟比较器
2020年5月19日星期二
广州大学 机电学院 庞志
2.1.2 主要性能 (续)
特殊的处理器特点
上电复位 可编程的掉电检测 片内RC振荡器 片内/片外中断源 6种睡眠模式: 空闲模式、ADC噪声抑制模式、省电模
式、掉电模式、Standby模式以及扩展的Standby模式 可选的时钟频率 可选ATmega103兼容模式 全局上拉禁止功能
Bit 6 – T: 位拷贝存储 Bit 4 – S: 符号位,S=N⊕V Bit 2 – N: 负数标志 Bit 0 – C: 进位标志
ATmega128 单片机硬件电路设计
ATmega128 单片机硬件电路设计在本系统中,本小节主要讲ATmega128 单片机的内部资源、工作原理和硬件电路设计等。
2.5.1 ATmega128 芯片介绍ATmega128 为基于AVR RISC 结构的8 位低功耗CMOS 微处理器。
片内ISP Flash 可以通过SPI 接口、通用编程器,或引导程序多次编程。
引导程序可以使用任何接口来下载应用程序到应用Flash 存储器。
通过将8 位RISC CPU 与系统内可编程的Flash 集成在一个芯片内,ATmega128 为许多嵌入式控制应用提供了灵活而低成本的方案。
ATmega128 单片机的功能特点如下:(1)高性能、低功耗的AVR 8 位微处理器(2)先进的RISC 结构①133 条指令大多数可以在一个时钟周期内完成② 32x8 个通用工作寄存器+外设控制寄存器③全静态工作④工作于16 MHz 时性能高达16 MIPS ⑤只需两个时钟周期的硬件乘法器(3)非易失性的程序和数据存储器① 128K 字节的系统内可编程Flash ②寿命: 10,000 次写/ 擦除周期③具有独立锁定位、可选择的启动代码区(4)通过片内的启动程序实现系统内编程① 4K 字节的EEPROM ② 4K 字节的内部SRAM ③多达64K 字节的优化的外部存储器空间④可以对锁定位进行编程以实现软件加密⑤可以通过SPI 实现系统内编程(5)JTAG 接口(与IEEE 1149.1 标准兼容)①遵循JTAG 标准的边界扫描功能②支持扩展的片内调试③通过JTAG 接口实现对Flash,EEPROM,熔丝位和锁定位的编程(6)外设特点①两个具有独立的预分频器和比较器功能的8 位定时器/ 计数器②两个具有预分频器、比较功能和捕捉功能的16 位定时器/ 计数器③具有独立预分频器的实时时钟计数器④两路8 位PWM ⑤ 6 路分辨率可编程(2 到16 位)的PWM ⑥输出比较调制器⑦ 8 路10 位ADC ⑧面向字节的两线接口⑨两个可编程的串行USART ⑩可工作于主机/ 从机模式的SPI 串行接口(7)特殊的处理器特点①上电复位以及可编程的掉电检测②片内经过标定的RC 振荡器③片内/ 片外中断源④ 6 种睡眠模式: 空闲模式、ADC 噪声抑制模式、省电模式、掉电模式、Standby 模式以及扩展的Standby 模式⑤可以通过软件进行选择的时钟频率⑥通过熔丝位可以选择ATmega103 兼容模式⑦全局上拉禁止功能ATmega128 芯片有64 个引脚,其中60 个引脚具有I/O 口功能,资源比较丰富,下面对ATmega128 的各个引脚做简单介绍:VCC:数字电路的电源。
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开发板上的移植。
atmega128中断向量表
中断向量号
向量地址
中断源
中断定义
1
0x0000
RESET
上电、外部复位、BOD、看门狗复位和JTAG
2
0x0002
INT0
外部中断请求0
3
0x0004
INT1
外部中断请求1
4
0x0006
INT2
外部中断请求2
5
0x0008
INT3
外部中断请求3
6ቤተ መጻሕፍቲ ባይዱ
0x000A
INT4
外部中断请求4
7
0x000C
INT5
外部中断请求5
8
0x000E
INT6
外部中断请求6
9
0x0010
INT7
外部中断请求7
10
0x0012
TIMER2 COMP
时钟/计数器2比较
11
0x0014
TIMER2 OVF
时钟/计数器2溢出
12
0x0016
TIMER1 CAPT
时钟/计数器1捕获
13
0x0018
TIMER1 COMPA
0x003A
TIMER3 OVF
时钟/计数器3溢出
31
0x003C
USART1,RX
USART1,Rx接收完成
32
0x003E
USART1,UDRE
USART1,数据寄存器空
33
0x0040
USART1,TX
USART1,Tx发送完成
34
0x0042
TWI
I2C接口
35
0x0044
SMP READY
25
ATmega128串口通信程序(中断方式)
ATmega128串口通信程序(中断方式)2011-06-05 20:08:10| 分类:单片机程序编写| 标签:|字号大中小订阅程序采用IAR系统编译,实现使用串口调试助手收发数据的功能#include<iom128.h>#include<inavr.h>#include<string.h>#define INT8U unsigned char#define INT16U unsigned int#define UDRIE0 5/* UART Buffer Defines */#define UART0_RX_BUFFER_SIZE 128#define UART0_TX_BUFFER_SIZE 128/* Static Variables */static unsigned char UART0_RxBuf[UART0_RX_BUFFER_SIZE];static volatile unsigned char UART0_RxHead;static volatile unsigned char UART0_RxTail;static unsigned char UART0_TxBuf[UART0_TX_BUFFER_SIZE];static volatile unsigned char UART0_TxHead;static volatile unsigned char UART0_TxTail;static unsigned char UART0_Flag=1;void USART_INIT( void ){UBRR0H = 0x00;UBRR0L = 0x0B;//9600 at 1.8432MUCSR0A = 0x20;UCSR0B = 0xD8;//开接收结束中断,发送结束中断接收使能,发送使能UCSR0C = 0x06;//异步模式,1位停止位,8位数据位UDR0 = 0x00;//清空数据寄存器UART0_RxTail = 0;UART0_RxHead = 0;UART0_TxTail = 0;UART0_TxHead = 0;__disable_interrupt();//关全局中断}void Tran_Byte( INT8U sdata ){if(UART0_Flag == 0){UDR0 = sdata;UART0_Flag = 1;}else{UART0_TxBuf[UART0_TxHead] = sdata;UART0_TxHead++;if(UART0_TxHead >= UART0_TX_BUFFER_SIZE) UART0_TxHead = 0; }__enable_interrupt();}void Send_String( INT8U *string ){INT8U temp;while(1){temp = *string;Tran_Byte(temp);string++;if(*string == 0x00)break;}}INT8U HaveDataRxd( void ){if(UART0_RxHead != UART0_RxTail) return 1;elsereturn 0;}INT8U GetDataFromRxdBuf( void ){INT8U temp;temp = UART0_RxBuf[UART0_RxTail];UART0_RxTail ++ ;if( UART0_RxTail >= UART0_RX_BUFFER_SIZE ) { UART0_RxTail = 0 ;}return temp;}//清空接收缓冲区。
ATmega128中断设计
A VR的中断源比较多,尤其是ATmega128,一共有35个外部以及内部中断源。
通常情况下,Flash程序存储器空间的最低位置(0x0000-0x0045)定义为复位和中断向量空间。
完整的中断向量见第二章表2-23。
在中断向量表中,处于低地址的中断向量所对应的中断拥有高优先级,所以,系统复位RESET拥有最高优先级。
A.中断设计注意点:1.具备Bootloader功能的A VR,其中断向量区可以在Flash程序存储器空间最低位置和Bootloader区的头部来回迁移,这主要用于配合Bootloader程序的应用。
如果不使用Bootloader功能,一般不要中断向量区进行迁移。
2.Flash较小的A VR芯片,其一个中断向量占据1个字的空间,用于放置一条相对转移RJMP指令(范围-2K~+2K字),跳到中断服务程序。
对于不使用的中断,在中断向量区中应放置1条中断返回指令RETI,增强程序的抗干扰性。
3.ATmega128的Flash空间为64K字节,因此它的一个中断向量占据2个字的空间,用于放置一条绝对转移JMP指令(指令长度为2个字),跳到中断服务程序。
对于不使用的中断,在中断向量区中应连续放置2条中断返回指令RETI,增强程序的抗干扰性。
当使用汇编语言编写系统程序时应注意。
4.当MCU响应一个中断时,其硬件系统会自动中断返回地址压入系统堆栈,并将关闭全局中断响应(硬件将中断标志I位清0),清除该中断的中断标志位;执行中断返回指令RETI时,硬件会先允许全局中断响应(硬件将中断标志I位置1),然后从系统堆栈中弹出返回地址到PC程序计数器中,继续执行被中断打断的程序。
除此之外,MCU的硬件没有对中断保护做其他处理。
5.因此,用户在编写中断服务程序时,首先要编写中断现场保护程序,如保护MCU的状态寄存器等。
在中断返回之前,不要忘记恢复中断现场。
6.如果设置和允许外部中断响应,即使是外部INT0..7引脚设置为输出方式,在引脚上的电平变化也会触发外部中断的发生,这一特性提供了使用软件产生中断的途径。
AVR单片机Atmega128外扩RAM
AVR单片机Atmega128外扩RAM关键字:AVR单片机Atmega128 外扩RAM由于AVR系列单片机采用的是内部外部RAM统一编址,ATmega128工作在非ATmega 103模式时具有4k+256B的包括寄存器文件(通用工作寄存器)、I/O寄存器、扩展I/O寄存器和内部SRAM的连续内部存储空间。
所以在扩展外部RAM时,和内部SRAM地址重叠的外部RAM地址是不能直接访问的。
也就是说扩展的外部RAM每64k要浪费掉内部SRAM那么大的空间(AT90系列如此)。
所幸的是mega系列解决了这一缺点,专门有一个寄存器XMCRB用来解决对与内部SRAM地址空间相同地址的外部RAM访问。
其低三位XMM2 、XMM1 、XMM0三位的设置,决定高位地址线PC口的哪些口线被释放为普通I/O,而不是作为高位地址。
这样就可以巧妙地屏蔽高位,就ATmega128而言,要避开内部的4k+245B空间,注意到,只要所访问的地址范围大于0X1100(且MCUCR,XMCRA设置正确),那么所访问的就是外部RAM空间。
所以在访问小于4k+245B的外部地址时,只要使地址大于0X10FF就可以访问了。
0X1100用二进制表示为:0001,0001,0000,0000,高位地址线PC5、PC6、PC7没有使用到。
在访问的时候就可设置XMCRB的XMM1、XMM0位为1,释放该三根地址线为普通I/O,将其设为输出。
并且输出0;并在外部地址加上一个虚地址以使地址超过0X1100,如此设置,就可以访问外部0X0000~0X10FF空间了。
超出这个空间,CPU就自动将其识别为外部相应的地址了,不用设置XMCRB寄存器(即不需释放任何总线),也不需加虚地址,按照正常外部RAM访问即可。
在此约定所加的虚地址为0X2000,XMCRB寄存器设置为****,*011,所释放的地址线输出0。
表10-0X10FF范围的寄存器状态和寻址范围(略)表2各寻址范围地址线和寄存器状态表(略)表3各寻址范围地址线和寄存器状态表(略)比如要访问外部0X0200地址,用二进制表示为0000,0010,0000,0000。
Almel ATmega128 ATmega128L 可编程 Flash 说明书
产品特点•高性能、低功耗的 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字节的系统BDTIC /ATMEL2ATmega1282467L–AVR–05/04引脚配置Figure 1. ATmega128的引脚综述ATmega128为基于AVR RISC 结构的8位低功耗CMOS 微处理器。
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类型的单片机时应用自如。
ATmega128USART资料
2018/11/7
机电系统控制电路设计
9
Atmega128的USART
数据帧格式
串行数据帧由数据字加上同步位( 开始位与停止位) 以 及用于纠错的奇偶校验位构成。USART 接受以下30 种组 合的数据帧格式: 1 个起始位 5、 6、 7、 8 或9 个数据位 无校验位、奇校验或偶校验位 1或2 个停止位 数据帧以起始位开始;紧接着是数据字的最低位,数 据字最多可以有9 个数据位,以数据的最高位结束。如果 使能了校验位,校验位将紧接着数据位,最后是结束位。 当一个完整的数据帧传输后,可以立即传输下一个新的数 据帧,或使传输线处于空闲状态。
机电系统控制电路设计 5
Atmega128的USART
掌握串口通讯需要了解的知识内容为:
电平变换:TTL电平——RS-232电平 了解数据帧格式内容
控制寄存器与状态寄存器的设置
通讯波特率的设置 单片机如何与计算机进行串口通讯 串口调试助手软件 如何实现多机通讯
2018/11/7
2018/11/7 机电系统控制电路设计 1
Atmega128的USART
单片机的通信方式主要有两种:并行通信和串行通信。 并行通信是指数据的各位同时发送或接收。串行通信是 指数据一位一位顺序发送或接收。
单片机的串行接口是一个可编程的全双工串行通信接口。
可以用作异步通信方式(UART)与采用串行接口的外围 设备相连接。 ATmega128 具有两个USART,USART0(PE0-RXD0,PE1TXDO)和USART1(PD2-RXD1,PD3-TXD1)。USART0和 USART1具有不同的I/O寄存器。
机电系统控制电路设计
6
Atmega128的USART
ATMEGA128手册笔记
P23 外部存储器接口有关该部分的内容还要看P308的外部数据存储器时序P33 系统时钟及其选项P46 系统控制和复位P51 看门狗定时器P81 I/O寄存器的说明P84 外部中断P86 8位定时器/计数器0P102 访问16位寄存器写16位寄存器,要先写高8位寄存器,读16位寄存器,先读低8位寄存器。
P106 定时器计数器的时钟源可以使用内部时钟源,也可以使用外部时钟源,由TCCRx控制寄存器B中的CSn2:CSn0定义,具体见P123 16位定时器计数P132 具有PWM功能的定时计数器2 目前不用看P145 输出比较调制器目前不用看P147 串行通讯接口SPI 没看P155 USART 支持4中工作模式:正常的异步模式,倍速的异步模式,同步主机模式,同步从机模式。
内部时钟可用于正常的异步模式、倍速的异步模式、同步主机模式三种,同步从机模式要使用外部时钟,由XCK引脚输入。
串口的初始化:包括波特率的设定,数据帧的设定,以及根据需要使能接受器和发送器,对于中端使能的串口操作,在初始化时首先要清零全局中断标志位(全局中断被屏蔽).P171 多处理器通讯模式目前没看P173 串口寄存器说明USART控制状态寄存器A---UCSRnAUPEn-------奇偶校验错误MPCMn---------多处理器通信模式USART控制状态寄存器B---UCSRnBTXCIEn-----发送结束中断使能UDRIEn----数据寄存器空中断使能UCSZn2-----设置数据帧包含数据长度USART控制状态寄存器C---UCSRnC0异步模式1同步模式UPMn1 UPMn000 0 禁止0 1 1 保留10 2 偶校验1 1 3 奇校验USBSn 停止位选择01bit12bitUCSZn2 UCSZn1 UCSZn0 字符长度0 0 0 0 5位0 0 1 1 6位0 1 0 2 7位0 1 1 3 8位1 1 1 7 9位P181 两线串行接口TWIP188 TWI寄存器说明比特率寄存器TWBR若SREG的I标志以及TWCR的TWIE标志也置位,TWI完成当前工作就会置位TWINT执行中断操作,进入中断程序后该位硬件不会自动清除,需要用软件写“1”来清0TWEA----使能应答TWEA置位后,出现如下的三个条件时发出ACK应答TWSTA-----start 状态位当CPU希望自己成为主机时需要置位TWSTA,发送start信号后软件必须清零TWSTA。
ATmega128指令系统
(1)执行时间短。AVR 大多数执行时间为单个时钟周期,只有少数指令是 2 个机器周
期或 3 个机器周期,大大提高了指令的执行速率。
(2)流水线操作。AVR 采用流水线技术,在前一条指令执行时,就取出现行的指令, 然后以 1 个周期执行指令,大大提高了 CPU 的运行速度。
(3)大型快速存取寄存器组。传统结构的单片机中,需要大量代码来完成和实现在累
SBRS Rr,b
SBIC P,b
SBIS P,b
BRBS s,k BRBC s,k BREQ k BRNE k BRCS k BRCC k BRSH k BRLO k
相对调用子 程序
间接调用子 程序
直接调用子 程序
子程序返回
中断返回
比较相等跳 行
比较
带进位比较
与立即数比 较 寄存器为 0 跳行
寄存器为 1 跳行
识别和执行机器语言的指令。但机器指令不便于记忆和阅读。为了便于人们理解、记忆和使 用,通常用汇编语言指令来描述计算机的指令系统。汇编语言指令可通过编译系统翻译成计
算机能识别的机器指令。
AVR 单片机指令系统是 RISC 结构的精简指令集是一种简明易掌握﹑效率高的指令系
统。
ATmaga128 共有 133 条指令,可分为以下 5 大类: (1) 算数和逻辑指令(28 条;
0≤d≤31 0≤q≤63
2
LD Rd,Z Z 间址取数 Rd←(Z)
0≤d≤31
2
LD Rd,Z+ Z 间 址 取 数 Rd←(Z)
后加 1
Z←Z+1
0≤d≤31
2
LD Rd,-Z Z 减 1 后间址 Z←Z-1
取数
Rd←(Y)
Atmega128外部中断程序
/* CLI();//关闭中断
//设置INT0上升沿触发中断
// EICRB|=(1<<ISC60);
EIMSK|=(1<<INT6);
SREG|=0x80;//使能INT0//使能Timer0溢出中断(T/C1中断屏蔽寄存器p106)
SEI();*/ //打开中断
}
#pragma interrupt_handler Int6_isr:8 //引脚PE6
unsigned int Int7_isr(void)
{
}
EICRB&=~(1<<ISC70);
EICRB|=(1<<ISC71); //设置INT0上升沿触发中断
EIMSK|=(1<<INT7);
SREG|=0x80;//使能INT0//使能Timer0溢出中断(T/C1中断屏蔽寄存器p106)
SEI();//打开中断
}
#pragma interrupt_handler Int7_isr:9 //引脚PE6
unsigned int Int6_isr(void)
{
unsigned char i;
mmm=1;
Clear_All();
LCD_write_string(2,1,"进入输入模式");
}
void exteral_interrupt5()//外部中断服务函数初始化
{
CLI();//关闭中断
DDRE&=~(1<<PE7);
使能timer0溢出中断tc1中断屏蔽寄存器p106sei
//static unsigned char tel[11];
ATmega128几个常用程序例子
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); //输出高电平,使能595PORTB = 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));HC_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单片机的系统结构综述
3、系统时钟及其选项
Flash 时钟 clkFLASH Flash 时钟控制Flash 接口的 操作。此时钟通常与CPU 时钟是同步的。 异步定时器时钟 clkASY 异步定时器时钟允许异步 定时器/ 计数器直接由外部32 kHz 时钟晶体驱动, 使得此定时器/ 计数器即使在睡眠模式下仍然可 以为系统提供一个实时时钟。 ADC 时钟 clkADC ADC具有专门的时钟。这样可 以在ADC工作的时候停止CPU和I/O时钟以降低 数字电路产生的噪声,从而提高ADC 转换精度。
两种类型的中断: 中断向量表:P91 事件触发并置位中断标志。 只要中断条件满足,就会一直触发。 AVR 退出中断后总是回到主程序并执行一条 指令才可以去执行其他被挂起的中断。 程序存储器空间的最低地址缺省定义为复位和 中断向量。中断向量所在的地址越低,优先级 越高。
1.6 复位和中断处理
3、系统时钟及其选项
时钟源 ATmega128有如下几种通过熔丝位选择的 时钟源。时钟输入到AVR 时钟发生器,并 通往其他合适模块。
3、系统时钟及其选项
默认时钟源 器件出厂时CKSEL = “0001”, SUT = “10”。该默认时钟源为最长启动时间的内 部RC 振荡器。该默认设置保证所有的用 户通过系统内或并行编程得到其需要的时 钟源。
4、系统控制和复位
1.上电复位 AVR内部含有上电复位POR(Power_on Reset) 电路无论何时,只要Vcc低于检测电平Vpot时,器 件进入复位状态。
4、系统控制和复位
2.外部复位 外部复位是由外加在RESET引脚上的低电平将产生 的。当RESET引脚被拉低于Vrst的时间大于1.5µs时 既触发复位过程
2812中断使用程序
TMS320F2812学习笔记中断系统及其应用2812的中断是3级中断机制,分别是外设级,PIE级以及CPU级,对于某一个具体的外设中断请求,任意一级的不许可,CPU最终都不会执行该外设中断。
(1)外设级外设产生中断时,该中断事件相关的中断标志位(IF)置1。
此时,如果该中断相应的中断使能寄存器(IE)也置为1,外设就会向PIE控制器发出一个中断请求。
如果外设级中断没有被使能(相应的使能位为0),那么外设就不会向PIE发出中断请求,相应的中断标志位会一直保持置位状态,除非用软件清除。
当然,在中断标志位保持在1的时候,一旦该中断被使能了,那么外设立马会向PIE发出中断申请。
注:不管在什么情况下,外设寄存器中的中断标志位必须采用软件进行清除。
小结:外设中断的屏蔽,需要将与该中断相关的外设寄存中的中断使能位置0;外设中断标志位的清除,需要将与该中断相关的外设寄存中的中断标志位置1;(2)PIE级当外设产生中断事件,相关中断标志位置位,中断使能位使能之后,外设就会把中断请求提交给我们的PIE模块。
PIE模块将96个外设和外部引脚的中断进行了分组,分为12组,每组8个中断,分别是PIE1-PIE12。
每个组的中断被多路汇集进入1个CPU中断,例如P DPINDA,PDPINDB,XINT1,XINT2,ADCINT,TINT0,WAKEINT这7个中断都在PIE1组内,这些中断都汇集到CPU中断的INT1。
和外设级类似的,PIE控制器中的每个组都会有一个中断标志寄存器PIEIFRx和和中断使能寄存器PIEIERx,当然x=1.....12。
每个寄存器的低8位对应于8个外设中断,高8位保留。
小结:PIE中断的使能。
就得将其相应组的使能寄存器PIEIERx的相应位进行置位;PIE中断的屏蔽。
这是和使能相反的操作;PIE应答寄存器PIEACK相关位的清除,以使得CPU能够响应同组的其他中断。
PIE级的中断和外设级的中断比较外设中断的中断标志位是需要软件清除的,而PIE级的中断标志位都是自动置位或者清除的。
ATmega128的中断系统
任意电平变化触发表示只要引脚上有逻辑电平的变化就会 产生中断申请(不管是上升沿还是下降沿都引起中断触发) 产生中断申请(不管是上升沿还是下降沿都引起中断触发)
4种触发方式中,还有以下的一些不同的特点: 种触发方式中,还有以下的一些不同的特点: 种触发方式中 1.低电平触发是不带中断标志类型的,即只要中断输入引脚PD2 低电平触发是不带中断标志类型的,即只要中断输入引脚 低电平触发是不带中断标志类型的 保持低电平, 或PD3保持低电平,那么将一直会产生中断申请。 保持低电平 那么将一直会产生中断申请。 2.MCU对INT0和INT1的引脚上的上升沿或下降沿变化的识别 对 和 的引脚上的上升沿或下降沿变化的识别 触发),需要I/O时钟信号的存在 ),需要 时钟信号的存在( 时钟同步检测), (触发),需要 时钟信号的存在(由I/O时钟同步检测), 时钟同步检测 属于同步边沿触发的中断类型。 属于同步边沿触发的中断类型。 3.MCU对INT2的引脚上的上升沿或下降沿变化的识别(触 对 的引脚上的上升沿或下降沿变化的识别( 的引脚上的上升沿或下降沿变化的识别 ),以及低电平的识别 触发)是通过异步方式检测的, 以及低电平的识别( 发),以及低电平的识别(触发)是通过异步方式检测的,不 需要I/O时钟信号的存在。因此,这类触发类型的中断经常作 需要 时钟信号的存在。因此, 时钟信号的存在 为外部唤醒源,用于将处在Idle休眠模式,以及处在各种其它 休眠模式, 为外部唤醒源,用于将处在 休眠模式 休眠模式的MCU唤醒。这是由于除了在空闲(Idel)模式时, 唤醒。 休眠模式的 唤醒 这是由于除了在空闲( )模式时, I/O时钟信号还保持继续工作,在其它各种休眠模式下,I/O时 时钟信号还保持继续工作, 时钟信号还保持继续工作 在其它各种休眠模式下, 时 钟信号均是处在暂停状态的。 钟信号均是处在暂停状态的。
ATmega128的外部并行接口器件扩展应用
ATmega128的外部并行接口器件扩展应用ATmega128片内的RAM有4K字节,这在8位单片机中算佼佼者。
因此,设计一般的应用系统,应尽量不采用外部扩展并行器件的设计。
这样不仅方便PCB板的设计,减少PCB板的面积,同时也提高了系统的抗干扰性。
对于必须采用外部并行器件扩展的设计,ATmega128的PORTA(低8位地址线和8位数据线复用)、PORAC(高8位地址线)口提供了并行扩展接口。
尽管并行接口的基本使用原理同一般的单片机相同,但由于ATmega128的结构上的特点,以及其使用了增强型的并行接口,因此在使用并行扩展接口时还需要仔细的设计。
其主要特性有:*外部并行扩展的地址从0x1100开始;*使用外部并行扩展时,应将MCUCR寄存器中的SRE位置“1”,允许外部并行扩展;*可将PORTC口高位不用的地址线释放,作为普通的I/O口使用;*可设置对不同区域采用不同的读写操作时序(加等待),用于配合扩展使用不同时序操作的外部并行器件。
5.5.1 外部扩展RAM存储器的设计下图给出一个外部扩展32K的RAM(6264)的译码参考电路。
图中使用了一片74HC138和与门,与门的输出作为6264的片选信号,其地址空间为0x0000 –0x8FFF。
74HC138其它7个引脚输出用于在地址大于0x9000以上空间扩展其它更多的并行接口器件,每根线选通的地址空间为4K。
由于ATmega128的RAM空间前4352个字节分配给芯片内部的通用寄存器、I/O寄存器和4K 字节的内部SRAM,所以外部并行扩展器件的起始地址是从0x1100开始的(见第二章内容)。
当MCU在对0X0000-0X10FF范围的SRAM地址空间操作时,实际是对芯片内部的SRAM或寄存器操作,尽管会影响地址总线、数据总线和ALE,但此时和不受影响,因此对相应的处在这段地址范围的外部扩展的存储器没有影响。
在图5.6的设计中,实际上已经把6264中地址范围在0x0000-0x0FFF的一段存储单元“移”到ATmega128的RAM地址空间高端0x8000-0x8FFF处。