問(wèn):我想使用AVR單片機(jī)中的Mega 系列,有哪些開(kāi)發(fā)工具支持這種單片機(jī)?
答AVR 單片機(jī) 中的Mega 系列有一套完善的開(kāi)發(fā)工具評(píng)估/編程板,
ATMEL 的STK500(980 元/套)起步工具包是適用于開(kāi)發(fā)Atmega103 芯片的對(duì)芯片的編程是通過(guò)在系統(tǒng)編程(ISP)接口完成的
ATMEL 的ATICE30 可適用于實(shí)時(shí)仿真
C 編譯器:
所有的C 編譯器均已在ATMEL 網(wǎng)站上有關(guān)第三方工具供應(yīng)商的網(wǎng)頁(yè)上列出;ATMEL 公司在它的網(wǎng)站:http://www.atmel.com 上還提供了許多自由軟件它們可用于對(duì)AVR 單片機(jī) 的程序進(jìn)行匯編和模擬這些軟件可以自由下載,上述產(chǎn)品也可通過(guò)ATMEL 授權(quán)的地區(qū)分銷(xiāo)商和銷(xiāo)售代理獲得。
問(wèn):有哪些支持AVR 的起步工具包
答STK100,SL-AVR,SL-OKAVR,SL-AVRL 支持AVR 的Tiny 系列 單片機(jī)
STK200,SL-AVR,SL-OKAVR,SL-AVRL 支持AVR 單片機(jī) 即AT90S 系列
STK300,SL-AVR,SL-OKAVR,SL-AVRL 還支持AVR 的Mega103 單片機(jī) 。
STK500,SL-AVR,SL-OKAVR,SL-AVRL 還支持AVR 的Mega103 單片機(jī)
所有的起步工具包都包括按鈕LED指示燈RS232 通信接口I/O 口通過(guò)分布在PCB板邊沿的連接插頭可以使用STK200/300 起步工具包還有一條在線編程ISP 電纜它可用以對(duì)AVR芯片編程STK300 還提供了AVR 應(yīng)用程序生成器可用來(lái)生成外圍設(shè)備的初始化代碼
問(wèn): 即使看門(mén)狗沒(méi)有使用我也有時(shí)在AVR Studio 調(diào)試軟件的狀態(tài)欄中看到“WDT reset” WDT 復(fù)位的信息這是為什么?答當(dāng)目標(biāo)器件運(yùn)行在較高的頻率大于6 MHz)時(shí)來(lái)自扁平電纜FPC 電纜的噪聲信號(hào)可能錯(cuò)誤地觸發(fā)WDT 復(fù)位檢測(cè)電路這對(duì)程序的仿真和執(zhí)行沒(méi)有影響它們不會(huì)由于噪聲的原因而產(chǎn)生復(fù)位噪聲僅僅影響AVR Studio 調(diào)試軟件的信息處理在這種情況下不要理睬這個(gè)信息當(dāng)目標(biāo)器件運(yùn)行在較低的頻率小于或等于4 MHZ 時(shí)應(yīng)該不會(huì)出現(xiàn)這個(gè)問(wèn)題
問(wèn): 我剛買(mǎi)了一臺(tái)ICE 200 仿真器在使用不同的芯片和不同的時(shí)間運(yùn)行診斷程序時(shí)都是失敗的而其它一切正常這是什么原因?
答在ICE200 仿真器的第一批產(chǎn)品中是一個(gè)固件監(jiān)控程序的問(wèn)題而導(dǎo)致這個(gè)現(xiàn)象這個(gè)現(xiàn)象可以通過(guò)升級(jí)新版本的監(jiān)控程序來(lái)修正當(dāng)使用2.02 版或更高版本的AVR Studio 軟件時(shí)AVRStudio 將讀取固件版本并檢查這個(gè)問(wèn)題如果你的ICE200 需要升級(jí)它會(huì)引導(dǎo)你完成升級(jí)處理這個(gè)檢查工作只有在裝載應(yīng)用程序時(shí)才能被執(zhí)行而當(dāng)運(yùn)行診斷程序時(shí)是不被啟動(dòng)的如果你首先嘗試運(yùn)行診斷程序診斷仿真器診斷程序不會(huì)檢查固件版本并且可能診斷失敗如果你碰巧有這種情況不要理睬診斷失敗而直接去裝載應(yīng)用程序這時(shí)你將可以升級(jí)ICE200 的監(jiān)控程序在升級(jí)后再回過(guò)來(lái)運(yùn)行診斷程序診斷結(jié)果應(yīng)該全部是正確了(注現(xiàn)在銷(xiāo)售的ICE200 已沒(méi)有這個(gè)問(wèn)題了)
問(wèn):如何檢查我的AVR 仿真器的版本號(hào)?
答在仿真器被連接的時(shí)候打開(kāi)AVR Studio 程序選擇菜單中Help-》About-》Info 來(lái)獲得你的仿真器的有關(guān)信息AT90ICEPRO 在1.20 之前的版本和ATmegaICE 在1.11 之前的版本是不能被AVR Studio 軟件檢測(cè)到的較新的版本已經(jīng)有了而且可以從Atmel 網(wǎng)站自由下載。
問(wèn):程序在仿真器或 單片機(jī) 中不工作,而在模擬器中看來(lái)工作很正常這是什么原因?
答這是堆棧指針設(shè)置中的常見(jiàn)問(wèn)題對(duì)所有帶SRAM 的AVR 單片機(jī) 堆棧指針必須設(shè)置在SRAM最后的地址
在匯編程序中這樣做是正確的
ldi R16 low(RAMEND) 裝載堆棧指針的低字節(jié)到R16
out SPL R16 輸出這個(gè)數(shù)值到堆棧指針寄存器
ldi R16 high(RAMEND) 裝載堆棧指針的高字節(jié)到R16
out SPH R16 如果AVR 的SRAM 小于256 字節(jié)就將這行注釋掉
在C 程序中堆棧指針是在啟動(dòng)代碼中自動(dòng)設(shè)置的注意鏈接文件(XCL 文件)定義了堆棧指針的位置請(qǐng)參考應(yīng)用筆記AVR032 ---- C 編譯器的鏈接文件”
問(wèn):從哪里我能找到完整的AVR 指令集?
答指令集在Atmel 的網(wǎng)站的Products-》AVR 8 bit RISC-》Datasheets 下面的網(wǎng)頁(yè)上或者直接連接http://www. atmel.com/atmel/products/prod200.htm網(wǎng)頁(yè); 《》附錄
3 AVR 指令速查表
問(wèn):當(dāng)開(kāi)始做一個(gè)使用AVR 單片機(jī) 的新項(xiàng)目時(shí)最常見(jiàn)最共同問(wèn)題有哪些?
答最常見(jiàn)最共同的錯(cuò)誤是忘記對(duì)不帶硬件堆棧的芯片設(shè)置堆棧指針對(duì)AT90S8515 單片機(jī) 上這樣做是妥當(dāng)?shù)?/p>
LDI R16 low(RAMEND)
OUT SPL R16
LDI R16 high(RAMEND)
OUT SPH R16
注在ATMEL 的匯編語(yǔ)言源程序中經(jīng)常將R16 寄存器用temp 符號(hào)來(lái)代替
另一個(gè)常見(jiàn)的錯(cuò)誤是將端口作為輸出使用時(shí)忘記設(shè)置端口在AVR 單片機(jī) 中設(shè)置端口作為輸出使用是通過(guò)寫(xiě)一個(gè)1 到數(shù)據(jù)方向寄存器(DDR)中完成的比如設(shè)置端口PORTB輸出高電平
LDI R16 0xFF 裝載十六進(jìn)制數(shù)FF 到寄存器R16
OUT DDRB R16 設(shè)置端口PORTB作為輸出使用
OUT PORTB R16 設(shè)置端口PORTB輸出高電平
使用AVR 匯編器時(shí)第三個(gè)常見(jiàn)的錯(cuò)誤是在使用裝載程序存儲(chǔ)器(LPM)指令時(shí)指向了程序存貯器中錯(cuò)誤的地址AVR 的程序存貯器是組織成字16 bit 的形式而LPM 指令是讀取字節(jié)8bit LPM 指令可以讀16 位字的高位字節(jié)或低位字節(jié)中的任意一個(gè)因?yàn)檫@個(gè)原因必須將16 位的程序存貯器地址分解成兩個(gè)指向你所希望裝入的字節(jié)的地址
問(wèn):我在AT90ICEPRO 中使用回溯(Trace 功能選項(xiàng)感覺(jué)很困難好象每次都不能啟動(dòng)回溯功能為什么?
答: 讓我們假設(shè)你在地址0x20 處停止仿真如果你現(xiàn)在設(shè)置啟動(dòng)回溯功能的觸發(fā)地址是同一個(gè)地址即也是0x20 那么在程序重新到達(dá)0x20 之前的回溯功能是無(wú)效的原因是觸發(fā)條件與斷點(diǎn)信息應(yīng)該在指令之前裝入AVR 核中所以盡管指令和觸發(fā)條件在0x20 地址但對(duì)在這之前裝入AVR核中的指令沒(méi)有任何效果如果你設(shè)置觸發(fā)條件為一個(gè)程序還沒(méi)有到達(dá)的地址應(yīng)該不會(huì)有任何問(wèn)題
問(wèn): 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 引腳可以選擇其中一個(gè)使用這兩個(gè)引腳有同樣的功能它們都激活內(nèi)部iRESET 信號(hào)) 但PEN 引腳只有在上電時(shí)(VCC大約1.2V)被讀取如果PEN 引腳不使用推薦將此引腳接VCC 所有其它型號(hào)的AVR 單片機(jī) 都是使用RESET 引腳來(lái)允許使能串行編程的
問(wèn):我不能使用AVR 仿真器正確地驅(qū)動(dòng)外部負(fù)載當(dāng)我使用電壓表來(lái)測(cè)量仿真器POD 上的引腳時(shí)好象引腳不能驅(qū)動(dòng)負(fù)載這是什么錯(cuò)誤?
答這是1.21 版的ICEPRPO 和1.10 版的MegaICE 存在的問(wèn)題,可用于仿真器升級(jí)的新版本軟件可以從http://www.atmel.com網(wǎng)站的products-》AVR 8bit RISC-》SOFtware 網(wǎng)頁(yè)中下載
為升級(jí)ICEPRPO 的版本到1.22 版請(qǐng)下載UPGRD122.ZIP 文件
為升級(jí)MegaICE 的版本到1.11 版請(qǐng)下載M111UPGR.ZIP 文件
這些文件是壓縮文件它包括了一個(gè)適用于仿真器的新的程序文件和一個(gè)PC 程序PC 程序可以用來(lái)對(duì)代碼檢查和對(duì)仿真器自動(dòng)升級(jí)
問(wèn):我使用了帶A/D轉(zhuǎn)換器的AVR 單片機(jī) 單片機(jī)工作非常好我也喜歡AVR 的速度但我有一個(gè)問(wèn)題當(dāng)我改變A/D 轉(zhuǎn)換器的輸入通道時(shí)好象A/D 轉(zhuǎn)換器讀取的數(shù)據(jù)仍然是上一個(gè)通道的,如果我第二次讀我又得到正確的數(shù)值為什么會(huì)出現(xiàn)這件事?
答A/D 控制和狀態(tài)寄存器ADCSR 中有兩個(gè)位是用來(lái)檢測(cè)A/D 轉(zhuǎn)換的結(jié)束的當(dāng)一個(gè)新的轉(zhuǎn)換啟動(dòng)時(shí)ADSC 啟動(dòng)轉(zhuǎn)換控制位是用于測(cè)試的不管是否準(zhǔn)備就緒前一次的轉(zhuǎn)換結(jié)果仍然被送入A/D 數(shù)據(jù)寄存器當(dāng)讀取A/D 數(shù)據(jù)寄存器時(shí)讀到的自然仍是上一次的轉(zhuǎn)換結(jié)果
為了得到最近的轉(zhuǎn)換結(jié)果應(yīng)該測(cè)試A/D 中斷標(biāo)志位ADIF 或使能全局中斷并且在中斷服務(wù)程序中讀取
例子代碼
ldi R16 1 選擇通道
out ADMUX R16
sbi ADCSR adif 復(fù)位中斷標(biāo)識(shí)
sbi ADCSR adsc 開(kāi)始A/D 轉(zhuǎn)換
wait sbis ADCSR adif 等待直到ADIF 已經(jīng)置位
rjmp wait
問(wèn):當(dāng)將一個(gè)文件裝入AVR STUDIO 時(shí)它始終使用我第一次使用過(guò)的文件工作這是什么錯(cuò)誤?
答AVD 文件包含了有關(guān)窗口設(shè)置和當(dāng)前目標(biāo)文件的信息有時(shí)由AVR STUDIO 創(chuàng)建的AVD文件可能被破壞根據(jù)文件破壞部位的不同會(huì)出現(xiàn)不同的現(xiàn)象當(dāng)運(yùn)行AVR STUDIO 過(guò)程中出現(xiàn)奇怪問(wèn)題時(shí)首先應(yīng)嘗試刪除位于存放源代碼的文件夾中護(hù)展名為avd 的文件
問(wèn):在AVR 系列中如AT90S2313 單片機(jī) 全部數(shù)據(jù)存儲(chǔ)器不超過(guò)256 字節(jié)而且它不能訪問(wèn)外部存儲(chǔ)器能否忽略X Y 和Z 指針的高位字節(jié)而僅使用指針的低位字節(jié)來(lái)訪問(wèn)可以使用的存儲(chǔ)器?
答在全部數(shù)據(jù)存儲(chǔ)器寄存器I/O 寄存器和SRAM 少于256 字節(jié)的AVR 單片機(jī) 中當(dāng)使用
LD/ST 指令訪問(wèn)數(shù)據(jù)存儲(chǔ)器時(shí)CPU 將忽略指針的高位字節(jié)這時(shí)允許每個(gè)指針的高位字節(jié)(R27、R29 和R31)用于普通的儲(chǔ)存用途自增和預(yù)減指令(如LD -Z Rd)不會(huì)影響高位字節(jié)注意當(dāng)使用Z 指針訪問(wèn)FLASH 程序存儲(chǔ)器和使用ADIW/SBIW 指令時(shí)將影響使用的Z 指針的高位字節(jié)
問(wèn)在IAR C 編譯器中怎樣才能訪問(wèn)AVR 內(nèi)部的EEPROM 數(shù)據(jù)存儲(chǔ)器
答AVR 內(nèi)部的EEPROM 是AVR 微控制器I/O 存貯器的一部分以I/O 接口形式訪問(wèn)不能使用普通變量進(jìn)行訪問(wèn)IAR 在標(biāo)準(zhǔn)庫(kù)例程“ina90.h”中定義了特殊的宏來(lái)讀寫(xiě)EEPROM
讀寫(xiě)EEPROM 的宏有下列原形
_EEGET(VAR ADR) /* 從EERPOM 的地址ADR 讀取數(shù)值*/
_EEPUT(ADR VAL) /* 寫(xiě)VAL 到EERPOM 的地址ADR *
IAR C 編譯器不支持將常量定義到EEPROM 中不能生成EEPROM 的初始化數(shù)據(jù)文件
用AVR 匯編器來(lái)做這件事是很容易的先寫(xiě)一些定義EEPROM 中常量的代碼
.ESEG
.org 0x50
datatable: .db $01,$02,$03,$04,$05
dtableend: .db $00
當(dāng)這段代碼被匯編后它產(chǎn)生一個(gè).EEP 文件這個(gè)文件可以被下載到微控制器MCU 或仿真器中這個(gè).org 聲明給出數(shù)據(jù)的地址這個(gè)變量在C 編繹器中可以用_EEGET()和_EEPUT()進(jìn)行訪問(wèn)
問(wèn):我無(wú)法使MCU 在掉電模式時(shí)消耗的電流下降到數(shù)據(jù)簿中的值我應(yīng)該怎么做?
答當(dāng)AVR 進(jìn)入掉電模式時(shí)I/O 引腳的狀態(tài)應(yīng)該是不變化的如果你有一些未連接引腳是三態(tài)輸入并且沒(méi)有上拉這些引腳的電平是浮動(dòng)的并且很可能引起振蕩從而導(dǎo)致額外的電流消耗為解決這種問(wèn)題應(yīng)該激活所有未連接的輸入引腳的上拉電阻這會(huì)使這些引腳具有一個(gè)明確的邏輯電平在由于引腳振蕩而產(chǎn)生這個(gè)問(wèn)題的例子中在活動(dòng)模式非休眠狀態(tài)打開(kāi)未使用引腳的上拉是一個(gè)好方法
其次你再查看一下連接到輸出引腳的接線任何輸出引腳上的負(fù)載都會(huì)在掉電模式時(shí)消耗額外的電流
問(wèn):我觀察到我現(xiàn)有的微控制器在上電過(guò)程中I/O 端口是活動(dòng)的在我的應(yīng)用中有一個(gè)問(wèn)題系統(tǒng)一旦設(shè)定I/O 引腳中的一個(gè)為高電平MCU 可以關(guān)閉電源而即使用一個(gè)電阻把該引腳電平拉低在上電過(guò)程中它有時(shí)仍然出現(xiàn)高電平因此當(dāng)電源打開(kāi)時(shí)系統(tǒng)立刻關(guān)閉在使用者看來(lái)系統(tǒng)不能工作如果我換成AVR 我猜想會(huì)有一些同樣的問(wèn)題?
答大多數(shù)微控制器是同步復(fù)位比如在RESET 尚未完全完成時(shí)MCU 需要一定數(shù)量的有效時(shí)鐘在上電過(guò)程中當(dāng)VCC 上升到啟動(dòng)晶體振蕩器的數(shù)值之前上電復(fù)位是有效的但不能影響I/O引腳的數(shù)值而且I/O 引腳是處于隨機(jī)狀態(tài)AVR 的I/O 端口與復(fù)位是異步的而且保證在整個(gè)上電過(guò)程中是處于三態(tài)換成AVR 單片機(jī) 將可以解決你的問(wèn)題
問(wèn):怎樣處理AVR 微控制器的NC 引腳空引腳?
答不要將任何線路連接到NC 引腳NC 引腳是為將來(lái)的需用而保留的
問(wèn):在AVR 匯編器中怎樣定義字符串常量
答字符串可以作為常量定義在FLASH 存儲(chǔ)器或EEPROM 數(shù)據(jù)存儲(chǔ)器中
例如在FLASH 中定義一個(gè)字符串常量
.CSEG
fstring .db “This is a string in flash” 0x00
在EEPROM 中規(guī)定一串常量:
.ESEG
eestring .db “This is a string in EEPROM” 0x00
問(wèn):我正在編寫(xiě)一個(gè)很大的匯編程序當(dāng)我往程序中加入新的行時(shí)文件末尾的字符好象消失了我怎樣才能防止這種現(xiàn)象?
答: 匯編器的編輯器有30K 字節(jié)的文件尺寸限制如果要克服這個(gè)限制文件必須被分成幾個(gè)模塊并用“.include”鏈接還有一種方法使用其它編輯器如NotePad UltraEdit 程序等和命令行方式工作的匯編器(DOS 版本)
問(wèn):AT90S8515 有8KB 的程序存儲(chǔ)器由于RJMP 和RCALL 指令只能在2K 的相對(duì)范圍內(nèi)跳轉(zhuǎn)而這個(gè)部件的指令集沒(méi)有JMP 或CALL 指令我怎樣做才能跳轉(zhuǎn)到全部的程序存儲(chǔ)器中
答程序存儲(chǔ)器是組織成4Kx16 的形式的所以只有4K 的程序存儲(chǔ)器地址空間在匯編器中選擇“Options 》》 Wrap Relative Jumps”選項(xiàng)這時(shí)將允許你跳過(guò)程序存儲(chǔ)器的邊界例如如果你從$FFE至$00A 做一個(gè)相對(duì)跳轉(zhuǎn)程序計(jì)數(shù)器將被增加12 并且隱藏了程序存儲(chǔ)器的邊界這個(gè)功能只能用在8K 的 單片機(jī) 4K 的單片機(jī)不需要隱藏邊界16K 的單片機(jī)需要使用JUMP 和CALL 指令。
問(wèn):當(dāng)我使用UART時(shí)定時(shí)/計(jì)數(shù)器的任意一個(gè)是否都可用于產(chǎn)生波特率?
答不對(duì)有一個(gè)專(zhuān)用的定時(shí)器被UART 用來(lái)產(chǎn)生波特率所有定時(shí)/計(jì)數(shù)器只可以用作普通用途
問(wèn):怎樣才能從外部將AT90S1200 從掉電模式下喚醒?
答要從掉電模式喚醒AT90S1200 你必須使能外部INT0 中斷并且是低電平觸發(fā)中斷當(dāng)你以掉電模式進(jìn)入休眠狀態(tài)時(shí)如果INT0 引腳上低電平的保持時(shí)間大于16384 個(gè)內(nèi)部RC 振蕩周期時(shí)AT90S1200 將被喚醒內(nèi)部RC 振蕩器是用于延時(shí)MCU 的啟動(dòng)直到XTAL 振蕩器工作穩(wěn)定參考AT90S1200 數(shù)據(jù)簿RC 振蕩器的頻率是受VCC 電壓影響的
問(wèn):當(dāng)我使用SBI 和CBI 指令來(lái)設(shè)置或清除I/O 端口的一個(gè)信號(hào)位時(shí)是否會(huì)影響同一端口的其它位?
答不會(huì)不像多數(shù) 單片機(jī) 那樣在AVR 單片機(jī)中允許你100%安全地操作I/O 端口的信號(hào)位這也適用于整個(gè)端口的操作有疑問(wèn)可參考每個(gè)I/O 端口的三個(gè)地址
問(wèn):為什么每個(gè)I/O 端口有三個(gè)地址?
答為使你能建立100%安全的系統(tǒng)AVR 支持真正的讀-修改-寫(xiě)I/O 端口如果你希望讀取I/O引腳的物理電平讀PIN 寄存器當(dāng)你希望改變輸出時(shí)讀PORT 鎖存能確保正確的數(shù)據(jù)寫(xiě)回到端口保證全部輸出這種方式始終能給出你所希望的結(jié)果而不依賴于引腳的物理電平這個(gè)特點(diǎn)使你省去了為建立一個(gè)安全的系統(tǒng)而拷貝你的端口數(shù)據(jù)進(jìn)入存貯器的所有工作這個(gè)工作使用了許多指令當(dāng)你使用SBI 和CBI 指令來(lái)設(shè)置/清除I/O 端口的信號(hào)位時(shí)必須始終使用PORT 的地址
問(wèn):為什么SBI 和CBI 指令只能對(duì)$00 -$1F的I/O 寄存器進(jìn)行操作?
答所有AVR 指令中除少數(shù)外都為兩個(gè)字節(jié)長(zhǎng)度這也意味著只有65,536(64K)種可能的組合來(lái)安排指令集當(dāng)我們指定AVR 指令集時(shí)采取一些折衷的辦法是為了盡可能充分地利用這64K 種組合不像CISC 微控制器指令可以是一個(gè)兩個(gè)三個(gè)或更多個(gè)字節(jié)在AVR 結(jié)構(gòu)上我們不能實(shí)現(xiàn)全部指令都象這樣作為例子在一個(gè)立即尋址而且包含全部32 個(gè)寄存器地址的指令中常數(shù)需要8 位而寄存器地址需要另外的5 位這種指令將占用全部指令組合空間中的8K 換句話講我們只能安排八個(gè)這樣的指令而沒(méi)有更多的指令能夠?qū)崿F(xiàn)如果做一個(gè)17 位長(zhǎng)度的指令是不經(jīng)濟(jì)和不方便的方案不會(huì)被考慮在設(shè)計(jì)AVR 指令集的過(guò)程中設(shè)置我們聽(tīng)取了許多建義我們請(qǐng)教了C 編譯器專(zhuān)家他們?cè)谌绾握{(diào)整指令集來(lái)適應(yīng)C 編譯器方面提出了許多意見(jiàn)作為例子編譯器專(zhuān)家建議我們?yōu)镾BCI 帶進(jìn)位的立即數(shù)減法犧牲ADDI 指令
對(duì)那些缺少的指令操作也是方便的AVR 的代碼效率應(yīng)該能證明我們已經(jīng)找到一種在實(shí)現(xiàn)的指令和省略的指令之間進(jìn)行折衷的好辦法
問(wèn):為什么立即尋址指令在寄存器R0-R15 中不能工作?
答所有AVR 指令中除少數(shù)外都為兩個(gè)字節(jié)長(zhǎng)度這也意味著只有65,536(64K)種可能的組合來(lái)安排指令集當(dāng)我們指定AVR 指令集時(shí)采取一些折衷的辦法是為了盡可能充分地利用這64K 種組合不像CISC 微控制器指令可以是一個(gè)兩個(gè)三個(gè)或更多個(gè)字節(jié)在AVR 結(jié)構(gòu)上我們不能實(shí)現(xiàn)全部指令都象這樣作為例子在一個(gè)立即尋址而且包含全部32 個(gè)寄存器地址的指令中常數(shù)需要8 位而寄存器地址需要另外的5 位這種指令將占用全部指令組合空間中的8K 換句話講我們只能安排八個(gè)這樣的指令而沒(méi)有更多的指令能夠?qū)崿F(xiàn)而做一個(gè)17 位長(zhǎng)度的指令是不經(jīng)濟(jì)和不方便的方案不會(huì)被考慮在設(shè)計(jì)AVR 指令集的過(guò)程中設(shè)置我們聽(tīng)取了許多建義我們請(qǐng)教了C 編譯器專(zhuān)家他們?cè)谌绾握{(diào)整指令集來(lái)適應(yīng)C 編譯器方面提出了許多意見(jiàn)作為例子編譯器專(zhuān)家建議我們?yōu)镾BCI 帶進(jìn)位的立即數(shù)減法犧牲ADDI 指令
對(duì)那些缺少的指令操作也是方便的AVR 的代碼效率應(yīng)該能證明我們已經(jīng)找到一種在實(shí)現(xiàn)的指令和省略的指令之間進(jìn)行折衷的好辦法
問(wèn):為什么沒(méi)有EORI 指令?
答所有AVR 指令中除少數(shù)外都為兩個(gè)字節(jié)長(zhǎng)度這也意味著只有65,536(64K)種可能的組合來(lái)安排指令集當(dāng)我們指定AVR 指令集時(shí)采取一些折衷的辦法是為了盡可能充分地利用這64K 種組合不像CISC 微控制器指令可以是一個(gè)兩個(gè)三個(gè)或更多個(gè)字節(jié)在AVR 結(jié)構(gòu)上我們不能實(shí)現(xiàn)全部指令都象這樣作為例子在一個(gè)立即尋址而且包含全部32 個(gè)寄存器地址的指令中常數(shù)需要8 位而寄存器地址需要另外的5 位這種指令將占用全部指令組合空間中的8K 換句話講我們只能安排八個(gè)這樣的指令而沒(méi)有更多的指令能夠?qū)崿F(xiàn)而做一個(gè)17 位長(zhǎng)度的指令是不經(jīng)濟(jì)和不方便的方案不會(huì)被考慮在設(shè)計(jì)AVR 指令集的過(guò)程中設(shè)置我們聽(tīng)取了許多建義我們請(qǐng)教了C 編譯器專(zhuān)家他們?cè)谌绾握{(diào)整指令集來(lái)適應(yīng)C 編譯器方面提出了許多意見(jiàn)作為例子編譯器專(zhuān)家建議我們?yōu)镾BCI 帶進(jìn)位的立即數(shù)減法犧牲ADDI 指令
對(duì)那些缺少的指令操作也是方便的AVR 的代碼效率應(yīng)該能證明我們已經(jīng)找到一種在實(shí)現(xiàn)的指令和省略的指令之間進(jìn)行折衷的好辦法
問(wèn):我用“sbr r30,3”指令在寄存器30 中設(shè)置D3 位好象對(duì)D3 位不起作用但D0 位與D1 位可以被設(shè)置我的做法在哪里有錯(cuò)誤?
答“SBR” 可以用來(lái)在一個(gè)寄存器中同時(shí)設(shè)置多位(象“CBR”可以用來(lái)同時(shí)清除寄存器中的多位)指令的第二個(gè)參數(shù)不是指定位號(hào)而是用來(lái)與寄存器中的數(shù)作邏輯或運(yùn)算在這個(gè)例子中$03 與R30 的內(nèi)容相或所以導(dǎo)致最低的兩位置位為了只設(shè)置D3 位應(yīng)嘗試下列方法的一種
sbr r30 $08
sbr r30 0b00001000
sbr r30 (1《《3)
上面三行都會(huì)產(chǎn)生同樣的結(jié)果你可以選擇一個(gè)你最習(xí)慣的用法
問(wèn):在我的多任務(wù)系統(tǒng)中除了中斷標(biāo)志以外我還需要定義可以設(shè)置和清除的標(biāo)志我應(yīng)該怎樣做?
答每個(gè)標(biāo)志使用一個(gè)寄存器為了設(shè)置標(biāo)志用
ldi flag 01
或者如果你想使用低位的寄存器(R0-R15) 在復(fù)位后先清除它然后用
inc flag
來(lái)設(shè)置標(biāo)志
當(dāng)檢查和清除標(biāo)志時(shí)這樣做
lsr flag 移動(dòng)標(biāo)志到進(jìn)位標(biāo)志位(標(biāo)志清除)
brne flag_was_set 如果標(biāo)志被設(shè)置就跳轉(zhuǎn)
象在你所有的中斷例程中一樣在退出之前要恢復(fù)狀態(tài)寄存器這種方式十分安全
問(wèn):在AT90S1200 中如何實(shí)現(xiàn)常數(shù)表功能?
答由于AT90S1200 沒(méi)有LPM 指令比較有效的方法是將一個(gè)較小的常數(shù)表放置在EEPROM 中你可以使用EEPROM 地址寄存器和EEPROM 數(shù)據(jù)寄存器有效地直接訪問(wèn)常數(shù)表如
.ESEG 定義EEPROM 段
.db my_var00=$45
.db my_var01=$4c
.db my_var02=$5f
.CSEG 定義通用代碼段
如果你的表不適合于放置在EEPROM 中你可以象下面這樣放置在FLASH 中
.def tp =r16 表指針表索引
.def output=r17 輸出表的中常數(shù)
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
為了訪問(wèn)表中的2 號(hào)元素可以這樣做
ldi tp 2
rcall table
當(dāng)從表格子程序返回時(shí)“output”將包括“$4c”
問(wèn):在沒(méi)有ADDI 指令的情況下怎樣將一個(gè)常數(shù)立即數(shù)和寄存器的內(nèi)容相加?
答一個(gè)較簡(jiǎn)單的方法是減去一個(gè)負(fù)數(shù)下面的代碼是將寄存器R20 中和5 的相加的例子
subi r20 -5
注意無(wú)論如何在這種情況下進(jìn)位標(biāo)志位不能用于檢測(cè)溢出如果你已經(jīng)將常數(shù)放入另一個(gè)寄存器你可以使用通用的ADD 指令如果常量是1 你能使用INC 指令來(lái)增加寄存器的值16 位的加法是同樣的下列代碼是將r17 r16 和$0b3c 相加的例子
subi r16 low(-$0b3c) 減去低位字節(jié)
sbci r17 high(-$0b3c) 減去高位字節(jié)
問(wèn):為實(shí)現(xiàn)指令的單周期運(yùn)行是否對(duì)外部時(shí)鐘倍頻?
答沒(méi)有這個(gè)時(shí)鐘是MCU 真正使用的沒(méi)有使用時(shí)鐘分頻或倍頻電路
問(wèn): AVR 的一個(gè)指令周期使用了多少個(gè)時(shí)鐘周期?
答只有一個(gè)時(shí)鐘周期例如在寄存器中加入兩個(gè)數(shù)全部執(zhí)行時(shí)間等于在XTAL1 引腳上的時(shí)鐘信號(hào)正半周加負(fù)半周的時(shí)間
問(wèn):為什么AT90S8515 稱(chēng)8K 的MCU?
答大多數(shù)CISC 微控制器的指令是變長(zhǎng)度的一些指令由單字節(jié)組成其它的指令也可以是四個(gè)字節(jié)長(zhǎng)度大多數(shù)AVR 指令是兩個(gè)字節(jié)長(zhǎng)度只有很少也是四個(gè)字節(jié)所以CPU 在啟動(dòng)運(yùn)行時(shí)不能每次只讀取和解釋一個(gè)字節(jié)而我們的代碼尺寸基準(zhǔn)始終是和字節(jié)相比較的因此在80C51上填滿8K 的一個(gè)C 程序肯定也適合的8K 的AVR
問(wèn):我從哪里能找到數(shù)據(jù)簿?
答你可以從網(wǎng)站www.atmel.com有選擇地下載它們你也可從當(dāng)?shù)胤咒N(xiāo)商和ATMEL 辦事處得到數(shù)據(jù)簿你還可以發(fā)電子郵件到literature@atmel.com索取
問(wèn):AVR 有哪些超過(guò)我現(xiàn)有MCU 的附加性能?
答十分緊湊的代碼, 特別是對(duì)C 程序4-10 倍的高速度可編程FLASH 存儲(chǔ)器可在系統(tǒng)編程芯片內(nèi)含EEPROM 存貯器可在系統(tǒng)編程低功耗
評(píng)論