您的位置:控制工程论坛网论坛 » 教程与手册 » AVR单片机问答(3)

常青树

常青树   |   当前状态:在线

总积分:1421  2025年可用积分:0

注册时间: 2008-09-28

最后登录时间: 2012-05-30

空间 发短消息加为好友

AVR单片机问答(3)

常青树  发表于 2008/10/20 18:58:34      712 查看 0 回复  [上一主题]  [下一主题]

手机阅读


问:为什么没有EORI 指令?
答所有AVR 指令中除少数外都为两个字节长度这也意味着只有65,536(64K)种可能的组合来
安排指令集当我们指定AVR 指令集时采取一些折衷的办法是为了尽可能充分地利用这64K 种
组合不像CISC 微控制器指令可以是一个两个三个或更多个字节在AVR 结构上我们不能
实现全部指令都象这样作为例子在一个立即寻址而且包含全部32 个寄存器地址的指令中常
数需要8 位而寄存器地址需要另外的5 位这种指令将占用全部指令组合空间中的8K 换句话讲
我们只能安排八个这样的指令而没有更多的指令能够实现而做一个17 位长度的指令是不经
济和不方便的方案不会被考虑
在设计AVR 指令集的过程中设置我们听取了许多建义我们请教了C 编译器专家他们在如
何调整指令集来适应C 编译器方面提出了许多意见作为例子编译器专家建议我们为SBCI 带
进位的立即数减法牺牲ADDI 指令
对那些缺少的指令操作也是方便的AVR 的代码效率应该能证明我们已经找到一种在实现
的指令和省略的指令之间进行折衷的好办法
问:我用"sbr r30,3"指令在寄存器30 中设置D3 位好象对D3 位不
起作用但D0 位与D1 位可以被设置我的做法在哪里有错误?
答“SBR” 可以用来在一个寄存器中同时设置多位(象“CBR”可以用来同时清除寄存器中的多位)
指令的第二个参数不是指定位号而是用来与寄存器中的数作逻辑或运算在这个例子中$03 与
R30 的内容相或所以导致最低的两位置位为了只设置D3 位应尝试下列方法的一种
sbr r30 $08
sbr r30 0b00001000
sbr r30 (1<<3)
上面三行都会产生同样的结果你可以选择一个你最习惯的用法
问:在我的多任务系统中除了中断标志以外我还需要定义可以设置
和清除的标志我应该怎样做?
答每个标志使用一个寄存器为了设置标志用
ldi flag 01
或者如果你想使用低位的寄存器(R0-R15) 在复位后先清除它然后用
inc flag
来设置标志
当检查和清除标志时这样做
lsr flag 移动标志到进位标志位 (标志清除)
brne flag_was_set 如果标志被设置就跳转
象在你所有的中断例程中一样在退出之前要恢复状态寄存器这种方式十分安全
问:在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”
问:在没有ADDI 指令的情况下怎样将一个常数立即数和寄
存器的内容相加?
答一个较简单的方法是减去一个负数下面的代码是将寄存器R20 中和5 的相加的例子
subi r20 -5
注意无论如何在这种情况下进位标志位不能用于检测溢出如果你已经将常数放入另一个
寄存器你可以使用通用的ADD 指令如果常量是1 你能使用INC 指令来增加寄存器的值
16 位的加法是同样的下列代码是将r17 r16 和$0b3c 相加的例子
subi r16 low(-$0b3c) 减去低位字节
sbci r17 high(-$0b3c) 减去高位字节
问:为实现指令的单周期运行是否对外部时钟倍频?
答没有这个时钟是MCU 真正使用的没有使用时钟分频或倍频电路
问: AVR 的一个指令周期使用了多少个时钟周期?
答只有一个时钟周期例如在寄存器中加入两个数全部执行时间等于在XTAL1 引脚上的时钟
信号正半周加负半周的时间
问:为什么AT90S8515 称8K 的MCU?
答大多数CISC 微控制器的指令是变长度的一些指令由单字节组成其它的指令也可以是四个
字节长度大多数AVR 指令是两个字节长度只有很少也是四个字节所以CPU 在启动运行时
不能每次只读取和解释一个字节而我们的代码尺寸基准始终是和字节相比较的因此在80C51
上填满8K 的一个C 程序肯定也适合的8K 的AVR
问:我从哪里能找到数据簿?
答你可以从网站www.atmel.com有选择地下载它们你也可从当地分销商和ATMEL 办事处得到
数据簿你还可以发电子邮件到literature@atmel.com索取
问:AVR 有哪些超过我现有MCU 的附加性能?
答十分紧凑的代码, 特别是对C 程序
4-10 倍的高速度
可编程FLASH 存储器可在系统编程
芯片内含EEPROM 存贮器可在系统编程
低功耗

1楼 0 0 回复