搜索
bottom↓
回复: 11

顺带整理了一些AVR-FAQ分享一下

[复制链接]

出0入0汤圆

发表于 2019-5-30 08:40:41 | 显示全部楼层 |阅读模式
1、 AVR 的一个指令周期使用了多少个时钟周期?
答:只有一个时钟周期例如在寄存器中加入两个数全部执行时间等于在XTAL1 引脚上的时钟信号正半周加负半周的时间。

2、怎样处理AVR微控制器的NC引脚空引脚?
答:不要将任何线路连接到NC 引脚NC引脚是为将来的需用而保留的。

3、即使看门狗没有使用我也有时在AVR Studio调试软件的状态栏中看到“WDT reset”WDT复位的信息这是为什么?
答:当目标器件运行在较高的频率大于6 MHz)时来自扁平电缆FPC电缆的噪声信号可能错误地触发WDT复位检测电路这对程序的仿真和执行没有影响它们不会由于噪声的原因而产生复位噪声仅仅影响AVR Studio调试软件的信息处理在这种情况下不要理睬这个信息当目标器件运行在较低的频率小于或等于4 MHZ时应该不会出现这个问题。

4、我刚买了一台ICE 200仿真器在使用不同的芯片和不同的时间运行诊断程序时都是失败的而其它一切正常这是什么原因?
答:在ICE200仿真器的第一批产品中是一个固件监控程序的问题而导致这个现象可以通过升级新版本的监控程序来修正当使用2.02版或更高版本的AVR Studio软件时AVRStudio 将读取固件版本并检查这个问题如果你的ICE200需要升级它会引导你完成升级处理这个检查工作只有在装载应用程序时才能被执行而当运行诊断程序时是不被启动的如果你首先尝试运行诊断程序诊断仿真器诊断程序不会检查固件版本并且可能诊断失败如果你碰巧有这种情况不要理睬诊断失败而直接去装载应用程序这时你将可以升级ICE200的监控程序在升级后再回过来运行诊断程序诊断结果应该全部是正确了。(注:现在销售的ICE200已没有这个问题了)

5、如何检查我的AVR 仿真器的版本号?
答:在仿真器被连接的时候打开AVR Studio 程序选择菜单中Help-》About-》Info 来获得你的仿真器的有关信息AT90ICEPRO 在1.20 之前的版本和ATmegaICE 在1.11 之前的版本是不能被AVR Studio 软件检测到的较新的版本已经有了而且可以从Atmel 网站自由下载。

6、程序在仿真器或单片机中不工作,而在模拟器中看来工作很正常这是什么原因?
答:这是堆栈指针设置中的常见问题对所有带SRAM的AVR单片机堆栈指针必须设置在SRAM最后的地址
在汇编程序中这样做是正确的
ldi R16 low(RAMEND) 装载堆栈指针的低字节到R16
out SPL R16 输出这个数值到堆栈指针寄存器
ldi R16 high(RAMEND) 装载堆栈指针的高字节到R16
out SPH R16 如果AVR 的SRAM 小于256 字节就将这行注释掉
在C 程序中堆栈指针是在启动代码中自动设置的注意链接文件(XCL 文件)定义了堆栈指针的位置请参考应用笔记AVR032 ---- C 编译器的链接文件。

7、从哪里我能找到完整的AVR 指令集?
答:指令集在Atmel的网站的Products-》AVR 8 bit RISC-》Datasheets下面的网页上或者直接连接http://www. atmel.com/atmel/products/prod200.htm网页;《》附录3 AVR指令速查表。

8、当开始做一个使用AVR 单片机 的新项目时最常见最共同问题有哪些?
答:最常见最共同的错误是忘记对不带硬件堆栈的芯片设置堆栈指针对AT90S8515 单片机 上这样做是妥当的
LDI R16 low(RAMEND)
OUT SPL R16
LDI R16 high(RAMEND)
OUT SPH R16
注:在ATMEL 的汇编语言源程序中经常将R16 寄存器用temp 符号来代替
另一个常见的错误是将端口作为输出使用时忘记设置端口在AVR 单片机中设置端口作为输出使用是通过写一个1 到数据方向寄存器(DDR)中完成的比如设置端口PORTB输出高电平。
LDI R16 0xFF 装载十六进制数FF 到寄存器R16
OUT DDRB R16 设置端口PORTB作为输出使用
OUT PORTB R16 设置端口PORTB输出高电平
使用AVR 汇编器时第三个常见的错误是在使用装载程序存储器(LPM)指令时指向了程序存贮器中错误的地址AVR的程序存贮器是组织成字16bit的形式而LPM指令是读取字节8bit LPM指令可以读16位字的高位字节或低位字节中的任意一个因为这个原因必须将16 位的程序存贮器地址分解成两个指向你所希望装入的字节的地址。


