当前位置:文档之家› AVR学习总结

AVR学习总结

目录中断学习 (2)E2PROM学习 (3)时钟系统及时钟源的学习 (5)系统复位学习 (5)I/O端口的学习 (6)中断学习中断的过程:CPU 检测中断的产生(总是在每条指令的最后检测中断请求),然后响应中断,进入中断服务函数处理。

CPU 检测到中断并不是立即响应,而是有条件的: 1. 设立中断请求触发器 2. 设立中断屏蔽触发器 3. 总中断是开放的4. CPU 现行指令结束后执行中断Mega 有20个中断源,包括3个外部中断(int0、int1、int2)和18个内部中断。

与中断有关的寄存器:GIFR 通用中断标志寄存器:GIFR :产生中断时由CPU 自动置1,响应后自动置0。

GICR 通用中断控制寄存器:GICR :位7—5为外部中断0、1、2使能,该位置1且全局中断使能置1即响应外部中断。

位4—0与外部中断无关,为中断向量标号的选择有关。

SREG 状态寄存器:SREG :全局中断使能标志位,置1时使能全局中断(asm (”SEI ”)),响应后应使其置0(asm (”CLI ”))。

MCUCR 单片机控制寄存器:MCUCR :Bit7—4Bit1、0MCUCSR 单片机控制和状态寄存器:MCUCSR :外部中断2触发方式设置:Bit6写0为下降沿触发,Bit6写1为上升沿触发。

外部中断的初始化可以为以下步骤:1. 设置外部中断的触发方式(0、1时设置MCUCR ;2时设置MCUCSR )。

2. (清零GIFR 寄存器对应的位,此步骤可省略。

另外,此寄存器可用来做可读寄存器,通过判断完成一些操作)。

3. 打开对应外部中断的控制位(GICR )。

4. 打开全局中断使能为I (SREG )。

5. 写中断服务函数。

格式为:#pragma interrupt_handler <func1> :<vector number> <func2> :<vector> … 阴影标注部分是必须的,func1是函数名,vector number 是中断向量标号,在头文件中定义的向量号一般前加 ”iv_中断源名称”,宏定义相当于直接使用向量号,但用起来意义明显。

注意:外部中断源的引脚一定要设置成输入作为中断检测的输入接口,而且一定要设置成带上拉电阻的方式(DDRD=0x00,PORTD=0xFF ),否则PD 端口一直为低电平就会一直触发中断。

在ICCA VR 中可以用Wizard 来生成服务程序,一个很简单的工具。

只需对生成代码做简单的修改即能完成相应的功能,节省的代码的书写,同时提高了编程的效率。

E 2PROM 学习Mega16有512Bytes 的E 2PROM ,用户可以通过操作其控制寄存器来实现对其读写即对E 2PROM 各存储单元的访问。

与E 2PROM 有关的寄存器:EEAR 地址寄存器(分为两个字节EEARH 、EEARL ):EEARH : EEARL :E 2PROM 的初值无定义,因此必须为其赋一个确定的数值。

EEDR 数据寄存器:EEDR :对E2PROM写操作保存的是将要写入的数据,对E2PROM读操作保存的是读出的数据。

EECR数据寄存器:Bit3-EERIE使能E2PROM准备好中断:若SREG的“I”为1是,置位EERIE将使能准备好中断,清0则禁止此中断。

在置位I和EERIE的前提下,清零EEWE则准备好中断即可发生。

Bit2-EEMWE主机写使能:当EEMWE为1时,在其后的4个时钟周期内置位EEWE 即可把数据写入;当EEMWE为0时,则操作EEWE不起作用。

在其后的4个时钟周期内硬件对其清零。

Bit1-EEWE写使能:当E2PROM准备好地址和数据后,置位EEWE即可把数据写入,但此时EEMWE必须为1。

Bit0-EERE读使能:当E2PROM准备好地址后,置位EERE即可把数据读入。

读操作执行后4个时钟周期才能执行下一条指令。

执行一个写操作的步骤如下:1.等待EEWE清零(有硬件完成清零)。

(while(EECR&BIT(EEWE)))2.将地址写入EEAR。

3.将数据写入EEDR。

4.置位EEMWE,在其后的4个时钟周期内置位EEWE。

执行一个读操作的步骤如下:1.等待EEWE清零(有硬件完成清零)。

(while(EECR&BIT(EEWE)))2.将地址写入EEAR。

3.置位EERE即可读出数据,读出的数据存在EEDR中。

注意:如果在写操作期间发生中断将会导致写擦做失败,如果一个操作E2PROM 的中断打断了另一个E2PROM操作,EEDR或EEAR可能被修改,引起读或写操作失败。

因此在主函数中在操作E2PROM期间要关闭全局中断(CLI()),操作完成后在打开全局中断(SEI())。

在头文件中包含eeprom.h,其中定义了几个有用的操作E2PROM的函数:void EEPROMReadBytes(int addr,void * ptr,int size)(1)void EEPROMWriteBytes(int addr,void * ptr,int size)(2) 对(1)其中addr是要读内部E2PROM的起始地址,ptr是读出数据存放数组的首地址,size是要读出的字节数。

对(2)其中addr是要写内部E2PROM的起始地址,ptr是写入数据存放数组的首地址,size是要写入的字节数。

#define EEPROM_READ(addr,dst) EEPROMReadBytes(addr,&dst,sizeof(dst)) #define EEPROM_WRITE(addr,src) EEPROMReadBytes(addr,&src,sizeof(src)) 参数的含义基本上同上面两函数,只不过在定义数组时要定义成char或unsigned char型的,正好保存一个字节长度。

同时,要定义数组的长度,这样就可以用此函数而省略一个参数。

