AVR单片机笔记.docx

上传人:b****8 文档编号:11172582 上传时间:2023-02-25 格式:DOCX 页数:23 大小:345.19KB
下载 相关 举报
AVR单片机笔记.docx_第1页
第1页 / 共23页
AVR单片机笔记.docx_第2页
第2页 / 共23页
AVR单片机笔记.docx_第3页
第3页 / 共23页
AVR单片机笔记.docx_第4页
第4页 / 共23页
AVR单片机笔记.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

AVR单片机笔记.docx

《AVR单片机笔记.docx》由会员分享,可在线阅读,更多相关《AVR单片机笔记.docx(23页珍藏版)》请在冰豆网上搜索。

AVR单片机笔记.docx

AVR单片机笔记

AVR单片机笔记

说明:

主要使用的编译环境为IAR,使用AVR的ATmega16和128

目录

IO2

时钟:

2

MCU控制寄存器-MCUCR2

MCU控制和状态寄存器-MCUCSR2

看门狗定时器控制寄存器-WDTCR3

外部中断控制寄存器A-EICRA4

外部中断控制寄存器B-EICRB4

外部中断屏蔽寄存器-EIMSK4

外部中断标志寄存器-EIFR5

中断矢量表5

在IAR环境中AVR中断程序的格式6

定时器6

定时器/计数器0和2:

6

定时器/计数器1和3:

7

使用IAR调试注意事项7

IIC(TWI)8

o8515.h头文件10

IO

PortA-G:

都含有内部上拉电阻

数据:

PORTA-G;方向DDRA-G;PINA-G

时钟:

XTAL分频控制寄存器-XDIV

MCU控制寄存器-MCUCR

MCU控制和状态寄存器-MCUCSR

•Bit4–JTRF:

JTAG复位标志

通过JTAG指令AVR_RESET可以使JTAG复位寄存器置位,并引发MCU复位,并使

JTRF置位。

上电复位将使其清零,也可以通过写”0”来清除。

•Bit3–WDRF:

看门狗复位标志

看门狗复位发生时置位。

上电复位将使其清零,也可以通过写”0”来清除。

•Bit2–BORF:

掉电检测复位标志

掉电检测复位发生时置位。

上电复位将使其清零,也可以通过写”0”来清除。

•Bit1–EXTRF:

外部复位标志

外部复位发生时置位。

上电复位将使其清零,也可以通过写”0”来清除。

•Bit0–PORF:

上电复位标志

上电复位发生时置位。

只能通过写”0”来清除。

看门狗定时器控制寄存器-WDTCR

•Bits7..5–Res:

保留

保留位,读操作返回值为零。

•Bit4–WDCE:

看门狗修改使能

清零WDE时必须先置位WDCE,否则不能禁止看门狗。

一旦置位,硬件将在紧接的4个

时钟周期之后将其清零。

请参考有关WDE的说明来禁止看门狗。

工作于安全级别1和2

时也必须置位WDCE以修改预分频器的数据,如P54“改变看门狗定时器配置的时间序

列”所示。

•Bit3–WDE:

看门狗使能

WDE为"1“时,看门狗使能,否则看门狗将被禁止。

只有在WDCE为"1“时WDE才能清零。

以下为关闭看门狗的步骤:

1.在同一个指令内对WDCE和WDE写"1“,即使WDE已经为"1“。

2.在紧接的4个时钟周期之内对WDE写"0”。

工作于安全级别2时是永远无法禁止看门狗定时器的。

参见P54“改变看门狗定时器配

置的时间序列”。

•Bits2..0–WDP2,WDP1,WDP0:

看门狗定时器预分频器2,1,和0

WDP2、WDP1和WDP0决定看门狗定时器的预分频器,如Table22所示。

外部中断控制寄存器A-EICRA

外部中断控制寄存器B-EICRB

外部中断屏蔽寄存器-EIMSK

外部中断标志寄存器-EIFR

中断矢量表

在IAR环境中AVR中断程序的格式

中断向量的使用

IAR中定义中断函数的格式是

/////////////////////////////////

#pragmavector=中断向量

__interruptvoid中断服务程序名(void)

{

//中断处理程序

}

/////////////////////////////////////

中断的初始化要另外加入代码,可在主程序内加入。

如下是各个中断函数的定义。

关中断函数

__disable_interrupt();//disableallinterrupts

开中断

__enable_interrupt();//re-enableinterrupts

例如:

#pragmavector=INT0_vect

__interruptvoidINT0_Server(void)

{

}

定时器

ATmega128有4个定时器;ATmega16有3个定时器

ATmega128:

的T/C0和2都是8位的;T/C1和3都是16位的;T/C1、2、3共用一个预分频模块,但它们可以有不同的分频设置

