当前位置:文档之家› AVR学习笔记

AVR学习笔记

AVR学习笔记
AVR学习笔记

PC = progammer counter //程序计数器

ACC = accumulate //累加器

PSW = progammer status word //程序状态字

SP = stack point //堆栈指针

DPTR = data point register //数据指针寄存器

IP = interrupt priority //中断优先级

IE = interrupt enable // 中断使能

TMOD = timer mode //定时器方式 (定时器/计数器控制寄存器)

ALE = alter (变更,可能是)

PSEN = progammer saving enable //程序存储器使能(选择外部程序存储器的意思) EA = enable all(允许所有中断)完整应该是 enable all interrupt

PROG = progamme (程序)

SFR = special funtion register //特殊功能寄存器

TCON = timer control //定时器控制

PCON = power control //电源控制

MSB = most significant bit//最高有效位

LSB = last significant bit//最低有效位

CY = carry //进位(标志)

AC = assistant carry //辅助进位

OV = overflow //溢出

ORG = originally //起始来源

DB = define byte //字节定义

EQU = equal //等于

DW = define word //字定义

E = enable //使能

OE = output enable //输出使能

RD = read //读

WR = write //写

中断部分:

INT0 = interrupt 0 //中断0

INT1 = interrupt 1//中断1

T0 = timer 0 //定时器0

T1 = timer 1 //定时器1

TF1 = timer1 flag //定时器1 标志 (其实是定时器1中断标志位)

IE1 = interrupt exterior //(外部中断请求,可能是)

IT1 = interrupt touch //(外部中断触发方式,可能是)

ES = enable serial //串行使能

ET = enable timer //定时器使能

EX = enable exterior //外部使能(中断)

PX = priority exterior //外部中断优先级

PT = priority timer //定时器优先级

PS = priority serial //串口优先级

第一部分

二极管发光的条件是正负极相差达1V以上。

AVR单片机控制负极更好。

用单片机的IO口去控制二极管的负极从而控制二极管。

IO复位后全部为输入工作方式内部上拉电阻无效,IO是三态高阻的状态

IO工作时读取外部引脚的电平一定要用PINXN这个才是反应真正的电平

AVR工作电源是5V

灯泡的DDRA=0XFF PORTA=0X00

LED灯管的DDRB=0XFF PORTB=0X00的时候量的

开关的时候是DDRB=0X00 PORTB=0XFF 打开不闭合不导通当PORTB=0的时候导通

让LED亮

#include

int main (void)

{DDRA=0xFF;

DDRB=0xFF;

PORTA=0xC0;PORTB=0xf7;

while (1)

{

}

}#include

#include

