AVR单片机笔记.docx
- 文档编号:11172582
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:23
- 大小:345.19KB
AVR单片机笔记.docx
《AVR单片机笔记.docx》由会员分享,可在线阅读,更多相关《AVR单片机笔记.docx(23页珍藏版)》请在冰豆网上搜索。
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AVR 单片机 笔记
![提示](https://static.bdocx.com/images/bang_tan.gif)