HT45F23 MCU 含有兩個運算放大器,OPA1 和OPA2,可用於用戶特定的模擬信號處理,通 過控制暫存器,OPA 相關的應用可以很容易實現。本文主要介紹OPA 的操作,暫存器設定 以及基本OPA 應用,例如:同相放大器、反相放大器和電壓跟隨器。 HT45F23 運算放大器OPA1/OPA2 具有多個開關,輸入路徑可選以及多種參考電壓選擇,此 外OPA2 內部有8 種增益選項,直接通過軟體設定。適應於各種廣泛的應用。
上傳時間: 2013-11-21
上傳用戶:immanuel2006
在大多數單片機系統中經常要用到按鍵和 7 段數碼管顯示,ZLG7290 就是一款功能強勁的按鍵處理和7 段數碼管顯示專業芯片。ZLG7290 提供了I2C 串行接口和鍵盤中斷信號方便與處理器連接;可驅動8 位共陰數碼管或64 個獨立LED 和64 個按鍵, 可控掃描位數并且可控任一數碼管閃爍,提供數據譯碼和循環移位段尋址等控制,58 個功能鍵可檢測任一鍵的連擊次數,無需外接元件即可直接驅動LED、即可擴展驅動電流和驅動電壓。
上傳時間: 2013-11-18
上傳用戶:Altman
AVR 單片機和C語言的集成開發環境 ICCAVR編譯器簡介 ICCAVR是一個綜合了編輯器和工程管理器的集成開發環境(IDE),是一個純32位的程序,可在Windows 95/98/ME/NT/2000/XP下運行。Ø 源文件全部被組織在工程之中,文件的編輯和工程的構筑也在IDE的環境中完成。編譯錯誤在狀態窗口中顯示,用鼠標單擊編譯錯誤時,光標會自動跳轉到編輯窗口中引起錯誤的那一行。同時這個工程管理器還能直接產生INTEL HEX格式的燒錄文件和用于AVR Studio調試的COFF格式的文件。Ø ICCAVR是一個32位的程序,支持長文件名。Ø ICCAVR提供了全部的庫源代碼及一些簡單的應用實例供初學者參考,特別是提供庫源代碼,對于用戶理解庫函數的參數及返回值等是非常有益的,并且用戶能夠根據庫源代碼對ICCAVR提供的庫函數進行剪裁和擴充
上傳時間: 2013-10-30
上傳用戶:pkkkkp
單片機入門基礎知識大全免費下載 單片機第八課(尋址方式與指令系統) 通過前面的學習,我們已經了解了單片機內部的結構,并且也已經知道,要控制單片機,讓它為我們干學,要用指令,我們已學了幾條指令,但很零散,從現在開始,我們將要系統地學習8051的指令部份。 一、概述 1、指令的格式 我們已知,要讓計算機做事,就得給計算機以指令,并且我們已知,計算機很“笨”,只能懂得數字,如前面我們寫進機器的75H,90H,00H等等,所以指令的第一種格式就是機器碼格式,也說是數字的形式。但這種形式實在是為難我們人了,太難記了,于是有另一種格式,助記符格式,如MOV P1,#0FFH,這樣就好記了。 這兩種格式之間的關系呢,我們不難理解,本質上它們完全等價,只是形式不一樣而已。 2、匯編 我們寫指令使用匯編格式,而計算機只懂機器碼格式,所以要將我們寫的匯編格式的指令轉換為機器碼格式,這種轉換有兩種方法:手工匯編和機器匯編。手工匯編實際上就是查表,因為這兩種格式純粹是格式不同,所以是一一對應的,查一張表格就行了。不過手工查表總是嫌麻煩,所以就有了計算機軟件,用計算機軟件來替代手工查表,這就是機器匯編。 二、尋址 讓我們先來復習一下我們學過的一些指令:MOV P1,#0FFH,MOV R7,#0FFH這些指令都是將一些數據送到相應的位置中去,為什么要送數據呢?第一個因為送入的數可以讓燈全滅掉,第二個是為了要實現延時,從這里我們可以看出來,在用單片機的編程語言編程時,經常要用到數據的傳遞,事實上數據傳遞是單片機編程時的一項重要工作,一共有28條指令(單片機共111條指令)。下面我們就從數據傳遞類指令開始吧。 分析一下MOV P1,#0FFH這條指令,我們不難得出結論,第一個詞MOV是命令動詞,也就是決定做什么事情的,MOV是MOVE少寫了一個E,所以就是“傳遞”,這就是指令,規定做什么事情,后面還有一些參數,分析一下,數據傳遞必須要有一個“源”也就是你要送什么數,必須要有一個“目的”,也就是你這個數要送到什么地方去,顯然在上面那條指令中,要送的數(源)就是0FFH,而要送達的地方(目的地)就是P1這個寄存器。在數據傳遞類指令中,均將目的地寫在指令的后面,而將源寫在最后。 這條指令中,送給P1是這個數本身,換言之,做完這條指令后,我們可以明確地知道,P1中的值是0FFH,但是并不是任何時候都可以直接給出數本身的。例如,在我們前面給出的延時程序例是這樣寫的: MAIN: SETB P1.0 ??;(1) LCALL DELAY ;(2) CLR P1.0 ;(3) LCALL DELAY ?。唬ǎ矗? AJMP MAIN ??;(5) ;以下子程序 DELAY: MOV R7,#250 ;(6) D1: MOV R6,#250 ?。唬ǎ罚?D2: DJNZ R6,D2 ??;(8) DJNZ R7,D1 ?。唬ǎ梗? RET ;(10) END ?。唬ǎ保保? 表1 MAIN: SETB P1.0 ;(1) MOV 30H,#255 LCALL DELAY ; CLR P1.0 ;(3) MOV 30H,#200 LCALL DELAY ??;(4) AJMP MAIN ;(5) ;以下子程序 DELAY: MOV R7,30H ?。唬ǎ叮?D1: MOV R6,#250 ??;(7) D2: DJNZ R6,D2 ??;(8) DJNZ R7,D1 ??;(9) RET ?。唬ǎ保埃? END ??;(11) 表2 這樣一來,我每次調用延時程序延時的時間都是相同的(大致都是0.13S),如果我提出這樣的要求:燈亮后延時時間為0.13S燈滅,燈滅后延時0.1秒燈亮,如此循環,這樣的程序還能滿足要求嗎?不能,怎么辦?我們可以把延時程序改成這樣(見表2):調用則見表2中的主程,也就是先把一個數送入30H,在子程序中R7中的值并不固定,而是根據30H單元中傳過來的數確定。這樣就可以滿足要求。 從這里我們可以得出結論,在數據傳遞中要找到被傳遞的數,很多時候,這個數并不能直接給出,需要變化,這就引出了一個概念:如何尋找操作數,我們把尋找操作數所在單元的地址稱之為尋址。在這里我們直接使用數所在單元的地址找到了操作數,所以稱這種方法為直接尋址。除了這種方法之外,還有一種,如果我們把數放在工作寄存器中,從工作寄存器中尋找數據,則稱之為寄存器尋址。例:MOV A,R0就是將R0工作寄存器中的數據送到累加器A中去。提一個問題:我們知道,工作寄存器就是內存單元的一部份,如果我們選擇工作寄存器組0,則R0就是RAM的00H單元,那么這樣一來,MOV A,00H,和MOV A,R0不就沒什么區別了嗎?為什么要加以區分呢?的確,這兩條指令執行的結果是完全相同的,都是將00H單元中的內容送到A中去,但是執行的過程不同,執行第一條指令需要2個周期,而第二條則只需要1個周期,第一條指令變成最終的目標碼要兩個字節(E5H 00H),而第二條則只要一個字節(E8h)就可以了。 這么斤斤計較!不就差了一個周期嗎,如果是12M的晶振的話,也就1個微秒時間了,一個字節又能有多少? 不對,如果這條指令只執行一次,也許無所謂,但一條指令如果執行上1000次,就是1毫秒,如果要執行1000000萬次,就是1S的誤差,這就很可觀了,單片機做的是實時控制的事,所以必須如此“斤斤計較”。字節數同樣如此。 再來提一個問題,現在我們已知,尋找操作數可以通過直接給的方式(立即尋址)和直接給出數所在單元地址的方式(直接尋址),這就夠了嗎? 看這個問題,要求從30H單元開始,取20個數,分別送入A累加器。 就我們目前掌握的辦法而言,要從30H單元取數,就用MOV A,30H,那么下一個數呢?是31H單元的,怎么取呢?還是只能用MOV A,31H,那么20個數,不是得20條指令才能寫完嗎?這里只有20個數,如果要送200個或2000個數,那豈不要寫上200條或2000條命令?這未免太笨了吧。為什么會出現這樣的狀況?是因為我們只會把地址寫在指令中,所以就沒辦法了,如果我們不是把地址直接寫在指令中,而是把地址放在另外一個寄存器單元中,根據這個寄存器單元中的數值決定該到哪個單元中取數據,比如,當前這個寄存器中的值是30H,那么就到30H單元中去取,如果是31H就到31H單元中去取,就可以解決這個問題了。怎么個解決法呢?既然是看的寄存器中的值,那么我們就可以通過一定的方法讓這里面的值發生變化,比如取完一個數后,將這個寄存器單元中的值加1,還是執行同一條指令,可是取數的對象卻不一樣了,不是嗎。通過例子來說明吧。 MOV R7,#20 MOV R0,#30H LOOP:MOV A,@R0 INC R0 DJNZ R7,LOOP 這個例子中大部份指令我們是能看懂的,第一句,是將立即數20送到R7中,執行完后R7中的值應當是20。第二句是將立即數30H送入R0工作寄存器中,所以執行完后,R0單元中的值是30H,第三句,這是看一下R0單元中是什么值,把這個值作為地址,取這個地址單元的內容送入A中,此時,執行這條指令的結果就相當于MOV A,30H。第四句,沒學過,就是把R0中的值加1,因此執行完后,R0中的值就是31H,第五句,學過,將R7中的值減1,看是否等于0,不等于0,則轉到標號LOOP處繼續執行,因此,執行完這句后,將轉去執行MOV A,@R0這句話,此時相當于執行了MOV A,31H(因為此時的R0中的值已是31H了),如此,直到R7中的值逐次相減等于0,也就是循環20次為止,就實現了我們的要求:從30H單元開始將20個數據送入A中。 這也是一種尋找數據的方法,由于數據是間接地被找到的,所以就稱之為間址尋址。注意,在間址尋址中,只能用R0或R1存放等尋找的數據。 二、指令 數據傳遞類指令 1) 以累加器為目的操作數的指令 MOV A,Rn MOV A,direct MOV A,@Ri MOV A,#data 第一條指令中,Rn代表的是R0-R7。第二條指令中,direct就是指的直接地址,而第三條指令中,就是我們剛才講過的。第四條指令是將立即數data送到A中。 下面我們通過一些例子加以說明: MOV A,R1 ;將工作寄存器R1中的值送入A,R1中的值保持不變。 MOV A,30H ;將內存30H單元中的值送入A,30H單元中的值保持不變。 MOV A,@R1 ;先看R1中是什么值,把這個值作為地址,并將這個地址單元中的值送入A中。如執行命令前R1中的值為20H,則是將20H單元中的值送入A中。 MOV A,#34H ;將立即數34H送入A中,執行完本條指令后,A中的值是34H。 2)以寄存器Rn為目的操作的指令 MOV Rn,A MOV Rn,direct MOV Rn,#data 這組指令功能是把源地址單元中的內容送入工作寄存器,源操作數不變。
上傳時間: 2013-10-13
上傳用戶:3294322651
MCS51系列單片機軟件控制復位的可靠方法:文章指出了一種廣泛流傳的誤解:在MCS-51系列單片機中,只要用指令使程序從起始地址開始執行,就可以復位單片機,擺脫干擾。通過實驗,揭示了軟件控制復位的可靠方法。有的單片機(如8098)有專門的復位指令,某些增強型MCS-51系統單片機雖然沒有復位指令,但片內集成了WATCHDOG電路,故抗干擾也不成問題。而普及型MCS-51系列單片機(如8031和8032)既然無復位指令,又不帶硬件WATCHDOS,如果沒有外接硬件WATCHDOG電路,就必須采用軟件抗干擾技術。常用的軟件抗干擾技術有:軟件陷阱、指令冗余、軟件WATCHDOG等,它們的作用是在系統受干擾時能及時發現,再用軟件的方法使系統復位。所謂軟件復位就是用一系列指令來模仿復位操作,這就是MCS-51系列單片機所特有的軟件復位技術?,F用一簡單的實驗說明。接于P1.0的發光二極管LED0用來表示主程序的工作情況,接于P1.1的發光二極管LED1用于表示低級中斷子程序的工作情況,接于P1.2的發光二極管LED2用來表示高級中斷子程序的工作情況,接于P3.2口的按鈕用來設立干擾標志,程序檢測到干擾標志后故意進入死循環或掉進陷井,模仿受干擾的情況,從而檢驗各種復位方法的實際效果。實驗初始化程序如下:
上傳時間: 2013-11-03
上傳用戶:sevenbestfei
有兩種方式可以讓設備和應用程序之間聯系:1. 通過為設備創建的一個符號鏈;2. 通過輸出到一個接口WDM驅動程序建議使用輸出到一個接口而不推薦使用創建符號鏈的方法。這個接口保證PDO的安全,也保證安全地創建一個惟一的、獨立于語言的訪問設備的方法。一個應用程序使用Win32APIs來調用設備。在某個Win32 APIs和設備對象的分發函數之間存在一個映射關系。獲得對設備對象訪問的第一步就是打開一個設備對象的句柄。 用符號鏈打開一個設備的句柄為了打開一個設備,應用程序需要使用CreateFile。如果該設備有一個符號鏈出口,應用程序可以用下面這個例子的形式打開句柄:hDevice = CreateFile("\\\\.\\OMNIPORT3", GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL ,NULL);文件路徑名的前綴“\\.\”告訴系統本調用希望打開一個設備。這個設備必須有一個符號鏈,以便應用程序能夠打開它。有關細節查看有關Kdevice和CreateLink的內容。在上述調用中第一個參數中前綴后的部分就是這個符號鏈的名字。注意:CreatFile中的第一個參數不是Windows 98/2000中驅動程序(.sys文件)的路徑。是到設備對象的符號鏈。如果使用DriverWizard產生驅動程序,它通常使用類KunitizedName來構成設備的符號鏈。這意味著符號鏈名有一個附加的數字,通常是0。例如:如果鏈接名稱的主干是L“TestDevice”那么在CreateFile中的串就該是“\\\\.\\TestDevice0”。如果應用程序需要被覆蓋的I/O,第六個參數(Flags)必須或上FILE_FLAG_OVERLAPPED。 使用一個輸出接口打開句柄用這種方式打開一個句柄會稍微麻煩一些。DriverWorks庫提供兩個助手類來使獲得對該接口的訪問容易一些,這兩個類是CDeviceInterface, 和 CdeviceInterfaceClass。CdeviceInterfaceClass類封裝了一個設備信息集,該信息集包含了特殊類中的所有設備接口信息。應用程序能有用CdeviceInterfaceClass類的一個實例來獲得一個或更多的CdeviceInterface類的實例。CdeviceInterface類是一個單一設備接口的抽象。它的成員函數DevicePath()返回一個路徑名的指針,該指針可以在CreateFile中使用來打開設備。下面用一個小例子來顯示這些類最基本的使用方法:extern GUID TestGuid;HANDLE OpenByInterface( GUID* pClassGuid, DWORD instance, PDWORD pError){ CDeviceInterfaceClass DevClass(pClassGuid, pError); if (*pError != ERROR_SUCCESS) return INVALID_HANDLE_VALUE; CDeviceInterface DevInterface(&DevClass, instance, pError); if (*pError != ERROR_SUCCESS) return INVALID_HANDLE_VALUE; cout << "The device path is " << DevInterface.DevicePath() << endl; HANDLE hDev; hDev = CreateFile( DevInterface.DevicePath(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if (hDev == INVALID_HANDLE_VALUE) *pError = GetLastError(); return hDev;} 在設備中執行I/O操作一旦應用程序獲得一個有效的設備句柄,它就能使用Win32 APIs來產生到設備對象的IRPs。下面的表顯示了這種對應關系。Win32 API DRIVER_FUNCTION_xxxIRP_MJ_xxx KDevice subclass member function CreateFile CREATE Create ReadFile READ Read WriteFile WRITE Write DeviceIoControl DEVICE_CONTROL DeviceControl CloseHandle CLOSECLEANUP CloseCleanUp 需要解釋一下設備類成員的Close和CleanUp:CreateFile使內核為設備創建一個新的文件對象。這使得多個句柄可以映射同一個文件對象。當這個文件對象的最后一個用戶級句柄被撤銷后,I/O管理器調用CleanUp。當沒有任何用戶級和核心級的對文件對象的訪問的時候,I/O管理器調用Close。如果被打開的設備不支持指定的功能,則調用相應的Win32將引起錯誤(無效功能)。以前為Windows95編寫的VxD的應用程序代碼中可能會在打開設備的時候使用FILE_FLAG_DELETE_ON_CLOSE屬性。在Windows NT/2000中,建議不要使用這個屬性,因為它將導致沒有特權的用戶企圖打開這個設備,這是不可能成功的。I/O管理器將ReadFile和WriteFile的buff參數轉換成IRP域的方法依賴于設備對象的屬性。當設備設置DO_DIRECT_IO標志,I/O管理器將buff鎖住在存儲器中,并且創建了一個存儲在IRP中的MDL域。一個設備可以通過調用Kirp::Mdl來存取MDL。當設備設置DO_BUFFERED_IO標志,設備對象分別通過KIrp::BufferedReadDest或 KIrp::BufferedWriteSource為讀或寫操作獲得buff地址。當設備不設置DO_BUFFERED_IO標志也不設置DO_DIRECT_IO,內核設置IRP 的UserBuffer域來對應ReadFile或WriteFile中的buff參數。然而,存儲區并沒有被鎖住而且地址只對調用進程有效。驅動程序可以使用KIrp::UserBuffer來存取IRP域。對于DeviceIoControl調用,buffer參數的轉換依賴于特殊的I/O控制代碼,它不在設備對象的特性中。宏CTL_CODE(在winioctl.h中定義)用來構造控制代碼。這個宏的其中一個參數指明緩沖方法是METHOD_BUFFERED, METHOD_IN_DIRECT, METHOD_OUT_DIRECT, 或METHOD_NEITHER。下面的表顯示了這些方法和與之對應的能獲得輸入緩沖與輸出緩沖的KIrp中的成員函數:Method Input Buffer Parameter Output Buffer Parameter METHOD_BUFFERED KIrp::IoctlBuffer KIrp::IoctlBuffer METHOD_IN_DIRECT KIrp::IoctlBuffer KIrp::Mdl METHOD_OUT_DIRECT KIrp::IoctlBuffer KIrp::Mdl METHOD_NEITHER KIrp::IoctlType3InputBuffer KIrp::UserBuffer 如果控制代碼指明METHOD_BUFFERED,系統分配一個單一的緩沖來作為輸入與輸出。驅動程序必須在向輸出緩沖放數據之前拷貝輸入數據。驅動程序通過調用KIrp::IoctlBuffer獲得緩沖地址。在完成時,I/O管理器從系統緩沖拷貝數據到提供給Ring 3級調用者使用的緩沖中。驅動程序必須在結束前存儲拷貝到IRP的Information成員中的數據個數。如果控制代碼不指明METHOD_IN_DIRECT或METHOD_OUT_DIRECT,則DeviceIoControl的參數呈現不同的含義。參數InputBuffer被拷貝到一個系統緩沖,這個緩沖驅動程序可以通過調用KIrp::IoctlBuffer。參數OutputBuffer被映射到KMemory對象,驅動程序對這個對象的訪問通過調用KIrp::Mdl來實現。對于METHOD_OUT_DIRECT,調用者必須有對緩沖的寫訪問權限。注意,對METHOD_NEITHER,內核只提供虛擬地址;它不會做映射來配置緩沖。虛擬地址只對調用進程有效。這里是一個用METHOD_BUFFERED的例子:首先,使用宏CTL_CODE來定義一個IOCTL代碼:#define IOCTL_MYDEV_GET_FIRMWARE_REV \CTL_CODE (FILE_DEVICE_UNKNOWN,0,METHOD_BUFFERED,FILE_ANY_ACCESS)現在使用一個DeviceIoControl調用:BOOLEAN b;CHAR FirmwareRev[60];ULONG FirmwareRevSize;b = DeviceIoControl(hDevice, IOCTL_MYDEV_GET_VERSION_STRING, NULL, // no input 注意,這里放的是包含有執行操作命令的字符串指針 0, FirmwareRev, //這里是output串指針,存放從驅動程序中返回的字符串。sizeof(FirmwareRev),& FirmwareRevSize, NULL // not overlapped I/O );如果輸出緩沖足夠大,設備拷貝串到里面并將拷貝的資結束設置到FirmwareRevSize中。在驅動程序中,代碼看起來如下所示:const char* FIRMWARE_REV = "FW 16.33 v5";NTSTATUS MyDevice::DeviceControl( KIrp I ){ ULONG fwLength=0; switch ( I.IoctlCode() ) { case IOCTL_MYDEV_GET_FIRMWARE_REV: fwLength = strlen(FIRMWARE_REV)+1; if (I.IoctlOutputBufferSize() >= fwLength) { strcpy((PCHAR)I.IoctlBuffer(),FIRMWARE_REV); I.Information() = fwLength; return I.Complete(STATUS_SUCCESS); } else { } case . . . } }
上傳時間: 2013-10-17
上傳用戶:gai928943
技術說明:線圈總長度應在20 ~ 30米左右,地感線應用橫截面大于等于0.5 平方毫米的耐高溫絕緣線;用切地機在堅硬水泥地面切槽,深度為 5~10 cm 左右,寬以切刻片厚度為準一般為5mm;然后將線一圈一圈放入槽中,再用水泥將槽封固,注意線不可浮出地面,在放入線圈時注意不要把線的絕緣層破壞,以免造成漏電或短路.引出線要雙絞在一起并行接入地感兩個LOOP 端,長度不能超過4米,每米中雙絞數不能少于30個.
上傳時間: 2013-11-04
上傳用戶:zhaoq123
我采用XC4VSX35或XC4VLX25 FPGA來連接DDR2 SODIMM和元件。SODIMM內存條選用MT16HTS51264HY-667(4GB),分立器件選用8片MT47H512M8。設計目標:當客戶使用內存條時,8片分立器件不焊接;當使用直接貼片分立內存顆粒時,SODIMM內存條不安裝。請問專家:1、在設計中,先用Xilinx MIG工具生成DDR2的Core后,管腳約束文件是否還可更改?若能更改,則必須要滿足什么條件下更改?生成的約束文件中,ADDR,data之間是否能調換? 2、對DDR2數據、地址和控制線路的匹配要注意些什么?通過兩只100歐的電阻分別連接到1.8V和GND進行匹配 和 通過一只49.9歐的電阻連接到0.9V進行匹配,哪種匹配方式更好? 3、V4中,PCB LayOut時,DDR2線路阻抗單端為50歐,差分為100歐?Hyperlynx仿真時,那些參數必須要達到那些指標DDR2-667才能正常工作? 4、 若使用DDR2-667的SODIMM內存條,能否降速使用?比如降速到DDR2-400或更低頻率使用? 5、板卡上有SODIMM的插座,又有8片內存顆粒,則物理上兩部分是連在一起的,若實際使用時,只安裝內存條或只安裝8片內存顆粒,是否會造成信號完成性的影響?若有影響,如何控制? 6、SODIMM內存條(max:4GB)能否和8片分立器件(max:4GB)組合同時使用,構成一個(max:8GB)的DDR2單元?若能,則布線阻抗和FPGA的DCI如何控制?地址和控制線的TOP圖應該怎樣? 7、DDR2和FPGA(VREF pin)的參考電壓0.9V的實際工作電流有多大?工作時候,DDR2芯片是否很燙,一般如何考慮散熱? 8、由于多層板疊層的問題,可能頂層和中間層的銅箔不一樣后,中間的夾層后度不一樣時,也可能造成阻抗的不同。請教DDR2-667的SODIMM在8層板上的推進疊層?
上傳時間: 2013-10-12
上傳用戶:han_zh
第1 章 體系結構 ARM經典300問與答第1 問:Q:請問在初始化CPU 堆棧的時候一開始在執行mov r0, LR 這句指令時處理器是什么模式A:復位后的模式,即管理模式.第2 問:Q:請教:MOV 中的8 位圖立即數,是怎么一回事 0xF0000001 是怎么來的A:是循環右移,就是一個0—255 之間的數左移或右移偶數位的來的,也就是這個數除以4一直除, 直到在0-255 的范圍內它是整數就說明是可以的!A:8 位數(0-255)循環左移或循環右移偶數位得到的,F0000001 既是0x1F 循環右移4 位,符合規范,所以是正確的.這樣做是因為指令長度的限制,不可能把32 位立即數放在32 位的指令中.移位偶數也是這個原因.可以看一看ARM 體系結構(ADS 自帶的英文文檔)的相關部分.第3 問:Q:請教:《ARM 微控制器基礎與實戰》2.2.1 節關于第2 個操作數的描述中有這么一段:#inmed_8r 常數表達式.該常數必須對應8 位位圖,即常熟是由一個8 位的常數循環移位偶數位得到.合法常量:0x3FC,0,0xF0000000,200,0xF0000001.非法常量:0x1FE,511,0xFFFF,0x1010,0xF0000010.常數表達式應用舉例:......LDR R0,[R1],#-4 ;讀取 R1 地址上的存儲器單元內容,且 R1 = R1-4針對這一段,我的疑問:1. 即常數是由一個8 位的常數循環移位偶數位得到,這句話如何理解2. 該常數必須對應8 位位圖,既然是8 位位圖,那么取值為0-255,怎么0x3FC 這種超出255 的數是合法常量呢3. 所舉例子中,合法常量和非法常量是怎么區分的 如0x3FC 合法,而0x1FE 卻非法0xF0000000,0xF0000001 都合法,而0xF0000010 又變成了非法4. 對于匯編語句 LDR R0,[R1],#-4,是先將R1 的值減4 結果存入R1,然后讀取R1 所指單元的 值到R0,還是先讀取R1 到R0,然后再將R1 減4 結果存入R1A:提示,任何常數都可用底數*2 的n 次冪 來表示.1. ARM 結構中,只有8bits 用來表示底數,因此底數必須是8 位位圖.2. 8 位位圖循環之后得到常數,并非只能是8 位.3. 0xF0000010 底數是9 位,不能表示.4. LDR R0, [R1], #-4 是后索引,即先讀,再減.可以看一看ARM 體系結構對相關尋址方式的說明.
上傳時間: 2013-11-22
上傳用戶:1109003457
ORCAD在使用的時候總會出現這樣或那樣的問題…但下這個問題比較奇怪…在ORCAD中無法輸出網表…彈出下面的錯誤….這種問題很是奇怪…Netlist Format: tango.dllDesign Name: D:\EDA_PROJECT\PROTEL99SE\YK\SV3200\MAIN.DSNERROR [NET0021] Cannot get part.[FMT0024] Ref-des not found. Possible Logical/Physical annotation conflict.[FMT0018] Errors processing intermediate file找了一天沒找到問題…終于在花了N多時間后發現問題所在…其實這個問題就是不要使用ORCAD PSPICE 庫里面的元件來畫電路圖…實際中我是用了PSPICE里面和自己制作的二種電阻和電容混合在一起…就會出現這種問題…
上傳時間: 2013-11-21
上傳用戶:zaocan888