ATmega16:

T/C0、2是一个通用的单通道8位定时器/计数器模块;T/C1是16位的定时器,可以实现精确的程序定时(事件管理)、波形产生和信号测量;T/C1与T/C0共用一个预分频模块,但它们可以有不同的分频设置

定时器/计数器0和2:

T/C2和T/C0基本是一样的,以T/C0为例。

T/C0是一个通用的,单通道8位定时器/计数器模块。

其主要特点如下:

•单通道计数器

•比较匹配发生时清除定时器(自动加载)

•无毛刺的相位修正PWM

•频率发生器

•10位时钟预分频器

•溢出和比较匹配中断源(TOV0和OCF0)

•允许外部32kHz钟振作为时钟

T/C(TCNT0);计数序列由T/C控制寄存器(TCCR0);输出比较寄存器(OCR0)为8位寄存器;中断请求信号位于定时器中断标志寄存器TIFR;定时器中断屏蔽寄存器TIMSK

双缓冲的输出比较寄存器OCR0一直与T/C的数值进行比较。

比较的结果可用来产生PWM波,或在输出比较引脚OC0上产生变化频率的输出。

比较匹配事件还将设置比较标志OCF0。

此标志可以用来产生输出比较中断请求。

定时器/计数器1和3:

16位的T/C可以实现精确的程序定时(事件管理)、波形产生和信号测量。

其主要特点如下

•真正的16位设计(即允许16位的PWM)

•3个独立的输出比较单元

•双缓冲的输出比较寄存器

•一个输入比较单元

•输入捕捉噪声抑制器

•比较匹配发生时清除寄存器(自动重载)

•无毛刺的相位修正PWM

•可变的PWM周期

•频率发生器

•外部事件计数器

•10个独立的中断源(TOV1、OCF1A、OCF1B、OCF1C、ICF1、TOV3、OCF3A、OCF3B、OCF3C和ICF3)

使用IAR调试注意事项

使用IAR调试时必须注意在下图linker选项中的format中勾选第一个,如图所示。

IIC(TWI)

此笔记中介绍的两款AVR的集成外设中都有IIC(TWI)集成模块

TWI是公司自己开发的,其实和IIC类似,这里简要介绍一下,具体还要参考相关器件的手册

所有在TWI总线上传送的地址包均为9位,包括7位地址位、1位READ/WRITE控制位与1位应答位。

如果READ/WRITE为1,则执行读操作;否则执行写操作。

从机被寻址后,必须在第九个SCL(ACK)周期通过拉低SDA作出应答。

若该从机忙或有其它原因无法响应主机,则应该在ACK周期保持SDA为高。

然后主机可以发出STOP状态或REPEATEDSTART状态重新开始发送。

地址包包括从机地址与分别称为SLA+R或SLA+W的READ或WRITE位。

地址字节的MSB首先被发送。

从机地址由设计者自由分配,但需要保留地址0000000

作为广播地址。

当发送广播呼叫时,所有的从机应在ACK周期通过拉低SDA作出应答。

当主机需要发送相同的信息给多个从机时可以使用广播功能。

当Write位在广播呼叫之后发送,所有的从机通过在ACK周期通过拉低SDA作出响应。

所有的从机接收到紧跟的数据包。

注意在整体访问中发送Read位没有意义,因为如果几个从机发送不同的数据会带来总线冲突。

所有形如1111xxx格式的地址都需要保留,以便将来使用。

TWI协议允许总线上由多个主机。

特别要注意的是即使有多个主机同时开始发送数据,也要保证发送正常进行。

多主机系统中有两个问题:

•算法必须只能允许一个主机完成传送。

当其余主机发现它们失去选择权后应停止传

送。

这个选择过程称为仲裁。

当竞争中的主机发现其仲裁失败,应立即转换到从机

模式检测是否被获得总线控制权的的主机寻址。

事实上多主机同时传送时不应该让

从机检测到,即不许破坏数据在总线上的传送。

•不同的主机可能使用不同的SCL频率。

为保证传送的一致性,必须设计一种同步主

机时钟的方案。

这会简化仲裁过程。

总线的线与功能用来解决上述问题。

将所有的主机时钟进行与操作,会生成组合的时钟,

其高电平时间等于所有主机中最短的一个;低电平时间则等于所有主机中最长的一个。

所有的主机都监听SCL,使其可以有效地计算本身高/低电平与组合SCL信号高/低电平

的时间差异。

下图是多主机SCL的同步示意图:

输出数据之后所有的主机都持续监听SDA来实现仲裁。

如果从SDA读回的数值与主机输出的数值不匹配,该主机即失去仲裁。

