您的位置 首页 硬件

根据AVR单片机的常见问题解答

基于AVR单片机的常见问题解答-所有的C 编译器均已在ATMEL 网站上有关第三方工具供应商的网页上列出;ATMEL 公司在它的网站:http://www.atmel.com 上还提供了许多自由软件它们可用于对AVR 单片机 的程序进行汇编和模拟这些软件可以自由下载,上述产品也可通过ATMEL 授权的地区分销商和销售代理获得。

问:我想运用AVR单片机中的Mega 系列,有哪些开发东西支撑这种单片机?

答AVR 单片机 中的Mega 系列有一套完善的开发东西评价/编程板,

ATMEL 的STK500(980 元/套)起步东西包是适用于开发Atmega103 芯片的对芯片的编程是经过在体系编程(ISP)接口完结的

仿真器

ATMEL 的ATICE30 可适用于实时仿真

C 编译器:

一切的C 编译器均已在ATMEL 网站上有关第三方东西供货商的网页上列出;ATMEL 公司在它的网站:http://www.atmel.com 上还供给了许多自在软件它们可用于对AVR 单片机 的程序进行汇编和模仿这些软件能够自在下载,上述产品也可经过ATMEL 授权的区域分销商和出售署理取得。

问:有哪些支撑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 单片机

问: 即便看门狗没有运用我也有时在AVR Studio 调试软件的状况栏中看到“WDT reset” WDT 复位的信息这是为什么?答当方针器材运转在较高的频率大于6 MHz)时来自扁平电缆FPC 电缆的噪声信号或许过错地触发WDT 复位检测电路这对程序的仿真和履行没有影响它们不会因为噪声的原因而发生复位噪声只是影响AVR Studio 调试软件的信息处理在这种状况下不要答理这个信息当方针器材运转在较低的频率小于或等于4 MHZ 时应该不会呈现这个问题

问: 我刚买了一台ICE 200 仿真器在运用不同的芯片和不同的时刻运转确诊程序时都是失利的而其它一切正常这是什么原因?

答在ICE200 仿真器的第一批产品中是一个固件监控程序的问题而导致这个现象这个现象能够经过晋级新版别的监控程序来修合理运用2.02 版或更高版别的AVR Studio 软件时AVRStudio 将读取固件版别并查看这个问题假如你的ICE200 需求晋级它会引导你完结晋级处理这个查看作业只要在装载运用程序时才干被履行而当运转确诊程序时是不被发动的假如你首要测验运转确诊程序确诊仿真器确诊程序不会查看固件版别并且或许确诊失利假如你可巧有这种状况不要答理确诊失利而直接去装载运用程序这时你将能够晋级ICE200 的监控程序在晋级后再回过来运转确诊程序确诊成果应该悉数是正确了(注现在出售的ICE200 已没有这个问题了)

问:怎么查看我的AVR 仿真器的版别号?

答在仿真器被衔接的时分翻开AVR Studio 程序挑选菜单中Help-》About-》Info 来取得你的仿真器的有关信息AT90ICEPRO 在1.20 之前的版别和ATmegaICE 在1.11 之前的版别是不能被AVR Studio 软件检测到的较新的版别现已有了并且能够从Atmel 网站自在下载。

问:程序在仿真器或 单片机 中不作业,而在模仿器中看来作业很正常这是什么原因?

答这是仓库指针设置中的常见问题对一切带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 编译器的链接文件”

问:从哪里我能找到完好的AVR 指令集?

答指令集在Atmel 的网站的Products-》AVR 8 bit RISC-》Datasheets 下面的网页上或许直接衔接http://www. atmel.com/atmel/products/prod200.htm网页; 《》附录

3 AVR 指令速查表

问:当开端做一个运用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 的程序存贮器是组织成字16 bit 的办法而LPM 指令是读取字节8bit LPM 指令能够读16 位字的高位字节或低位字节中的恣意一个因为这个原因有必要将16 位的程序存贮器地址分解成两个指向你所期望装入的字节的地址

问:我在AT90ICEPRO 中运用回溯(Trace 功用选项感觉很困难好象每次都不能发动回溯功用为什么?

答: 让咱们假定你在地址0x20 处中止仿真假如你现在设置发动回溯功用的触发地址是同一个地址即也是0x20 那么在程序从头抵达0x20 之前的回溯功用是无效的原因是触发条件与断点信息应该在指令之前装入AVR 核中所以虽然指令和触发条件在0x20 地址但对在这之前装入AVR核中的指令没有任何作用假如你设置触发条件为一个程序还没有抵达的地址应该不会有任何问题

问: 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 引脚来答应使能串行编程的

问:我不能运用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 转化器读取的数据依然是上一个通道的,假如我第2次读我又得到正确的数值为什么会呈现这件事?

答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

问:当将一个文件装入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 的代码功率应该能证明咱们现已找到一种在完成的指令和省掉的指令之间进行折衷的好办法

问:为什么没有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 存贮器可在体系编程低功耗

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qianrushi/yingjian/347303.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部