时钟系统及时钟源的学习A VR的时钟系统包括:CPU时钟,I/O时钟,flash时钟,异步定时器时钟,ADC时钟。

A VR的时钟源包括:外部晶体/ 陶瓷振荡、外部低频晶振、外部RC 振荡器、标定的内部RC振荡器、外部时钟。

(另外,还有看门狗振荡器作为独立的振荡器为看门狗提供时钟。

)当PC端口的Bit6、Bit7(TOSC1和TOSC2)外接晶体(无需外部电容且针对32.768 kHz 的钟表晶体)时,此振荡器为T/C2提供异步时钟。

MCUCR单片机控制寄存器:MCUCR:SE休眠使能:为确保进入休眠模式,在执行SLEEP指令前必须将SE置位,MCU一旦唤醒即清除SE进入的休眠模式由SM2、SM1、SM0选择。

SLEEP的下一条指令。

一般情况下休眠模式可用掉电模式(010)和ADC噪声抑制模式(001)这两种。

系统复位学习Mega16有五个复位源:上电复位、外部复位(低电平复位,且持续时间至少1.5us)、看门狗复位、掉电检测复位、JTAG复位。

MCUCSR单片机控制和状态寄存器:ArrayMCUCSR:Bit4—0分别为JTAG复位标志、看门狗复位标志、掉电检测复位标志、外部复位标志(低电平复位,且持续时间至少 1.5us) 、上电复位标志。

这几个标志位发生复位时置位,除了上电复位标志在上电时复位将其清零,也可以写零将其复位,但上电复位标志只能通过写零将其复位。

WDTCR 看门狗定时器控制寄存器:(看门狗定时器由独立的1MHz 的片内振荡器驱动)WDTCR :WDTOE 看门狗修改使能(一旦置位,由硬件在紧接的4个时钟周期内自动清零), WDE 使能看门狗(置位时使能看门狗,复位时禁止看门狗,但禁止看门狗时WDTOE 必须置位才能复位WDE), WDP2、WDP1、WDP0 看门狗定时器预分WDR();用来复位看门狗。

为了防止无意间禁止看门狗,因此在禁用看门狗时必须跟一个特定的修改序列,即关闭看门狗的步骤如下:1. 在同一个指令内置位WDTOE 和WDE ,即使WDE已经置位。

2. 在紧接的4个时钟周期内对WDE 写零。

I/O 端口的学习I/O 端口寄存器的使用:在使用时要首先配置寄存器,DDRxn 为方向控制寄存器,配置为1时为输出,为0时为输入;PORTxn 是数据寄存器,当DDRxn 为1时PORTxn 置位则输出高电平清零则输出低电平,当DDRxn 为0时PORTxn 置位则使能上拉电阻清零则不使用内部上拉电阻(未连接的引脚一般使能内部上拉电阻);PINxn 为只读的数据输入寄存器。

每个端口都有第二功能,使用时要确定其功能。

SFIOR 特殊功能I/O 寄存器:SFIOR:BIT2-PUD :禁用上拉电阻。

置位即禁用,即使通过寄存器配置为使能。

端口A 的第二功能作为ADC 模拟输入的8个模拟输入通道。

端口B 的第二功能:端口C 的第二功能:端口D定时/计数(T/C)的学习Mega16单片机的定时计数资源有:两个8位定时/计数器T/C0、T/C2,一个16位定时/计数器T/C1。

都有对应的预分频器,其中T/C0、T/C1共用一个,T/C2也有自己的预分频器。

这三个定时/计数器分别有以下功能:1. T/C0能设置成8位的定时器或计数器模式,可以设置成比较匹配输出模式(其中比较匹配模式包括CTC 模式和PWM 模式(又包括快速PWM 模式和相位修正PWM 模式),其模式是通过WGM 的位设定的)。

2. T/C1能设置成16位的定时器或计数器模式;可以设置成比较匹配输出模式(其中比较匹配模式包括CTC 模式和PWM 模式(又包括快速PWM 模式,相位修正PWM 模式和相位频率修正PWM 模式),其模式是通过WGM 的位设定的),比较匹配输出有A 输出和B 输出两个通道;还可以设置成输入捕获模式。

3. T/C2能设置成8位的定时器模式(其中又可分为同步定时和异步定时,异步定时采用纽扣电池和手表晶振时可作为实时时钟RTC ),可以设置成比较匹配输出模式(其中比较匹配模式包括CTC 模式和PWM 模式(又包括快速PWM 模式和相位修正PWM 模式),其模式是通过WGM 的位设定的)。

定时/计数器T/C0TCCR0 T/C0控制寄存器:TCCR0:TCNT0 T/C0寄存器:TCNT0:OCR0 输出比较寄存器0:OCR0:定时/计数器T/C1TCCR1A T/C1控制寄存器A :TCCR1A :TCCR1B T/C1控制寄存器B :TCCR1B :TCNT1 T/C1寄存器:TCNT1H :TCNT1L :OCR1A 输出比较寄存器1AOCR1AH :OCR1AL :OCR1B 输出比较寄存器1BOCR1BH :OCR1BL :ICR1 输入捕捉寄存器1:ICR1H :ICR1L :定时/计数器T/C2TCCR2 T/C2控制寄存器:TCCR2:TCNT2 T/C2寄存器:TCNT2:OCR2 输出比较寄存器2:OCR2:ASSR 异步状态寄存器:ASSR :当AS2置位时时钟来源于TOSC1和TOSC2连接的振荡器,其与端口断开,不再是普通的I/O口,这两引脚连接手表晶振,频率为32.768kHz,同时也可配置外部电源作为当板子电源断开时的实时时钟RTC。

相关主题