9、我在AT90ICEPRO 中使用回溯(Trace功能选项感觉很困难好象每次都不能启动回溯功能为什么?
答:让我们假设你在地址0x20处停止仿真如果你现在设置启动回溯功能的触发地址是同一个地址即也是0x20那么在程序重新到达0x20之前的回溯功能是无效的原因是触发条件与断点信息应该在指令之前装入AVR核中所以尽管指令和触发条件在0x20地址但对在这之前装入AVR核中的指令没有任何效果如果你设置触发条件为一个程序还没有到达的地址应该不会有任何问题。

10、Mega103/603 微控制器的哪些引脚用于在线编程(ISP)?
答:Mega103/603微控制器用于在线编程界面的引脚如下列
SCK- SCK (PB1PIN11)
MISO - PDO (PE1 pin 3)
MOSI - PDI (PE0 pin 2)
RESET- RESET (RESET pin 20)
PEN(编程使能)引脚和RESET引脚可以选择其中一个使用这两个引脚有同样的功能它们都激活内部iRESET 信号)但PEN 引脚只有在上电时(VCC大约1.2V)被读取如果PEN引脚不使用推荐将此引脚接VCC所有其它型号的AVR单片机 都是使用RESET引脚来允许使能串行编程的。

11、我不能使用AVR仿真器正确地驱动外部负载当我使用电压表来测量仿真器POD上的引脚时好象引脚不能驱动负载这是什么错误?
答:这是1.21版的ICEPRPO和1.10版的MegaICE存在的问题,可用于仿真器升级的新版本软件可以从http://www.atmel.com网站的products-》AVR 8bit RISC-》SOFtware 网页中下载
为升级ICEPRPO的版本到1.22版请下载UPGRD122.ZIP文件
为升级MegaICE的版本到1.11版请下载M111UPGR.ZIP文件
这些文件是压缩文件它包括了一个适用于仿真器的新的程序文件和一个PC 程序PC 程序可以用来对代码检查和对仿真器自动升级。

12、我使用了带A/D转换器的AVR 单片机 单片机工作非常好我也喜欢AVR 的速度但我有一个问题当我改变A/D 转换器的输入通道时好象A/D 转换器读取的数据仍然是上一个通道的,如果我第二次读我又得到正确的数值为什么会出现这件事?

答:A/D控制和状态寄存器ADCSR中有两个位是用来检测A/D转换的结束的当一个新的转换启动时ADSC启动转换控制位是用于测试的不管是否准备就绪前一次的转换结果仍然被送入A/D 数据寄存器当读取A/D 数据寄存器时读到的自然仍是上一次的转换结果,为了得到最近的转换结果应该测试A/D 中断标志位ADIF 或使能全局中断并且在中断服务程序中读取。
例子代码
ldi R16 1 选择通道
out ADMUX R16
sbi ADCSR adif 复位中断标识
sbi ADCSR adsc 开始A/D 转换
wait sbis ADCSR adif 等待直到ADIF 已经置位
rjmp wait

13、当将一个文件装入AVR STUDIO时它始终使用我第一次使用过的文件工作这是什么错误?
答:AVD文件包含了有关窗口设置和当前目标文件的信息有时由AVR STUDIO创建的AVD文件可能被破坏根据文件破坏部位的不同会出现不同的现象当运行AVR STUDIO过程中出现奇怪问题时首先应尝试删除位于存放源代码的文件夹中护展名为avd的文件。

14、在AVR系列中如AT90S2313单片机 全部数据存储器不超过256字节而且它不能访问外部存储器能否忽略X Y和Z指针的高位字节而仅使用指针的低位字节来访问可以使用的存储器?
答:在全部数据存储器寄存器I/O寄存器和SRAM少于256字节的AVR单片机中当使用LD/ST指令访问数据存储器时CPU将忽略指针的高位字节这时允许每个指针的高位字节(R27、R29 和R31)用于普通的储存用途自增和预减指令(如LD -Z Rd)不会影响高位字节注意当使用Z指针访问FLASH程序存储器和使用ADIW/SBIW指令时将影响使用的Z指针的高位字节。