要注意只有当一个主机输出高电平的SDA,而其它主机输出为低,该主机才会失去仲裁,并立即转为从机模式,检测是否被胜出的主机寻址。

失去仲裁的主机必须将SDA置高,但在当前的数据或地址包结束之前还可以产生时钟信号。

仲裁将会持续到系统只有一个主机。

这可能会占用许多比特。

如果几个主机对相同的从机寻址,仲裁将会持续到数据包。

注意不允许在以下情况进行仲裁:

•一个REPEATEDSTART状态与一个数据位。

•一个STOP状态与一个数据位。

•一个REPEATEDSTART状态与一个STOP状态。

应用软件应考虑上述情况,保证不会出现这些非法仲裁状态。

这意味着在多主机系统中,所有的数据传输必须由相同的SLA+R/W与数据包组合组成。

换句话说:

所有的传送必须包含相同数目的数据包,否则仲裁结果无法定义。

TWI模块介绍:

SCL与SDA为MCU的TWI接口引脚。

引脚的输出驱动器包含一个波形斜率限制器以满足TWI规范。

引脚的输入部分包括尖峰抑制单元以去除小于50ns的毛刺。

当相应的端口设置为SCL与SDA引脚时,可以使能I/O口内部的上拉电阻,这样可省掉外部的上拉电阻。

TWI工作于主机模式时,比特率发生器控制时钟信号SCL的周期。

具体由TWI状态寄存器TWSR的预分频系数以及比特率寄存器TWBR设定。

当TWI工作在从机模式时,不需要对比特率或预分频进行设定,但从机的CPU时钟频率必须大于TWI时钟线SCL频率的16倍。

注意,从机可能会延长SCL低电平的时间,从而降低TWI总线的平均时钟周期。

SCL的频率根据以下的公式产生:

•TWBR=TWI比特率寄存器的数值

•TWPS=TWI状态寄存器预分频的数值

Note:

TWI工作在主机模式时,TWBR值应该不小于10。

否则主机会在SDA与SCL产生错误输作为提示信号。

问题出现于TWI工作在主机模式下,向从机发送Start+SLA+R/W的时候(不需要真的有从机与总线连接)。

注意:

TWCR中的bit7:

TWINT标志位:

当TWI完成当前工作,希望应用程序介入时TWINT置位。

若SREG的I标志以及TWCR寄存器的TWIE标志也置位,则MCU执行TWI中断例程。

当TWINT置位时,SCL信号的低电平被延长。

TWINT标志的清零必须通过软件写"1”来完成。

执行中断时硬件不会自动将其改写为"0”。

要注意的是,只要这一位被清零,TWI立即开始工作。

因此,在清零TWINT之前一定要首先完成对地址寄存器TWAR,状态寄存器TWSR,以及数据寄存器TWDR的访问。

使用TWI的总结(参考ATmega128使用手册)

•当TWI完成一次操作并等待反馈时,TWINT标志置位。

直到TWINT清零,时钟线SCL才会拉低。

•TWINT标志置位时,用户必须用与下一个TWI总线周期相关的值更新TWI寄存器。

例如,TWDR寄存器必须载入下一个总线周期中要发送的值。

•当所有的TWI寄存器得到更新,而且其它挂起的应用程序也已经结束,TWCR被写入数据。

写TWCR时,TWINT位应置位。

对TWINT写"1”清除此标志。

TWI将开始执行由TWCR设定的操作。

o8515.h头文件

#ifndef__io8515_h

#define__io8515_h

#warning"Thisheaderfilemaynotbecurrent.Pleaseuseio8515v.hinstead"

/*ConvertedfromAtmelprovidedheaderfilefor

*ImageCraftICCAVRcompiler

*/

/*AnalogComparatorControlandStatusRegister*/

#defineACSR(*(volatileunsignedchar*)0x28)

/*UARTBaudRateRegister*/

#defineUBRR(*(volatileunsignedchar*)0x29)

/*UARTControlRegister*/

#defineUCR(*(volatileunsignedchar*)0x2A)

/*UARTStatusRegister*/

#defineUSR(*(volatileunsignedchar*)0x2B)

/*UARTI/ODataRegister*/

#defineUDR(*(volatileunsignedchar*)0x2C)

/*SPIControlRegister*/

#defineSPCR(*(volatileunsignedchar*)0x2D)

/*SPIStatusRegister*/

#defineSPSR(*(volatileunsignedchar*)0x2E)

/*SPII/ODataRegister*/

#defineSPDR(*(volatileunsignedchar*)0x2F)

/*InputPins,PortD*/

#definePIND(*(volatileunsignedchar*)0x30)

/*DataDirectionRegister,PortD*/

#defineDDRD(*(volatileunsignedchar*)0x31)

/*DataRegister,PortD*/