unsigned char digit[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

按键开关

int main(void)

{

DDRA=0xff;

PORTA=0x00;

DDRB=0xff;

DDRD=0x00;

PORTD=0xff;

while (1)

{

if((PIND^0xff)==4) {PORTA=0xF9; _delay_ms(1000);}

else

if ((PIND^0xff)==8){ PORTA=0xA4; _delay_ms(1000);}

else

if((PIND^0xff)==0x10) { PORTA=0xb0; _delay_ms(1000);}

else

if((PIND^0xff)==0x20) {PORTA=0x99; _delay_ms(1000);}}

}

按键按一下后弹起

#include

#include

#define F_CPU 800000UL

unsigned char digit[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

int main(void)

{

DDRA=0xff;

PORTA=0x00;

DDRB=0xf8;

DDRD=0X00;

PORTD=0XFF;

int i;

while(1)

{

if(~PIND&0x04) //保证其位为0

{

PORTA=digit[1];

_delay_ms(100);

}

else PORTA=digit[0];

}

}

第二部分 SPI通信

第三部分数码管

数码管由8段组成A B C D E F G P . 8 个连接在一起的发光二极管。

两种:共阳形共阴行。

驱动方式:静态驱动,动态驱动.

静态:一个IO 端口控制一个数码管。方便,耗电量大,占用资源多。

动态:一位一位动态点亮各个数码管。每隔一段时间点亮一次。占用资源少,不易控制。

8个段码加上几个位选。几个位选代表几个数码管。

数码管驱动芯片:CH451,

CH451可以驱动8个数码管或者64个发光二极管。串行数据的输入顺序是低位在前,高位在后。

CH451有4个串行接口;

4个:DIN DCLK LOAD DOUT .

DIN(输入线)DCLK(时钟线)LOAD(加载线)是带上拉的输入信号线,默认是高电平。

DOUT 串行数据输出线。

第四部分引脚

电源:VCC (电源)A VCC(模拟电源)GND

RESTE 外部复位脚

单片机一般是低电平复位。在RESTE上给一个低电平使其复位。

XTAL1 XTAL2 时钟

CH451的扫描顺序为DIG0-DIG7 一个引脚吸入电流时,其他引脚不吸入电流。

降低扫描极限可以提高数码管的亮度。

CH451有8个8位的数据寄存器。

第五部分键盘(PD的高四位作为输出口低四位作为输入口列线作为输入端行线作为输出端)

独立键盘:

根据电平的不同来判断是否按下。机械弹性触电开关。

按键抖动

键盘的消抖

硬件消抖:加入消抖电路(难度大)

软件消抖:软件设计(第一次确认后经过10MS再确认按键是否按下)

上拉电阻使能?

(PORTXN=1 PUD=1 DDRXN=0)三个条件都满足时表示上拉电阻有效。

当PORTXN=0表示其上拉电阻无效。

矩阵键盘:反转法和逐行扫描矩阵(由行线列线构成)按键未按下时是高电平,按下变成低电平

电平与信号

一个键盘对应一个IO口

IO 口有三态?上拉电阻

逐行扫描法:

确定有键按下:4行全部是低电平4列全部是高电平

确定后确定哪个键按下依次将行线设置为低电平列线全部为高电平

PA0-PA3控制行PA4-PA7控制列

输出端是不变的如果输入端是低电平输出端为高电平

输如端变为高电平

程序

#include

#include

unsigned char read_key(void)

unsigned char i,j,key_value=0xff;

DDRD=0xf0;

PORTD=0x0f;

if((PIND&0x0f) return Oxff;

else {

delay_ms(5);

if((PIND&0x0f)==0x0f) return 0xff;

else

{

for (i=4;i<8;i++)

{

PORTD=~(1<

for(j=0;j<4;j++)

{

if((PIND&(1<

key_value=(i-4)*4+j;

}

}

return key_value;

}

}

int main ()

{

//

}

第六部分:中断

中断:自动响应请求执行中断请求服务再回来。

优点:

实时处理

实现分时操作

进行故障处理

待机状态的唤醒

几个概念:

主程序

中断源:可以发出单片机的CPU中断请求的部件和设备(分类:非屏蔽中断可屏蔽中断软件中断)

中断请求信号:发出的申请信号

中断标志:对应的不同中断标志位有不同的变化

中断响应:停止现行程序转向中断服务程序

中断服务程序:中断要做到事情转向

断点:被打断的地方

中断现场保护

中断返回

中断向量

中断优先级(由硬件决定)

中断嵌套

响应A中断=全局中断标志中断A允许标志中断A标志(三个条件) 针对可屏蔽中断

ATMEGE16共21个中断源每个中断向量占2个字(4个字节)

中断响应过程:

第一:全局允许中断位清0 禁止响应其它中断被响应的中断标志位清0 将中断的断点的地址压入堆栈自动将响应中断向量地址压入程序计数器(中断服务程序的入口地址)

至少4个时钟周期

中断返回的过程

程序:

几个寄存器

MCUCR(ISC11ISC10)控制INT1(ISC01ISC00)

控制INT0

GICR(当它是1时开启中断)(中断使能寄存器)

GIFR(外部中断标志器)

#define F_CPU 7372800UL //定义时钟频率,保证delay函

数的准确

键盘中断

#include

#include

#include

int num_tab[10]={0xc0,0xf9,0xa4,

0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示数字时对应的PA口信号void led_num(unsigned int num) //数字输出函数

{

unsigned char temp,i;

for(i=0;i<4;i++)

{

PORTB=0XFF;

temp=num%10;

PORTA=num_tab[temp];

PORTB=~(1<<(3-i));

_delay_us(20);

num/=10;

}

}

//中断

SIGNAL(SIG_INTERRUPT0) //外部中断0所执行程序的内容{

sei(); //开总中断

PORTB=0X00;

PORTA=0xf0;

while(1);

}

SIGNAL(SIG_INTERRUPT1) //外部中断1所执行程序的内容{

sei(); //开总中断

PORTB=0X00;

PORTA=0x0f;

while(1);

}

void IO_init(void) //端口初始化

{

PORTA=0XFF;

DDRA=0XFF;

PORTB=0XFF;

DDRB=0XFF;

PORTC=0xff;

DDRC=0xff;

PORTD=0xff;

DDRD=0x00;

}

void interrupt_init(void) //中断初始化

{

MCUCR=0X03; //中断0、1为上升沿产生中断请求,GICR=0xc0; //开中断0、1

}

int main(void)

{

IO_init(); //端口初始化

interrupt_init(); //中断初始化

sei(); //开总中断

unsigned int a,b;

while(1)

{

for(a=0;a<9999;a++)

{

for(b=0;b<5000;b++)

led_num(a); //输出信号

}

}

}

按键中断的起始条件:

DDRA=0XFF;

DDRB=0XFF;

DDRD=0X00;

PORTD=0XFF;

中断函数

SIGNAL(SIG_INTERRUPT0)

void interrupt_init(void) //中断初始化

{

MCUCR=0X03; //中断0、1为上升沿产生中断请求,

GICR=0xc0; //开中断0、1

}

计时器计数器

定时计数器的长度 8位16位

脉冲信号源外部引脚和内部提供

计数器的类型 +1 -1

上下限最小值最大值

计数器的事件比较匹配中断

2个八位一个16位的计数器

主要是8位

T/C0

1单通道计数器

2比较匹配清0计数器

3允许使用外部引脚

410位的时钟分频器和频率发生器

5溢出和比较匹配中断源

6输出PWM信号

中断方式:溢出中断比较中断

时钟源

外部时钟源同步采样电路边缘检测电路

外部频率至少不能大于系统的 2.5分之一

宽度大于一个系统时钟周期

定时器的计数单元 +1 或者-1 或者清0

比较匹配中断输出比较寄存器 TCNT OCRN 两者相等时输出中断标志位置为1 为什么有些是到255?

定时器的工作模式:

普通模式

比较模式

PWM模式

TCNTO 记录初值

输出比较寄存器OCRO

TIMSK

TIFR

TCCRO 控制寄存器调节工作模式

用的是 WGM00 WGM01

CS02 CS01 CS02 0选择时钟源1 1 0 下降沿触发1 1 1 上升沿触发

void timer0_init() //计时器T0初始化

{

TCNT0 = 0;

TCCR0 |= (1<

TIMSK |=(1<

}

//ISR(TIMER0_OVF_vect)

SIGNAL(SIG_OVERFLOW0) //T0中断溢出函数

{

n+=1;

}

两个独立的中断源:

溢出中断TOVO 输出比较中断0CF0

总结

TCCRO T/C控制寄存器

是用来控制信息源的类别和模式的

TCNTO T/C寄存器

OCRO 输出比较寄存器

TIMSK T/C中断屏蔽寄存器

TIFR 中断标志寄存器

当TIMSK=0X01时是溢出中断

当TIMSK=0X02时是比较中断

中断标志寄存器是不用我们定义的电脑运行的时候中断执行会把它变为1

中断使能的意思是这个中断可以运行.

问:

0CR0=0XFF的时候CTC模式等于普通模式.

CTC与快速PWM的区别是两着的TOP不同,

快速PWM模式改变波形:

改变有效值(有效电压)

快速PWM模式

在比较匹配的时候电平变为0 达到最大值的时候(0XFF)变为1

0C0是在PB3上的打开这个端口是DDRB=0X04

当有输出的时候要打开0CO

不是所有的比较输出都要打开0C0的主要看要不要输出

0CR0是那个比较的数值.

TCO 八位计时器

TC1十六位计时器

使用内部时钟源计时

使用外部时钟源用来计数

{TCNTO=0X00;

TCCRO=0X07;

TIMSK|=(1<

}

要发生中断要按255次1号按键 T0对应PB0 按键可以吗? PB0好像没有按键.

在普通模式中当他完成溢出中断的时候他是返回原值还是0X00?

0X00

在CTC模式的时候是返回原值的。

脉冲宽度调节PWM 可以得到不同的电压输出。用电平控制电机。

频率

占空比相位 PWM的频率要大于42HZ 这样人眼观测不到灯的亮暗变化。PWM频率越高电压越平尾。PWM是数字脉冲。PWM定时器产生正弦波

采样频率至少为信号频率的2倍

为16KHZ 每隔8个点采样

第N 部分

模数转换器ADC

中断标志位?什么用的?

不懂?是不是不用我们自己定义,发生中断的时候系统自己会改的?

第九部分:

SPI 通信

CPOL=0 空闲是低电平启动变为高电平

=1时相反

CPHA=0是起始沿为采样结束沿为设置

问:

中断的条件:

中断允许为为1,全局中断为1,那个中断使能为为1?

顺序是则么样的?

只有当SS被拉低的时候SPI才开始工作。

数据的LSB MSB 是不是都是对于16位数而言的?

MOSI 主出从入

MISO 从出主入

主机的时候要主动控制SS 引脚

作为主机的时候 SS口为输出

从机的时候为输入外部主机控制引脚不需要认为控制

在SS至高的时候可以跟新SPDR里面的内容。

SPI 是一个字节一个字节移位的吗?是的

一个字节完全移出之后,传输结束标志是的。传递是一个位

一个位来的。

SPIF置位。如果此时SPCR寄存器的SPI中断使能位SPIE置位,就会产生中断请求。

MSB,LSB是最高有效位和最低有效位,也就是首位和尾位

SPI 系统的发送方向只有一个缓冲器,而在接收方向有两个缓冲器。

SS至高的时候是不是SPI不能传递数据

如果SS 配置为输入,必须保持为高以保证SPI 的正常工作。如果MSTR为"1”,SS配置为输入,但被拉低,则MSTR 被清零,寄存器SPSR 的SPIF 置位。

SCK

138页中的那两个PIN是什么意思?

MSB first (DORD = 0)

LSB first (DORD = 1)

对的

仔细看程序

SPI

DDRB =0XFF; //低四位输出低电平,使四位数码管均作显示

PORTB=0XF0;?SSzhi gao

第十部分ADC

ADC 控制和状态寄存器A -ADCSRA

ADC 多工选择寄存器- ADMUX

ADC 数据寄存器- ADCL 及ADCHSSS

特殊功能IO 寄存器- SFIOR

ADC中的分辨率指的是什么?

ADC的结果是补码的形式

模拟信号要尽可能短.

PA口有输入..模式并且关闭上拉电阻

第11部分USART

异步传输

异步通信是采用异步传输方式实现数据交换的一种方式. 波特率:数据位的宽度

数据帧格式

特点:

全双工操作

支持同步异步传输

独立的高精度波特率发生器

4种模式:

………..

数据寄存器UDR包括一个发送一个接收但是占用同一个地址.

只有在数据寄存器是空的时候才能被写入.

USART 控制和状态寄存器A -UCSRA ?Bit 7 –RXC: USART 接收结束

数据接受完成但还是没有被读出去的时候置1

?Bit 6 –TXC: USART 发送结束

数据发送完置1……。TXC 标志可用来产生发送结束中断. ?Bit 5 –UDRE: USART 数据寄存器空

UDRE为1说明缓冲器为空,已准备好进行数据接收.

?Bit 4 –FE: 帧错误

不懂?出错的时候会置为1.

?Bit 2 –PE: 奇偶校验错误

Bit 0 –MPCM: 多处理器通信模式

USART 控制和状态寄存器B -UCSRB ? Bit 7 – RXCIE: 接收结束中断使能

? Bit 6 – TXCIE: 发送结束中断使能

? Bit 5 – UDRIE: USART 数据寄存器空中断使能

? Bit 4 – RXEN: 接收使能

?RxD 引脚的通用端口功能被USART 功能所取代。?

? Bit 3 – TXEN: 发送使能

? Bit 2 – UCSZ2: 字符长度

? Bit 1 – RXB8: 接收数据位8

? Bit 0 – TXB8: 发送数据位8

USART 控制和状态寄存器 C -UCSRC

USART 波特率寄存器-UBRRL 和UBRRH

USART 接受以下30 种组合的数据

帧的格式:

? 1 个起始位

?5、6、7、8 或9 个数据位

?无校验位、奇校验或偶校验位

?1或2 个停止位

数据帧以起始位开始

波特率改变了,正在进行的接受将被打断.

UBRRH UCSRC 两者占用相同的IO 口用最高位URSEL来设置

URSEL =0是写入的是UBRRH 波特率的高四位

URSEL=1是写入的是UCSRC

USART的初始化包括波特率的设定帧结构的设定以及根据需要使能发送器和接收器.

改变USART 要在没有数据传输的情况下进行

TXC检查数据是否发送完成

RXC检查接受缓存器中是否还有数据

每次放送前TXC必须清0。

数据中中断?

不懂

中断执行时自动清0 也可以写“1”清0.不懂?

AVR单片机EEPROM和FLASH区别

AVR单片机EEPROM和FLASH区别 为什么A VR单片机既有FLASH又有EEPROM?我如果要烧写程序只用HEX文件行么?那个EEP文件有什么作用? 你的程序代码是保存在FLASH里的,只烧写HEX文件就可以。EEP文件是EEPROM的初始化数据文件,如果不烧写,EEPROM会保持FF,如果烧写了这个文件,就会按照你的初始化要求初始化EEPROM。在实际中有时往往不仅仅需要程序代码,还需要用到一些数据,而这些数据又会根据情况的不同而变化。举个例子,比如我要测量一个电机的转数,而每天电机最多测量12个小时,要求记录这12个小时的转数,然后第二天从这个数值继续测量,当然第二天单片机也会重新上电。遇到这个情况你如何去保存你的记录数值呢?当然这就需要用到EEPROM了。EEPROM存取数据方便,掉电不丢失,适合记录这种要求有变化又要求掉电不丢失的数据。当然EEPROM也可以作为程序存储器来存放程序。但是A VR单片机的BOOTLOADER是ATMEL提供的,只能够从FLASH开始。其次,即使能够使用EEPROM做程序存储器,如今也不会采用这样的方式,因为EEPROM造价比FLASH要高很多,同时存取速度比FLASH要慢得多,因此如今的程序基本都是被放入FLASH中,而EEPROM只用来存放那些不希望丢失的数据而用了 FLASH 一个静态的只读存储器,单片机本身无法修改自己 EEPROM 是指5V或3.3V可擦写存储器,可以由单片机本身编程写入一般用来做掉电保护,也可以由烧程器写入。烧程时当然只用HEX文件AVR编程的时候,可以对EEPROM编程 设置你想要的初始化量 简单的说,flash是保存程序的,eeprom是保存程序需要用到的,掉电不会丢失的变量,通常是初始值之类的。通常flash不会被程序改写(avr有bootloader 功能,可以修改flash甚至bootloader自身),而eeprom则很容易被改写。 一般来讲,实际应用中eeprom用的不多,除非对成本极为看重,因为片内的eeprom比较不可靠,当电压不稳时,数据容易丢失。 AVR系列单片机的FLASH存储器、SRAM存储器、EEPROM存储器各有什么用途? FLASH:单片机运行的程序存储的地方。

AVR studio 中断、计时器程序

本程序应用了外部中断1、0,定时器中断0, 初始显示变量uname(100000), 按下中断1显示内容减1,中断0加1,定时器每隔一秒加1 显示子函数A VR_display; 频率1M A口接数码管段选 B口接数码管位选 */ #include #include volatile unsigned long Ex_i; //定时器用的变量 volatile unsigned long uname=100000;//初始显示内容 /*=====0-9=====A-G=====*/ unsigned char table[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; //共阳极数码管的段码0 1 2 3 4 5 6 7 8 9 A B C D E F /*0-7*/ unsigned char num[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //共阳极数码管的wei码0 1 2 3 4 5 6 7 8 void init_avrinter();//外部中断初始化 void init_avrtimer0();//计数器0初始化 void delay(unsigned int x);//延时函数 void AVR_display(unsigned long nnn);//显示函数 int main() //主程序 { DDRA=0xff; //设置方向寄存器为输出 DDRB=0xff; DDRD=0xff; PORTD=0xff; init_avrinter(); init_avrtimer0(); while(1) { A VR_display(uname); } } void init_avrinter()//外部中断初始化 { sei(); //开总中断

avrEEPROM数据丢失问题原因与解决方案

avr EEPROM 数据丢失问题原因与解决方 案 总结一下引起AVR内部EEPROM数据丢失的原因: 1.程序问题; 2.程序跑飞; 3.EEPROM相关寄存器因强磁场、高压静电等外部干扰出错所产生的写入动作; 4.系统有很大的感性负载,在断电的时候会产生一 个反向高压,EEPROM有可能会自擦除。 ……(还有什么原因,欢迎大家继续列举,以便完善及想办法解决) 针对问题1,程序问题不再该文讨论范围内。 针对问题2,程序跑飞,这个因该是引起EEPROM数据丢失的主要原因。但是引起程序跑飞的原因却是多方

面的。 第一.电压不正常,工作不稳定,程序跑飞。针对这个问题,可以开启内部BOD、或者外加复位芯片解决,在低功耗场合,外部复位是有必 要的,毕竟BOD功耗太高。 第二,晶体振荡受干扰,频率不稳定,程序跑飞。针对这个问题,建议晶体使用全幅振荡,并且走线的时候尽量短,并且使用地线隔离。 第三系统受外界环境干扰,修改了PC等寄存器,程序跑飞。针对这个干扰问题,这个引起程序跑飞的可能性应该不大,如果环境实在恶劣 ,那么就应该想到做电磁屏蔽,ESD保护等,如果还不行,那么只能建议换换别的单片机试试看了。 针对问题3,我们只能优化电路设置,尽量避免,比如加屏蔽罩,加ESD保护,加TVS保护,电源加电容退耦等等。

针对问题4,如果系统真的具有很大的感性负载,那么请注意加续流二极管、滤波电容等做保护,不要让这种反向高压产生,无论如何,这 种因为感性负载突然断电自激产生的高压,不仅仅会对EEPROM有影响,而是对整个系统都存在威胁。 ================================================= ================================================= ============ 经过上面硬件上的一些处理,虽然EEPROM数据丢 失的可能已经很小了,但是我们仍然不能保证EEPROM数据就不会丢失了。这时EEPROM数据的可*性,那就得从软件上去考虑了,接着我们从 软件的方面继续讨论。 我的做法是,数据分块,分区,校验,备份。当然这里讲的处理方法,仅仅是提供一种想法,你可以做不同数据长度的分块,不同大小的 分区,采用不同的地址映射方法,以及采用更多次的数据备份。下面以Mega168为例继续讨论。 1.Mega168EEPROM512字节,把EEPROM分为两个区,每个

人教版五年级英语下册随堂整理笔记

第一模块This Is My Day A部分 一、常用句型 When do you +动词原形+其他? (你什么时候做……?) when:引导特殊疑问句,用来提问时间。 do:是助动词,没有实际意义,帮助构成疑问句。 回答通常为:主语(+频度副词)+动词+at+时间。 例句: When do you do morning exercises ? I usually do morning exercises at 8:30 . When do you eat dinner ? I usually eat dinner at 7:00 in the evening . When do you get up ? I usually get up at 12:00 noon . 如果该句型的主语是第三人称单数(如:he/she/it/Xiaoming/Tom等),助动词do要变成does。句型基本结构为: When does he/she/it/Xiaoming/Tom +动词原形+其他?

例句: When does he get up ? He usually gets up at 7:00 . 二、常用短语 do morning exercises eat breakfast eat dinner get up have English class play sports on the weekend in the morning/evening What about you ? Can I ask you some questions ? Look here ! This is my weekend timetable . It’s great . go swimming go shopping go to school go to work go to bed

AVR单片机教程13—第十三课 ATMEAG16L的外部中断编程实践

—————————————————————————— 第十三课ATMEAG16L的外部中断编程实践 本教程节选自周兴华老师《手把手教你学AVR单片机C程序设计》教程,如需转载,请注明出处!读者可通过当当网、淘宝网等网站购买本教程,如需购买配书 实验器材,可登陆周兴华单片机培训中心网购部自助购买! Atmega16L具有多达20个中断源,这里我们进行外部中断的实验,其它的等到介绍到相关内容时可进行适当的实验。 1.外部中断0 外部中断0由引脚INT0(PIND2)触发。如果INT0引脚按照MCUCR寄存器中的ISC01、ISC00设置的方式发生跳变,则不管是否lNT0中断使能,INT0中断标志位INTF0都将置位。如果SREG 寄存 器的全局中断位I和通用中断控制寄存器GICR中的INT0中断使能位INT0置位,则单片机培训开始 执行中断程序。在进入中断服务程序时,INTF0被硬件清零。必须指出,不管INT0(PIND2)引脚 方向位设置如何,只要INT0引脚发生规定的跳变,都会触发中断。中断标志位INTF0只在满足发生 中断的条件时置位,一旦条件变化,INTF0被硬件清零。向INTF0位写“1”也会对其清零。 2.外部中断1 外部中断0由引脚INT1(PIND3)触发。如果INT1引脚按照MCUCR寄存器中的ISC11、ISC10设置的方式发生跳变,则不管是否lNT1中断使能,INT1中断标志位INTF1都将置位。如果SREG 寄存 器的全局中断位I和通用中断控制寄存器GICR中的INT1中断使能位INT1置位,则开始执行中断程 序。在进入中断服务程序时,INTF1被硬件清零。必须指出,不管INT1(PIND3)引脚方向位设置 如何,只要INT1引脚发生规定的跳变,FPGA培训都会触发中断。中断标志位INTF1只在满足发生 中断的条件时置位,一旦条件变化,INTF1被硬件清零。向INTF1位写“1”也会对其清零。 3.外部中断2 外部中断2由引脚INT2(PINB2)触发。如果INT2引脚按照MCUCR寄存器中的ISC2设置的方式发生跳变,则不管是否lNT2中断使能,INT2中断标志位INTF2都将置位。如果SREG 寄存器的全局 中断位I和通用中断控制寄存器GICR中的INT2中断使能位INT2置位,则开始执行中断程序。在进 入中断服务程序时,INTF2被硬件清零。必须指出,不管INT2(PINB2)引脚方向位设置如何,只 要INT2引脚发生规定的跳变,都会触发中断。中断标志位INTF2只在满足发生中断的条件时置位, 一旦条件变化,INTF2被硬件清零。向INTF1位写“1”也会对其清零。 8.2.1 INT1中断实验

AVR单片机WinAVR及Proteus仿真外部中断

本文主要以AVR单片机atmega48的外部中断的在Proteus上仿真的例子介绍AVR单片机C 语言开发环境WinAVR的使用(如何包含头文件,如何写中断服务程序,如何配置编译产生hex文件),及其在Proteus上的仿真实现(如何建立仿真图,载入hex文件进行仿真) 本例子完全为PC上软件仿真所以不涉及硬件,其全部所需软件清单如下: WinAVR、Proteus、atmega48_Datasheet 软件的下载安装,请参考网上其他教程,有很多,很容易的。 atmega48单片机的数据手册网上中英文的版本也都可以下载到。 下图是笔者所使用的软件截图,不同版本可能稍有差异,但基本不影响使用。 下面我将在假设您已经安装好2个软件(当然目前您不需要知道它们是怎么用的),并且对单片机和C语言有基本了解的基础上进行例程的演示。 let's begin。 首先要明确我们要完成的功能:单片机开始工作后,点亮LED灯1S,灭掉LED灯1S,如此循环3次,然后单片机进入无限循环,等待外部按键button按下,LED等再次点亮,当再次按下button时,LED等灭掉,如此循环。

接着画出要实现这个功能的电路,以便后续仿真。 先在桌面建一个文件夹Hello_AVR,如图。 打开软件,这个图标。 在软件界面上,右键Place->Component->From Libraries 在Keywords里面输入atmega48,选择一个32PIN管脚的单片机放到图上

同样的方法,放置一个LED灯,一个button,电阻,电容。

放置POWER和GND

图完成,在文件夹Hello_AVR下新建文件夹Sim,保存在这里 这里用PB0管脚来驱动LED灯,查阅芯片的数据手册或直接从图中可以知道,外部中断0(INT0)在PD2管脚。而且Proteus的好处是,这里我们给单片机画电源的麻烦也可以省去。 接下来要做的就是看数据手册和建立工程,编程,编译的事了。 打开Programmers Notepad File->New->Project新建工程Hello_AVR,保存到Hello_AVR文件夹

AVR常用操作

IAR编译器配置(AVR ) 一、EEPROM 区域数据存储: __eeprom unsigned char a;//定义一个变量存放在EEPROM空间 __eeprom unsigned char a @ 0x8;//定义一个变量存放在EEPROM空间0X08单元 __eeprom unsigned char p[] @ 0x22//定义一个数组存放在EEPROM空间,开始地址为0X22单元 __eeprom unsigned char a @ 0x08=9;//定义一个常数存放在EEPROM空间0X08单元 __eeprom unsigned char p[] @0x22={1,2,3,4,5,6,7,8}; EEPROM操作宏取函数:在comp_a90.h intrinsics.h头文件里有详细说明。 自动生成.eep文件置:在Project->Options->linker->config>的linker command line中观察该Project使用了哪个XCL文件。本文使用M8编译,使用文件 是”TOOLKIT_DIR$\src\template\cfgm8.xcl”-Ointel-extended,(CODE)=.hex -Ointel-extended,(XDATA)=.eep 二、FLASH 区域数据存储: 用关键字__flash 控制来存放,__ flash 关键字写在数据类型前后效果一样 __flash unsigned char a @ 0x8;//定义变量存放在flash 空间0X08单元__flash unsigned char p[] @ 0x22//定义数组存放在flash 空间,开始地址为0X22单元 __flash unsigned char a @ 0x08=9;//定义常数存放在flash 空间0X08单元 __flash unsigned char p[] @ 0x22={1,2,3,4,5,6,7,8}; unsigned int __flash * p;//定义个指向flash 空间地址的指针,16位。 unsigned int __farflash * p;//定义指向flash 空间地址的指针,24位。 __flash unsigned char * p; //定义指向SARMM空间地址的指针,指针本身存放在flash 中。 flash 操作宏函数:在comp_a90.h intrinsics.h头文件里有详细说明 三、IAR编译器对位的支持更强大: PORTB_ Bit2=1; //置PORTB的第2位=1 PORTC_Bit4=PORTB_Bit2;//把PORTB的第2位传送到PORTC的第4位 四、头文件 avr_macros.h里面包含了读写16位寄存器的简化书写,和几个位操作函数 comp_a90.h对大量的内在函数做了简要书写,flash 操作宏函数 ina90.h包含"inavr.h" "comp_A90.h"文件 intrinsics.h内在函数提供最简单的操作处理器底层特征。休眠,看门狗,FLASH函数。 iomacro.H I/O寄存器定义文件样本。 #include #include #include #include #include #include #include #include #include

考研英语真题阅读 夜 篇精读直播随堂笔记

Text3 ①The US$3-million Fundamental Physics Price is indeed an interesting experiment,as Alexander Polyakov said when he accepted this year’s award in March. 正如亚历山大.波利亚科夫在今年三月接受今年的基础物理学奖的时候所说的那样,金额达到300万美金的基础物理学奖的确是个有趣的尝试。 (这一奖项的本质与诺贝尔奖有着天壤之别,后者只有当一项成果已经经历了彻底的测试和验证才会被认定为是突破性的进展,有时往往与最初的发表相隔几十年的光景。与此相反,基础物理学奖似乎以那些理论上的进步为目标,在这次获奖的9位科学家中,有6人都从事与弦理论有关的研究。) Yuri Milner 投资人:Facebook、Whatsup、AirBnB、Snapchat、Spotify等以及阿里巴巴、京东、滴滴、小米和美团等公司。 ②And it is far from the only one of its type. 1.far from being; China is far from being a world economy leader. 中国远不是世界经济的领导者。 同类型的奖项也远非这一个。 ③As a News Feature article in Nature discusses,a string of lucrative awards for researchers have joined the Nobel Prizes in recent years. 正如《自然》杂志上一篇新闻专题文章所讨论的那样,近年来一系列金额丰厚的奖项加入到了诺贝尔奖的行列。 ④Many,like the Fundamental Physics Prize,are funded from the telephones-number-sized bank accounts of Internet entrepreneurs. 像基础物理学奖一样,很多奖项的经费来自互联网企业家的巨额银行账户。 ⑤These benefactors have succeeded in their chosen fields,they say,and they want to use their wealth to draw attention to those who have succeeded in science. 这些出资人在他们所选领域获得了成功。他们想用他们的财富让人们去关注那些在科学上取得成功的人。 ①What’s not to like?Quite a lot,according to a handful of scientists quoted in the News Feature. 有什么不妥呢?就新闻专题引用的少数科学家的话来讲,有很多。 ②You cannot buy class,as the old saying goes,and these upstart entrepreneurs cannot buy their prizes the prestige of the Nobels. 俗话说,你买不来阶级,这些新兴的企业家没法给他们设立的奖项买来像诺贝尔奖那样的声望。 ③The new awards are an exercise in self-promotion for those behind them,say scientists. 科学家们说,这些奖只不过是设立这些奖的人的自我炒作而已。

avr睡眠模式(包涵源程序)

AVR单片机电源管理及睡眠模式应用实例(含源代码) AVR单片机电源管理及睡眠模式应用实例(含源代码) /*********************************************** **** AVR 电源管理_睡眠模式范例 *** **** *** **** 作者: HJJourAVR *** **** 编译器:WINAVR20050214 *** **** *** ***********************************************/ /* 本程序简单的示范了如何令AVR ATMEGA16进入睡眠状态及唤醒 电源管理及睡眠模式的介绍 进入最低耗电的掉电模式 关闭各种模块 外部中断唤醒 M16掉电模式的耗电情况(看门狗关闭),时钟为内部RC 1MHz 0.9uA@Vcc=5.0V [手册的图表约为1.1uA] 0.3uA@Vcc=3.3V [手册的图表约为0.4uA] //测量的数字万用表是FLUKE 15B,分辨率0.1uA 这个程序需要MCU进入休眠状态,为实现最低功耗,JTAG接口会被关闭,只能通过LED的变化来观察程序的运行。 这个实验里面,用STK500(AVRISP) ISP下载线来烧录更方便。 熔丝位设置 1 关断BOD功能 BODEN=1 2 如果用ISP方式烧录,就可以完全关闭JTAG口了 OCEEN=1,JTAGEN=1 */ #include #include #include #include //时钟定为内部RC 1MHz,F_CPU=1000000 也可以采用其他时钟 #include /* sleep.h里面定义的常数,对应各种睡眠模式 #define SLEEP_MODE_IDLE 0 空闲模式 #define SLEEP_MODE_ADC _BV(SM0) ADC 噪声抑制模式

AVR使用范例--EEPROM使用详解

AVR使用范例--EEPROM使用详解 本页关键词:什么是eeprom spi eeprom eeprom程序eeprom资料eeprom结构eeprom 读写eeprom的读写 本页详细介绍ICC自带EEPROM操作函数的操作方法,包括单字符读写,数组读写,结构体读写。 程序代码:下载相关文件 ?void main(void) ?{ ? unsigned char temp1,temp2; /*定义变量*/ ? unsigned char buffer[10]; /*定义数组*/ ? unsigned char buf[]="AVR与虚拟仪器"; /*定义字符串*/ ? ? EEPROMwrite(0x10,'a'); /*单字符写入到0x10,注意是单引号*/ ? temp1 = EEPROMread(0x10); /*读一个字符到temp1*/ ? ? ? EEPROM_WRITE(0x20,"abcdefg"); /*写字符串到0x20*/ ? EEPROM_READ(0x20,temp2); /*读字符到temp2,temp2=a*/ ? EEPROM_READ(0x20,buffer); /*读字符串到数组中 buffer[10]=abcdefg */ ?

? EEPROM_WRITE(0x30,buf); /*数组中的值写到EEPROM中:0X30开始为"AVR与虚拟仪器"*/? ? while(1) ? ; ?} ? 调试后的效果: 调试eeprom的时候,记住设置Avr studio保护eeprom数据,否则每次都会将eeprom中的数据改为0xFF。如下图: 打开调试选项: 钩选保护eeprom数据选项:

三年级语文教学随堂笔记

三年级小学语文教学 三年级是个过渡时期,从低年级到中年级的转变,教学目标也有了新的变化。如何来上好三年级的语文课,对于我一个刚刚进入教育行业的人来说是一件不容易的事情,我在教学过程中稍有感悟,尝试着把理论性的东西附着到实践中去,打好教学起步阶段的基础。 一、激发学生情趣,引发猜想,也就是创建趣味、和谐的课堂氛围吸引学生,提高教学效果, 三年级的语文教材,教材内容形式多样化。要想让学生一堂课全神贯注的听讲确实不易,就算是好同学也很难做到。老师讲课的时候必须让他们把焦点放在老师身上。开始上课的时候常常觉得力不从心,觉得孩子总是不是那么认真的听课,不能那么专心,开小差,常常半路停下来处理课堂纪律问题。反省觉得是自己纪律没抓好?后来与老教师交流,我开始反思课堂纪律不单是孩子的问题,更多的也是老师的问题,正如所说“我拿什么去吸引你--我的孩子。”我开始注重提高课堂本身的趣味性,更加用心的去好好的备课。你的课有激情,同学们也容易被你的激情所带动,所感染;你的课有意思,同学们才乐意全身心的步入你的课堂,走进乐于学习的世界。所以要用心备课、认真备课,不备好课,不进课堂。 二、培养学生良好的学习习惯和愉快的学习环境,提高学生“自主、合作、探究”学习的能力。 新的教学模式要求老师在课堂上要有小组合作探究的过程,要“以生为本”。教师在新课程中最大的是角色的变化,教师将不再只是知识的传授者和管理者,更是学生发展的促进者和引导者。在新课程中,学生的学习方式从传统的接受学习向探究学习转变,而教师的工作就在于帮助孩子们确定适当的学习目标,并确定和协调达到目标的最佳途径;知道学生养成良好的学习习惯,掌握学习的策略和发展能力;创设丰富的教学情境,激发学生的学习动机和学习兴趣,充分调动学生的学习积极性。 孩子的成长基本上得益于自己的学习。要大胆放手,让学生成为学习的主人,在课堂教学过程中,多采用同桌间互读互讲,小组讨论、一些朗读游戏的方式拓宽他们的合作能力。在小组长的带领下去发掘问题去解决问题。再者多问一些有创建性的问题来启发学生的思维。老师本身在这方面也得下苦功夫去研究,哪些问题是可以问的,如何问?学生会有哪些答案,是否能达到自己想要的教学效果? 三、鼓励学生多阅读课外书籍,同时自己也要多读、多看、多思考。

AVR单片机外部中断0、1、2详解

AVR单片机外部中断0、1、2 详解 中断基本包含: 1.中断源 2.中断向量(中断入口地址) 3.中断优先级 4.中断函数 除此之外,在单片机中,中断的执行或者中断的触发必 须符合以下的规则:中断触发|执行= 全局中断使能位AND 中断源使能位AND 中断源标志位 单片机内部中断的触发必须完成,全局中断使能,中断 源使能,中断源标志位置一等条件。除此之外,如果是 外部中断0,1,2(INT0,1,2),必须设置引脚触发的规则。最后呢,就是需要在程序里建立处理中断的中断 函数。 在编程的时候的步骤大致如下:(无视INT2) 1. 初始化PD2,PD3 为输入状态。DDRD|=BIT(2)|BIT(3); 2. 设置INT0,1 引脚触发的规则,实验中为低电平触发。MCUCR=0xF0; 3. 设置INT0,1 中断源使能位为逻辑1。 GICR|BIT(7)|BIT(6); 4. 清除INT0,1 的中断标志位(软件写入,逻辑1 为清

除)。GIFR|=BIT(7);BIT(6); 5. 全局中断允许位使能。SREG|=BIT(7); 6. 编辑中断处理函数。 /*ATmega16提供3个外部中断,分别由INT0、INT1和INT2引脚触发。 需要注意的是,如果将ATmega16设置为允许外部中断,则即使把INT0、INT1和INT2引脚 设置为输出方式,外部中断仍然会被触发。外部中断可选择采用上升沿触发、下降沿触发和 低电平触发(INT2中断只能采用沿触发方式。 */ #include; #include; #include "smg.h" /*1.状态寄存器SREG bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0 I T H S V N Z C I:全局中断使能位。 在I置位后,单独的中断使能由不同的中断寄存器控制。若I为0,则禁止中断。 MCU 控制寄存器- MCUCR MCU 控制寄存器包含中断

AVR使用范例EEPROM使用详解

本页详细介绍ICC自带EEPROM操作函数的操作方法,包括单字符读写,数组读写,结构体读写。 程序代码:下载相关文件 ?void main(void) ?{ ? unsigned char temp1,temp2; /*定义变量*/? unsigned char buffer[10]; /*定义数组*/? unsigned char buf[]="AVR与虚拟仪器"; /*定义字符串*/? EEPROMwrite(0x10,'a'); /*单字符写入到0x10,注意是单引号*/ ? temp1 = EEPROMread(0x10); /*读一个字符到temp1*/ ? EEPROM_WRITE(0x20,"abcdefg"); /*写字符串到0x20*/ ? EEPROM_READ(0x20,temp2); /*读字符到temp2,temp2=a*/ ? EEPROM_READ(0x20,buffer); /*读字符串到数组中 buffer[10]=abcdefg */ ? EEPROM_WRITE(0x30,buf); /*数组中的值写到EEPROM中:0X30开始为"AVR与虚拟仪器"*/ ? while(1) ? ; ?} 调试后的效果: 调试eeprom的时候,记住设置Avr studio保护eeprom数据,否则每次都会将eeprom中的数据改为0xFF。如下图: 打开调试选项: 钩选保护eeprom数据选项: 打开相关观测窗口:

按F10逐条语句运行,查看运行结果。 1. 地址10上的值被改写为“a” 2. temp1的值变为a,及读取了地址0x10的值a: 3. abcdefg写入20开始的地址:

六年级语文下册第一单元随堂笔记

六年级语文上册 第一单元随堂笔记 一、词语盘点 读读写写: 挪移蒸融游丝插秧枯萎基业幸而一番考验锻炼转化优雅赤裸裸专心致志无缘无故语重心长狂风暴雨勃勃生机 读读记记: 哲理英俊惊羡幅度慌乱艰难喧哗附和冒险消受机敏堂皇名义薄弱附庸刹那间座无虚席意想不到惊心动魄养尊处优 二、日积月累 1.人非生而知之者,孰能无惑?《师说》 解释:人不是生下来就懂得道理的,谁能没有疑惑?说明了人人都有自己不懂的地方。 2.一鼓作气,再而衰,三而竭。《左传》 解释:擂一通鼓,勇气振作起来了;擂两通鼓,勇气就衰弱了;擂三通鼓,勇气就完结了。现用来比喻趁劲头大的时候一下子把事情做完。说明做事情应一气呵成的道理。 3.甘瓜苦蒂,天下物无全美。《墨子》 解释:再甘甜的瓜,瓜蒂都是苦的,天下的事物没有十全十美的。说明任何事物没有十全十美的道理。

4.种树者必培其根,种德者必养其心。《传习录》 解释:种树必须培育它的根,教人以德行则必须教养他的思想。说明了浇树浇根,育人育心的道理。 5.操千曲而后晓声,观千剑而后识器。《文心雕龙》 解释:练习了上千支曲子后才知道音乐的美妙,观看了千支剑后才能识别兵器的好坏。说明了多实践才能出真知的道理。 三、课内复习要点: 1 文言文两则 1.《学弈》选自《孟子·告子》。通过写弈秋教两人下棋的事,说明了学习应专心致志,不可三心二意的道理。 2.《两小儿辩日》选自《列子·汤问》。讲述了孔子路遇两个小孩在争论,一个认为太阳在早晨离人近,一个认为太阳在中午离人近,为此,双方各持一端,争执不下,就连孔子这样博学的人也无法裁决,被两个小孩笑话。故事体现了两小儿善于观察、说话有理有据和孔子实事求是的态度。 3.孟子是我国古代的思想家,教育家,被称为“亚圣”。后世将他与孔子合称为“孔孟”。《孟子》是孟子与他的弟子合著的,内容包括孟子的政治活动、政治学说、哲学思想和个性修养等。 孔子是春秋时期的思想家,教育家,政治家,儒家学派的创始人。孔子一生的言行被弟子编成《论语》一书。

马潮老师:AVR应用经验

AVR 应用经验 作者:马潮老师 /整理:armok / 2005-01-17/ https://www.doczj.com/doc/6f10890502.html, AVR与传统类型的单片机相比,除了必须能实现原来的一些基本的功能,其在结构体系、功能部件、性能和可靠性等多方面有很大的提高和改善。 但使用更好的器件只是为设计实现一个好的系统创造了一个好的基础和可能性,如果还采用和沿袭以前传统的硬件和软件设计思想和方法的话,是不能用好AVR的,甚至也不能真正的了解AVR的特点和长处。 功能越好的器件,需要具备更高技术和能力的人来使用和驾驭它。就象一部好的F1赛车,只有具备高超技术的驾驶员才能充分体会到车的特点,并能最大限度的发挥出车的性能。 AVR具有上手入门快,开发方便简单的特点,但要充分体会和发挥AVR的优点,还需要应用工程师本身的硬软件设计开发能力的不断学习、实践提高。 “外行看热闹,内行看门道”,对于有一定基础的嵌入式和单片机系统设计开发的工程师,不妨先简单尝试一下AVR。 开发环境与工具:PC+下载线+实际的系统板 PC上的开发软件: AVR Studio(Free)汇编+汇编调试+高级语言调试+软件仿真 ICC、CVAVR、BASCOM-AVR 高级语言程序开发+程序下载。其中一个购买正版全功能,作为主要的开发环境,其它使用DEMO版,作为辅助及参考。 AVR ISP下载线: STK200 and STK200+ and STK300 ISP programmer。通过PC的打印机口,采用ISP技术将系统运行代码(HEX、BIN)和数据写入AVR芯片的Flash和EEProm中,编程AVR的配置熔丝位和加密位。支持决大多数的AVR芯片、以及ATMEL的51兼容芯片89S8252、89S52等。在ICC、CVAVR、BASCOM-AVR、BASCOM-8051中都内含对该下载线的支持程序。免费专用的下载程序:SLISP、PonyProg2000等。 尽量不使用仿真器的建议: 在开发和调试系统程序时,有许多人完全依赖于仿真器,一旦离开了仿真器时就感觉无从下手。其实,由于AVR的Flash存贮器可方便的使用ISP技术在线的多次擦写,因此建议尽量不使用(依赖)仿真器来开发和调试程序。 在实际开发过程中,程序的调试可以从下几方面入手: 现在的高级语言编译器(如C编译器)可以产生效率很高的机器代码,因此建议大家尽量使用高级语言编写系统程序。 使用Atmel公司提供AVR Studio软件模拟仿真环境,以及其他的软件模拟仿真环境(BASCOM-AVR)。 尽可能使用高级语言编写系统程序。 利用目标板上的LED、LCD或异步串口。见附件“没有仿真器的情况下如何开发AVR”的介绍。

(完整word)六年级英语下册随堂笔记

第一模块How Tall Are You ? 一、常用句型 (一)形容词的比较级句型 A+be动词+形容词的比较级(如:taller,stronger,older)+than+B A比B更…… 例如: You are taller than your brother . I am fatter than Xiaojun . (二)A比B高或重或大或小多少的句型 A + be动词+数字+单位(如:cm,kg)+形容词比较级+ than+ B 例如: You are 4 cm taller than me . I am 10 kg heavier than Tom . John is 2 years younger than her . (三)描述身高的句型: 主语+be动词+ 数字+ 长度单位(如:cm、m)+ tall . 例如: I’m 160 cm tall . My mother is 1.62 m tall . (四)询问对方身高、体重、年龄、大小、长度的句型: 问句:How+形容词(如:tall/heavy/old/big/long)+be动词+主语?

答句:主语+be动词+ 数字+ 单位(如:cm/kg/years)+ 形容词. 例如: How tall are you ? I’m 160 cm tall . (五)形容词比较级的变化规则

(六)如何用“how”问体貌 How tall are you ? How old are you ? How heavy is your brother ? How long is its tail ? How big are your hands ? (七)“one”做代词的用法 one是数字“一”的意思,但有时用它做代词,用来代替上文中已经出现过的单词,以避免重复。例如: Which monkey do you like ? I like the yellow one . (八)“up to…”的含义 “up to…”表示“达到……”,后面常接数字。例如: each up to 20 cm long Up to ten people can sleep in this room . 二、常用短语 from shorter to taller from……to…… I wear size 17 . up to…… dive into……jump out of…… good swimmer have a try 三、单词

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—4 Bit1、0

MCUCSR 单片机控制和状态寄存器: 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 是中断向量标号,在头文件中定义的向量号一般前加 ”iv_中断源名称”,宏定义相当于直接使用向量号,但用起来意义明显。 注意:外部中断源的引脚一定要设置成输入作为中断检测的输入接口,而且一定要设置成带上拉电阻的方式(DDRD=0x00,PORTD=0xFF ),否则PD 端口一直为低电平就会一直触发中断。 在ICCA VR 中可以用Wizard 来生成服务程序,一个很简单的工具。只需对生成代码做简单的修改即能完成相应的功能,节省的代码的书写,同时提高了编程的效率。 E 2 PROM 学习 Mega16有512Bytes 的E 2PROM ,用户可以通过操作其控制寄存器来实现对其读写即对E 2PROM 各存储单元的访问。 与E 2PROM 有关的寄存器: EEAR 地址寄存器(分为两个字节EEARH 、EEARL ): EEARH : EEARL : E 2PROM 的初值无定义,因此必须为其赋一个确定的数值。 EEDR 数据寄存器: EEDR :

avr EEPROM 数据丢失问题 原因与解决方案

avr EEPROM 数据丢失问题原因与解决方案 总结一下引起AVR内部EEPROM数据丢失的原因:1.程序问题;2.程序 跑飞;3.EEPROM相关寄存器因强磁场、高压静电等外部干扰出错所产生的写 入动作;4.系统有很大的感性负载,在断电的时候会产生一个反向高压,EEPROM有可能会自擦除。(还有什么原因,欢迎大家继续列举,以便完善及 想办法解决)针对问题1,程序问题不再该文讨论范围内。针对问题2,程序 跑飞,这个因该是引起EEPROM数据丢失的主要原因。但是引起程序跑飞的 原因却是多方面的。第一.电压不正常,工作不稳定,程序跑飞。针对这个问题,可以开启内部BOD、或者外加复位芯片解决,在低功耗场合,外部复位是有必 要的,毕竟BOD功耗太高。第二,晶体振荡受干扰,频率不稳定,程序跑飞。 针对这个问题,建议晶体使用全幅振荡,并且走线的时候尽量短,并且使用地 线隔离。第三系统受外界环境干扰,修改了PC等寄存器,程序跑飞。针对这 个干扰问题,这个引起程序跑飞的可能性应该不大,如果环境实在恶劣,那么 就应该想到做电磁屏蔽,ESD保护等,如果还不行,那么只能建议换换别的单 片机试试看了。针对问题3,我们只能优化电路设置,尽量避免,比如加屏蔽罩,加ESD保护,加TVS保护,电源加电容退耦等等。针对问题4,如果系统 真的具有很大的感性负载,那么请注意加续流二极管、滤波电容等做保护,不 要让这种反向高压产生,无论如何,这种因为感性负载突然断电自激产生的高压,不仅仅会对EEPROM有影响,而是对整个系统都存在威胁。 ============================================================= ================================================= 经过上面硬件上的一些处理,虽然EEPROM数据丢失的可能已经很小了,

相关主题
文本预览
相关文档 最新文档