15、在IAR C编译器中怎样才能访问AVR内部的EEPROM数据存储器。
答:AVR内部的EEPROM是AVR微控制器I/O存贮器的一部分以I/O接口形式访问不能使用普通变量进行访问IAR 在标准库例程“ina90.h”中定义了特殊的宏来读写EEPROM
读写EEPROM 的宏有下列原形
_EEGET(VAR ADR) /* 从EERPOM 的地址ADR 读取数值*/
_EEPUT(ADR VAL) /* 写VAL 到EERPOM 的地址ADR *
IAR C 编译器不支持将常量定义到EEPROM 中不能生成EEPROM 的初始化数据文件
用AVR 汇编器来做这件事是很容易的先写一些定义EEPROM 中常量的代码
.ESEG
.org 0x50
datatable: .db $01,$02,$03,$04,$05
dtableend: .db $00
当这段代码被汇编后它产生一个.EEP 文件这个文件可以被下载到微控制器MCU 或仿真器中这个.org 声明给出数据的地址这个变量在C编译器中可以用_EEGET()和_EEPUT()进行访问。

16、有哪些支持AVR 的起步工具包。
答:STK100,SL-AVR,SL-OKAVR,SL-AVRL 支持AVR 的Tiny 系列 单片机
STK200,SL-AVR,SL-OKAVR,SL-AVRL 支持AVR 单片机 即AT90S 系列
STK300,SL-AVR,SL-OKAVR,SL-AVRL 还支持AVR 的Mega103 单片机
STK500,SL-AVR,SL-OKAVR,SL-AVRL 还支持AVR 的Mega103 单片机
所有的起步工具包都包括按钮LED指示灯RS232通信接口I/O口通过分布在PCB板边沿的连接插头可以使用STK200/300起步工具包还有一条在线编程ISP电缆它可用以对AVR芯片编程STK300还提供了AVR应用程序生成器可用来生成外围设备的初始化代码。

17、我无法使MCU 在掉电模式时消耗的电流下降到数据簿中的值我应该怎么做?
答:当AVR 进入掉电模式时I/O引脚的状态应该是不变化的如果你有一些未连接引脚是三态输入并且没有上拉这些引脚的电平是浮动的并且很可能引起振荡从而导致额外的电流消耗为解决这种问题应该激活所有未连接的输入引脚的上拉电阻这会使这些引脚具有一个明确的逻辑电平在由于引脚振荡而产生这个问题的例子中在活动模式非休眠状态打开未使用引脚的上拉是一个好方法,其次你再查看一下连接到输出引脚的接线任何输出引脚上的负载都会在掉电模式时消耗额外的电流。

18、我观察到我现有的微控制器在上电过程中I/O端口是活动的在我的应用中有一个问题系统一旦设定I/O引脚中的一个为高电平MCU可以关闭电源而即使用一个电阻把该引脚电平拉低在上电过程中它有时仍然出现高电平因此当电源打开时系统立刻关闭在使用者看来系统不能工作如果我换成AVR我猜想会有一些同样的问题?
答:大多数微控制器是同步复位比如在RESET尚未完全完成时MCU需要一定数量的有效时钟在上电过程中当VCC上升到启动晶体振荡器的数值之前上电复位是有效的但不能影响I/O引脚的数值而且I/O引脚是处于随机状态AVR的I/O端口与复位是异步的而且保证在整个上电过程中是处于三态换成AVR单片机将可以解决你的问题。

20、在AVR 汇编器中怎样定义字符串常量
答:字符串可以作为常量定义在FLASH存储器或EEPROM数据存储器中
例如在FLASH中定义一个字符串常量
.CSEG
fstring .db “This is a string in flash” 0x00
在EEPROM 中规定一串常量:
.ESEG
eestring .db “This is a string in EEPROM” 0x00

21、我正在编写一个很大的汇编程序当我往程序中加入新的行时文件末尾的字符好象消失了我怎样才能防止这种现象?
答: 汇编器的编辑器有30K字节的文件尺寸限制如果要克服这个限制文件必须被分成几个模块并用“.include”链接还有一种方法使用其它编辑器如NotePad UltraEdit 程序等和命令行方式工作的汇编器(DOS 版本)

22、AT90S8515 有8KB 的程序存储器由于RJMP 和RCALL 指令只能在2K 的相对范围内跳转而这个部件的指令集没有JMP 或CALL 指令我怎样做才能跳转到全部的程序存储器中。
答:程序存储器是组织成4Kx16的形式的所以只有4K的程序存储器地址空间在汇编器中选择“Options 》》 Wrap Relative Jumps”选项这时将允许你跳过程序存储器的边界例如如果你从$FFE至$00A做一个相对跳转程序计数器将被增加12并且隐藏了程序存储器的边界这个功能只能用在8K的 单片机 4K 的单片机不需要隐藏边界16K的单片机需要使用JUMP 和CALL指令。

23、当我使用UART时定时/计数器的任意一个是否都可用于产生波特率?
答:不对有一个专用的定时器被UART用来产生波特率所有定时/计数器只可以用作普通用途。



24、怎样才能从外部将AT90S1200 从掉电模式下唤醒?
答:要从掉电模式唤醒AT90S1200你必须使能外部INT0中断并且是低电平触发中断当你以掉电模式进入休眠状态时如果INT0 引脚上低电平的保持时间大于16384个内部RC振荡周期时AT90S1200将被唤醒内部RC振荡器是用于延时MCU的启动直到XTAL振荡器工作稳定参考AT90S1200数据簿RC振荡器的频率是受VCC电压影响的。

25、当我使用SBI 和CBI 指令来设置或清除I/O 端口的一个信号位时是否会影响同一端口的其它位?
答:不会不像多数单片机那样在AVR单片机中允许你100%安全地操作I/O端口的信号位这也适用于整个端口的操作有疑问可参考每个I/O端口的三个地址。

26、为什么每个I/O 端口有三个地址?
答:为使你能建100%安全的系统AVR支持真正的读-修改-写I/O端口如果你希望读取I/O引脚的物理电平读PI寄存器当你希望改变输出时读PORT锁存能确保正确的数据写回到端口保证全部输出这种方式始终能给出你所希望的结果而不依赖于引脚的物理电平这个特点使你省去了为建立一个安全的系统而拷贝你的端口数据进入存贮器的所有工作这个工作使用了许多指令当你使用SBI和CBI指令来设置/清除I/O端口的信号位时必须始终使用PORT的地址。

27、AVR 有哪些超过我现有MCU 的附加性能?
答:十分紧凑的代码,特别是对C程序4-10倍的高速度可编程FLASH存储器可在系统编程芯片内含EEPROM存贮器可在系统编程低功耗。

28、我从哪里能找到数据簿?
答:你可以从网站www.atmel.com有选择地下载它们你也可从当地分销商和ATMEL 办事处得到数据簿你还可以发电子邮件到literature@atmel.com索取。

29、为什么AT90S8515 称8K 的MCU?
答:大多数CISC微控制器的指令是变长度的一些指令由单字节组成其它的指令也可以是四个字节长度大多数AVR指令是两个字节长度只有很少也是四个字节所以CPU在启动运行时不能每次只读取和解释一个字节而我们的代码尺寸基准始终是和字节相比较的因此在80C5上填满8K的一个C程序肯定也适合的8K的AVR。


30、我用“sbr r30,3”指令在寄存器30 中设置D3 位好象对D3 位不起作用但D0 位与D1 位可以被设置我的做法在哪里有错误?
答:“SBR” 可以用来在一个寄存器中同时设置多位(像“CBR”可以用来同时清除寄存器中的多位)指令的第二个参数不是指定位号而是用来与寄存器中的数作逻辑或运算在这个例子中$03与R30的内容相或,所以导致最低的两位置位为了只设置D3位应尝试下列方法的一种
sbr r30 $08
sbr r30 0b00001000
sbr r30 (1《《3)
上面三行都会产生同样的结果你可以选择一个你最习惯的用法。

31、在我的多任务系统中除了中断标志以外我还需要定义可以设置和清除的标志我应该怎样做?
答:每个标志使用一个寄存器为了设置标志用:ldi flag 01
或者如果你想使用低位的寄存器(R0-R15)在复位后先清除它然后用:inc flag来设置标志
当检查和清除标志时这样做lsr flag移动标志到进位标志位(标志清除)brne flag_was_set 如果标志被设置就跳转,像在你所有的中断例程中一样在退出之前要恢复状态寄存器这种方式十分安全。
32、在AT90S1200 中如何实现常数表功能?
答:由于AT90S1200没有LPM指令比较有效的方法是将一个较小的常数表放置在EEPROM 中你可以使用EEPROM地址寄存器和EEPROM数据寄存器有效地直接访问常数表如
.ESEG 定义EEPROM 段
.db my_var00=$45
.db my_var01=$4c
.db my_var02=$5f
.CSEG 定义通用代码段
如果你的表不适合于放置在EEPROM中你可以像下面这样放置在FLASH中
.def tp =r16 表指针表索引
.def output=r17 输出表的中常数
table
ldi output,$45
cpi tp,01
breq end
ldi output,$4c
cpi tp,02
breq end
ldi output,$5f
cpi tp,03
breq end
end
ret
为了访问表中的2 号元素可以这样做
ldi tp 2
rcall table
当从表格子程序返回时“output”将包括“$4c”

33、在没有ADDI 指令的情况下怎样将一个常数立即数和寄存器的内容相加?
答:一个较简单的方法是减去一个负数下面的代码是将寄存器R20 中和5 的相加的例子
subi r20 -5
注意无论如何在这种情况下进位标志位不能用于检测溢出如果你已经将常数放入另一个寄存器你可以使用通用的ADD指令如果常量是1你能使用INC指令来增加寄存器的值16位的加法是同样的下列代码是将r17 r16 和$0b3c 相加的例子
subi r16 low(-$0b3c) 减去低位字节
sbci r17 high(-$0b3c) 减去高位字节

34、我想使用AVR单片机中的Mega 系列,有哪些开发工具支持这种单片机?
答:AVR单片机中的Mega系列有一套完善的开发工具评估/编程板,
ATMEL 的STK500(980 元/套)起步工具包是适用于开发Atmega103 芯片的对芯片的编程是通过在系统编程(ISP)接口完成的。
仿真器:
ATMEL 的ATICE30可适用于实时仿真
C 编译器:
所有的C 编译器均已在ATMEL网站上有关第三方工具供应商的网页上列出;ATMEL公司在它的网站:http://www.atmel.com 上还提供了许多自由软件它们可用于对AVR单片机的程序进行汇编和模拟这些软件可以自由下载,上述产品也可通过ATMEL 授权的地区分销商和销售代理获得。


35、为实现指令的单周期运行是否对外部时钟倍频?
答:没有这个时钟是MCU真正使用的没有使用时钟分频或倍频电路。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2019-5-30 08:54:53 | 显示全部楼层
现在AVR还热?

出0入0汤圆

 楼主| 发表于 2019-5-30 09:00:08 | 显示全部楼层

哈~学习一下,不建议入坑吗?

出0入0汤圆

发表于 2019-5-30 09:19:19 | 显示全部楼层
我还以为是挖坟的帖子,自从那次MEGA8涨到了10元就再也没用过了,

出0入0汤圆

发表于 2019-5-30 09:29:27 | 显示全部楼层
我也以为是挖坟的不用AVR好多年了,家里还能翻出自制的AVR仿真器

出0入0汤圆

 楼主| 发表于 2019-5-30 09:42:26 | 显示全部楼层
yangsen 发表于 2019-5-30 09:29
我也以为是挖坟的不用AVR好多年了,家里还能翻出自制的AVR仿真器

AVR32 的仿真器?刚看到一个发帖求仿真器的,2333~

出0入50汤圆

发表于 2019-5-30 10:18:55 | 显示全部楼层
jackiezeng 发表于 2019-5-30 09:19
我还以为是挖坟的帖子,自从那次MEGA8涨到了10元就再也没用过了,

哈,我也是,珍惜荷包,远离 @妹儿

出0入0汤圆

发表于 2019-5-30 11:21:29 | 显示全部楼层
AVR是不错,不过被ATMEL搞坏了,如果把内核开放给STC做,那估计会很爽。

出0入0汤圆

发表于 2019-5-30 11:53:41 来自手机 | 显示全部楼层
AVR是个好内核,就是太贵

出0入442汤圆

发表于 2019-5-30 12:19:42 来自手机 | 显示全部楼层
blade_li 发表于 2019-5-30 11:21
AVR是不错,不过被ATMEL搞坏了,如果把内核开放给STC做,那估计会很爽。

avr gcc代码量较大,开中断之后,貌似会出现一些奇怪的bug,于是我在转riscv时弃用了。也可能是我写的核有bug。

出200入2554汤圆

发表于 2019-5-30 14:19:28 | 显示全部楼层
在低端应用(简单逻辑+低功耗+少引脚)还是很好的,例如 ATTINY13,可以一节纽扣电池休眠几年没问题

高端性能都被 ARM 占领了,用 AVR 来挣扎意义不大。例如带个 128*128 的 TFT 液晶,AVR 会让你生不如死

出0入0汤圆

 楼主| 发表于 2019-5-30 14:30:49 | 显示全部楼层
t3486784401 发表于 2019-5-30 14:19
在低端应用(简单逻辑+低功耗+少引脚)还是很好的,例如 ATTINY13,可以一节纽扣电池休眠几年没问题

高端 ...

难怪这个版块,很少有人发帖。价格贵,应用的范围也有局限
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 07:39

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表