#definePORTD(*(volatileunsignedchar*)0x32)

/*InputPins,PortC*/

#definePINC(*(volatileunsignedchar*)0x33)

/*DataDirectionRegister,PortC*/

#defineDDRC(*(volatileunsignedchar*)0x34)

/*DataRegister,PortC*/

#definePORTC(*(volatileunsignedchar*)0x35)

/*InputPins,PortB*/

#definePINB(*(volatileunsignedchar*)0x36)

/*DataDirectionRegister,PortB*/

#defineDDRB(*(volatileunsignedchar*)0x37)

/*DataRegister,PortB*/

#definePORTB(*(volatileunsignedchar*)0x38)

/*InputPins,PortA*/

#definePINA(*(volatileunsignedchar*)0x39)

/*DataDirectionRegister,PortA*/

#defineDDRA(*(volatileunsignedchar*)0x3A)

/*DataRegister,PortA*/

#definePORTA(*(volatileunsignedchar*)0x3B)

/*EEPROMControlRegister*/

#defineEECR(*(volatileunsignedchar*)0x3C)

/*EEPROMDataRegister*/

#defineEEDR(*(volatileunsignedchar*)0x3D)

/*EEPROMAddressRegister*/

#defineEEAR(*(volatileunsignedint*)0x3E)

#defineEEARL(*(volatileunsignedchar*)0x3E)

#defineEEARH(*(volatileunsignedchar*)0x3F)

/*WatchdogTimerControlRegister*/

#defineWDTCR(*(volatileunsignedchar*)0x41)

/*T/C1InputCaptureRegister*/

#defineICR1(*(volatileunsignedint*)0x44)

#defineICR1L(*(volatileunsignedchar*)0x44)

#defineICR1H(*(volatileunsignedchar*)0x45)

/*Timer/Counter1OutputCompareRegisterB*/

#defineOCR1B(*(volatileunsignedint*)0x48)

#defineOCR1BL(*(volatileunsignedchar*)0x48)

#defineOCR1BH(*(volatileunsignedchar*)0x49)

/*Timer/Counter1OutputCompareRegisterA*/

#defineOCR1A(*(volatileunsignedint*)0x4A)

#defineOCR1AL(*(volatileunsignedchar*)0x4A)

#defineOCR1AH(*(volatileunsignedchar*)0x4B)

/*Timer/Counter1*/

#defineTCNT1(*(volatileunsignedint*)0x4C)

#defineTCNT1L(*(volatileunsignedchar*)0x4C)

#defineTCNT1H(*(volatileunsignedchar*)0x4D)

/*Timer/Counter1ControlandStatusRegister*/

#defineTCCR1B(*(volatileunsignedchar*)0x4E)

/*Timer/Counter1ControlRegister*/

#defineTCCR1A(*(volatileunsignedchar*)0x4F)

/*Timer/Counter0*/

#defineTCNT0(*(volatileunsignedchar*)0x52)

/*Timer/Counter0ControlRegister*/

#defineTCCR0(*(volatileunsignedchar*)0x53)

/*MCUgeneralControlRegister*/

#defineMCUCR(*(volatileunsignedchar*)0x55)

/*Timer/CounterInterruptFlagregister*/

#defineTIFR(*(volatileunsignedchar*)0x58)

/*Timer/CounterInterruptMaSKregister*/

#defineTIMSK(*(volatileunsignedchar*)0x59)

/*GeneralInterruptFlagRegister*/

#defineGIFR(*(volatileunsignedchar*)0x5A)

/*GeneralInterruptMaSKregister*/

#defineGIMSK(*(volatileunsignedchar*)0x5B)

/*StackPointer*/

#defineSP(*(volatileunsignedint*)0x5D)

#defineSPL(*(volatileunsignedchar*)0x5D)

#defineSPH(*(volatileunsignedchar*)0x5E)

/*StatusREGister*/

#defineSREG(*(volatileunsignedchar*)0x5F)

/*GeneralInterruptMaSKregister*/

#defineINT17

#defineINT06

/*GeneralInterruptFlagRegister*/

#defineINTF17

#defineINTF06

/*Timer/CounterInterruptMaSKregister*/

#defineTOIE17

#defineOCIE1A6

#defineOCIE1B5

#defineTICIE13

#defineTOIE01

/*Timer/CounterInterruptFlagregister*/

#defineTOV17

#defineOCF1A6

#defineOCF1B5

#defineICF13

#defineTOV01

/*MCUgeneralControlRegister*/

#defineSRE7

#defineSRW6

#defineSE5

#defineSM4

#defineISC113

#defineISC102

#defineISC011

#defineISC000

/*Timer/Counter0ControlRegister*/

#defin

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 经济学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1