问:我在AT90ICEPRO 中使用回溯 (Trace 功能选项感觉很困难好
象每次都不能启动回溯功能为什么?
答: 让我们假设你在地址0x20 处停止仿真如果你现在设置启动回溯功能的触发地址是同一个地
址即也是0x20 那么在程序重新到达0x20 之前的回溯功能是无效的原因是触发条件与断点信息
应该在指令之前装入AVR 核中所以尽管指令和触发条件在0x20 地址但对在这之前装入AVR
核中的指令没有任何效果如果你设置触发条件为一个程序还没有到达的地址应该不会有任何问
题
问: Mega103/603 微控制器的哪些引脚用于在线编程(ISP)?
答Mega103/603 微控制器用于在线编程界面的引脚如下列
SCK - SCK (PB1 pin 11)
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 引脚来允许使能
串行编程的
问:我不能使用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 程序
可以用来对代码检查和对仿真器自动升级
问:我使用了带A/D 转换器的AVR 单片机单片机工作非常好我
也喜欢AVR 的速度但我有一个问题当我改变A/D 转换器的输
入通道时好象A/D 转换器读取的数据仍然是上一个通道的如果
我第二次读我又得到正确的数值为什么会出现这件事?
答A/D 控制和状态寄存器ADCSR 中有两个位是用来检测A/D 转换的结束的
当一个新的转换启动时ADSC 启动转换控制位是用于测试的不管是否准备就绪前一次
的转换结果仍然被送入A/D 数据寄存器当读取A/D 数据寄存器时读到的自然仍是上一次的转
换结果
为了得到最近的转换结果应该测试A/D 中断标志位ADIF 或使能全局中断并且在中断服
务程序中读取
例子代码
ldi R161 选择通道
out ADMUX R16
sbi ADCSR adif 复位中断标识
sbi ADCSR adsc 开始A/D 转换
wait sbis ADCSR adif 等待直到ADIF 已经置位
rjmp wait
问:当将一个文件装入AVR STUDIO 时它始终使用我第一次使用
过的文件工作这是什么错误?
答AVD 文件包含了有关窗口设置和当前目标文件的信息有时由AVR STUDIO 创建的AVD
文件可能被破坏根据文件破坏部位的不同会出现不同的现象当运行AVR STUDIO 过程中出
现奇怪问题时首先应尝试删除位于存放源代码的文件夹中护展名为avd 的文件
问:在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 指针的
高位字节
问在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()进行
访问
问:我无法使MCU 在掉电模式时消耗的电流下降到数据簿中的值
我应该怎么做?
答当AVR 进入掉电模式时I/O 引脚的状态应该是不变化的如果你有一些未连接引脚是三态
输入并且没有上拉这些引脚的电平是浮动的并且很可能引起振荡从而导致额外的电流消耗
为解决这种问题应该激活所有未连接的输入引脚的上拉电阻这会使这些引脚具有一个明确
的逻辑电平在由于引脚振荡而产生这个问题的例子中在活动模式非休眠状态打开未使用引
脚的上拉是一个好方法
其次你再查看一下连接到输出引脚的接线任何输出引脚上的负载都会在掉电模式时消耗额
外的电流
问:我观察到我现有的微控制器在上电过程中I/O 端口是活动的在
我的应用中有一个问题系统一旦设定I/O 引脚中的一个为高电平
MCU 可以关闭电源而即使用一个电阻把该引脚电平拉低在上
电过程中它有时仍然出现高电平因此当电源打开时系统立刻关
闭在使用者看来系统不能工作如果我换成AVR 我猜想会有一
些同样的问题?
答大多数微控制器是同步复位比如在RESET 尚未完全完成时MCU 需要一定数量的有效时钟
在上电过程中当VCC 上升到启动晶体振荡器的数值之前上电复位是有效的但不能影响I/O
引脚的数值而且I/O 引脚是处于随机状态AVR 的I/O 端口与复位是异步的而且保证在整个上
电过程中是处于三态换成AVR 单片机将可以解决你的问题
问:怎样处理AVR 微控制器的NC 引脚空引脚?
答不要将任何线路连接到NC 引脚NC 引脚是为将来的需用而保留的
问:在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
问:我正在编写一个很大的汇编程序当我往程序中加入新的行时
文件末尾的字符好象消失了我怎样才能防止这种现象?
答: 汇编器的编辑器有30K 字节的文件尺寸限制如果要克服这个限制文件必须被分成几个模
块并用“.include”链接还有一种方法使用其它编辑器如NotePad UltraEdit 程序等和命令
行方式工作的汇编器(DOS 版本)
问:AT90S8515 有8KB 的程序存储器由于RJMP 和RCALL 指令
只能在2K 的相对范围内跳转而这个部件的指令集没有JMP 或
CALL 指令我怎样做才能跳转到全部的程序存储器中
答程序存储器是组织成4Kx16 的形式的所以只有4K 的程序存储器地址空间在汇编器中选择
“Options >> Wrap Relative Jumps”选项这时将允许你跳过程序存储器的边界例如如果你从$FFE
至$00A 做一个相对跳转程序计数器将被增加12 并且隐藏了程序存储器的边界这个功能只能
用在8K 的单片机4K 的单片机不需要隐藏边界16K 的单片机需要使用JUMP 和CALL 指令.
问:当我使用UART 时定时/计数器的任意一个是否都可用于产生
波特率?
答不对有一个专用的定时器被UART 用来产生波特率所有定时/计数器只可以用作普通用途
问:怎样才能从外部将AT90S1200 从掉电模式下唤醒?
答要从掉电模式唤醒AT90S1200 你必须使能外部INT0 中断并且是低电平触发中断当你以掉
电模式进入休眠状态时如果INT0 引脚上低电平的保持时间大于16384 个内部RC 振荡周期时
AT90S1200 将被唤醒内部RC 振荡器是用于延时MCU 的启动直到XTAL 振荡器工作稳定参
考AT90S1200 数据簿RC 振荡器的频率是受VCC 电压影响的
问:当我使用SBI 和CBI 指令来设置或清除I/O 端口的一个信号位
时是否会影响同一端口的其它位?
答不会不像多数单片机那样在AVR 单片机中允许你100%安全地操作I/O 端口的信号位这
也适用于整个端口的操作有疑问可参考每个I/O 端口的三个地址
问:为什么每个I/O 端口有三个地址?
答为使你能建立100%安全的系统AVR 支持真正的读-修改-写I/O 端口如果你希望读取I/O
引脚的物理电平读PIN 寄存器当你希望改变输出时读PORT 锁存能确保正确的数据写回到
端口保证全部输出这种方式始终能给出你所希望的结果而不依赖于引脚的物理电平这个特点使
你省去了为建立一个安全的系统而拷贝你的端口数据进入存贮器的所有工作这个工作使用了许多
指令当你使用SBI 和CBI 指令来设置/清除I/O 端口的信号位时必须始终使用PORT 的地址
问:为什么SBI 和CBI 指令只能对$00 -$1F的I/O 寄存器进行操作?
答所有AVR 指令中除少数外都为两个字节长度这也意味着只有65,536(64K)种可能的组合来
安排指令集当我们指定AVR 指令集时采取一些折衷的办法是为了尽可能充分地利用这64K 种
组合不像CISC 微控制器指令可以是一个两个三个或更多个字节在AVR 结构上我们不能
实现全部指令都象这样作为例子在一个立即寻址而且包含全部32 个寄存器地址的指令中常
数需要8 位而寄存器地址需要另外的5 位这种指令将占用全部指令组合空间中的8K 换句话讲
我们只能安排八个这样的指令而没有更多的指令能够实现如果做一个17 位长度的指令是不
经济和不方便的方案不会被考虑
在设计AVR 指令集的过程中设置我们听取了许多建义我们请教了C 编译器专家他们在如
何调整指令集来适应C 编译器方面提出了许多意见作为例子编译器专家建议我们为SBCI 带
进位的立即数减法牺牲ADDI 指令
对那些缺少的指令操作也是方便的AVR 的代码效率应该能证明我们已经找到一种在实现
的指令和省略的指令之间进行折衷的好办法
问:为什么立即寻址指令在寄存器R0-R15 中不能工作?
答所有AVR 指令中除少数外都为两个字节长度这也意味着只有65,536(64K)种可能的组合来
安排指令集当我们指定AVR 指令集时采取一些折衷的办法是为了尽可能充分地利用这64K 种
组合不像CISC 微控制器指令可以是一个两个三个或更多个字节在AVR 结构上我们不能
实现全部指令都象这样作为例子在一个立即寻址而且包含全部32 个寄存器地址的指令中常
数需要8 位而寄存器地址需要另外的5 位这种指令将占用全部指令组合空间中的8K 换句话讲
我们只能安排八个这样的指令而没有更多的指令能够实现而做一个17 位长度的指令是不经
济和不方便的方案不会被考虑
在设计AVR 指令集的过程中设置我们听取了许多建义我们请教了C 编译器专家他们在如
何调整指令集来适应C 编译器方面提出了许多意见作为例子编译器专家建议我们为SBCI 带
进位的立即数减法牺牲ADDI 指令
对那些缺少的指令操作也是方便的AVR 的代码效率应该能证明我们已经找到一种在实现
的指令和省略的指令之间进行折衷的好办法