




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
嵌入式MCU應用舉例一.預備知識:
預處理命令#pragma介紹一些常用的#pragma命令的擴展功能。1.用于SB相對地址預處理命令:#pragmaSBDATA變量名對變量進行聲明,訪問該變量時NC30會生成AS30偽指令“.SBSYM”,并使用SB相對尋址模式。這樣可以生成高效的ROM代碼,下圖是“#pragmaSBDATA”命令的圖形說明。2.生成位操作指令NC30允許用戶以位為單位處理數據。設置一個位段來實現位操作,位段利用結構體定義符號,其格式如下:stucttag{類型說明符號位符號:比特數};引用一個位符號時,用點“.”分割開:變量名.位符號指定該位的方法和對結構體的處理相同。位段在存儲器中的位置的分配與編譯器有關。NC30對位段分配存儲區時有兩條規則:從LSB開始順次分配另一種類型的數據放到下一個地址下圖是如何對位段分配存儲區的例子:設定位段后,雖然已可以在程序中處理位符號,但生成的是一條運算、邏輯指令,并不是位指令,若使用擴展功能“#pragmaBIT”對位段進行聲明,則可以生成代碼效率更高的“直接位操作指令”下圖示出了一個例子,說明了如何寫這條預處理命令及其展開情況的。除了用“#pragmaBIT”聲明的數據外,對下面的變量NC30編譯器也可以生成直接位操作指令:用“pragmaSBDATA”聲明的變量用“pragmaADDRESS”聲明的變量,且其地址位于絕對地址00000到01FFF內用‘-fbit’指定的近程變量。3.I/O接口的控制在控制內置I/O接口時,需指定變量的絕對地址。在NC30中可以使用擴展功能“#pragmaADDRESS”來指定變量的絕對地址,其格式如下:#pragmaADDRESS變量名絕對地址注意只對函數外定義的變量和在函數內定義的靜態變量有效。擴展功能“#pragmaADDRESS”也可以用來設置SFR區。使用這種方法設置SFR時,一般準備一個獨立的文件,并將其包含在源程序中。下圖是一個SFR區定義文件的例子二.I/O口控制1.LED特性LED是發光二極管的簡稱,它通過一定的電流發光,LED有極性2.LED的電路連接在M16C/62C學習板上,將電阻和LED分別接在M30620FCAFP的p7口上,如下圖所示:當端口輸出為“L”時,LED亮燈,端口輸出為“H”時,LED燈滅。3.LED亮燈程序(2)編寫使LED1和LED2交錯亮的程序編寫順序如下:1.源文件的準備啟動程序和向量文件按照原來的使用,僅做成控制I/O的主程序。(1).在硬盤里做新的文件夾,文件夾名采用集成開發環境TM的項目名,此處用”sampleA”(2).對于sampleA.c”,采用編譯程序用合乎規則的內容編寫。2.編譯用集成開發環境TM做成項目,并進行編譯,做成在調試器(kd30)上的可運行的文件(sampleA.x30)以及用閃存寫入器寫入閃存的文件(sampleA.mot)3.調試用調試程序確認其操作。4.將程序固化到ROM控制程序清單如下:#pragmaADDRESSP73edh/*定義P7口的地址*/#pragmaADDRESSPD73efhvoid_main(void)unsignedcharP7,PD7;/*在p7方向寄存器和數據器里裝入值作為變量*//*宏定義*/#defineLED_off/*LED1,2燈滅*/#defineLED1_on/*LED1燈亮,LED2燈滅*/#defineLED2_on/*LED1燈滅,LED2燈亮*/main(){unsignedlongi;P7=LED_off;/*p7口輸出H,燈滅*/PD7=0Xff;/*p7口方向輸出*/for(;;){P7=LED1_on;/*LED1燈亮*/
for(i=0x8ffff;;)/*等待(軟等待)*/{i--;if(i==0)break;}P7=LED2_on;/*LED2燈亮*/for(i=0x8ffff;;)/*軟等待*/{i--;If(i==0)break;}}}三. C語言和匯編語言混合編程Nc30編譯器允許使用c語言和匯編語言進行混合編程。在c語言程序中,可以進行直接插入匯編語言來編寫程序,也可以用調用匯編語言編寫的子程序的方式來進行。反之,在匯編語言的程序中,也可以調用C語言所寫的函數。1直接插入匯編語言方式在C語言編程中,對與一些硬件有關的操作,如直接改寫C標志,用C語言則有些不方便,這時可以有兩種方法解決這個問題,一個是使用“asm”功能,另一個是使用“#pragmaASM”功能(1)使用“asm”功能當在某一行寫入asm時,可以把雙引號中的字符串按匯編語言看待插入匯編程序,通常這用來直接改變標志和寄存器的值或一些要求高速處理的語句。當要訪問的是一個函數內部的自動變量時,寫入一個使用“$$FB”的語句,編譯器會自動識別$$,用FB寄存器的偏移值來取代它,C語言中的自動變量名可以用于匯編語言程序。(2).使用“#pragmaASM”功能如果嵌入的匯編語言包含多行,這時可以使用“#pragmaASM”功能,NC30編譯器能識別位于“#pragmaASM”和“pragmaENDASM”之間的程序段,直接插入編譯后的匯編語言在源程序中,見下例:2調用匯編子程序Nc30編譯器允許在C語言程序中調用匯編語言子程序。首先說明一下的是nc30編譯器在調用一個函數時所作的處理,這時要進行三項操作:建造及釋放堆棧幀傳送參數值傳送返回值下圖是一個C語言程序執行時堆棧幀的建造過程:NC30編譯器有兩種方法傳遞函數的參數值,一種是“通過寄存器”,另一種是通過堆棧。參數傳遞遵守的規則如下表函數的返回值(結構體和共用體除外)都在寄存器中,數據類型不同,存儲的寄存器也不同,見下表:若返回值用結構體和共用體描述時,則通過存儲地址和堆棧傳送參數值。也就是說在調用該函數時,先開一個存儲區,將其地址作為一個隱型參數存入堆棧。被調用函數把返回值寫到這個區,從該函數返回時可根據此地址取得返回值。在nc30編譯器中,C程序中的函數名和匯編程序名之間的關系隨函數的性質而定,下表示出了函數轉換成匯編程序中符號的規則:下面說明如何在C程序中調用一個匯編子程序。在C程序中寫入一行預處理命令來規定參數傳遞方式。#pragmaPARAMETER函數名(寄存器名,…)這種調用方式較為簡單,但要注意:1.在寫入“#pragmaPARAMETER”時,確認已對函數做了聲明。
2.看一下函數聲明中:函數參數值應該是8位或16位整數或16位指針。返回值不能用結構體或共用體。寄存器個數和參數個數應匹配。寄存器名不區分大小寫。由#pragma指定的函數體如C程序中已定義過會導致出錯。匯編程序應該按照下列規則編寫:1.匯編子程序寫成一個單獨的文件2.子程序名應遵守符號轉換的規則3.在c程序中對調用的子程序已做了原型聲明。下圖是一個使用“#pragmaPARAMETER”的一個例子,這個程序的功能是用LED顯示加計數的結果,LED顯示部分是用匯編語言寫的。另一種方法是使用間接尋址方式調用匯編子程序的,注意,在使用函數指針用寄存器進行參數傳遞的場合,不要用“#pragramPARAMETER”來規定。使用存儲類型說明符“extern”聲明函數為外部參考。下圖是使用間接尋址調用匯編子程序的一個例子,按照參數mode的值,選擇進行“加”計數器或“減”計數器。3匯編程序調用c語言程序在匯編程序中調用C語言的函數時,應符合下面的規則:1.前述的符號轉換規則;2.C語言函數構成一個單獨的文件;3.在匯編語言文件中,用“.glb”偽指令說明C語言函數為外部過程。下圖示出了匯編程序中調用C語言函數的情況:四.中斷程序所謂中斷是CPU相應請求停止正在執行的任務去處理其它的任務,處理完后,又恢復進行原來的操作。在M16C/62中,有根據外部端子或內部時鐘電路等產生中斷的方法和在程序中執行命令而產生中斷的方法。1.M16C/62的中斷M16C/62有很多中斷方式,本課程主要學習是二種:一種是根據I/0中的INT0或INT1從外部端子進行的中斷,另一種是使用定時器進行的時間中斷。2. 使用中斷的必要處理用程序進行中斷時有必要進行下面的處理:中斷函數的處理;允許中斷;中斷向量的設定;(1).中斷函數中斷函數是用來記述中斷時執行處理的函數。中斷函數用#pragmaINTERRUPT函數名來聲明中斷函數用來中斷原來程序的進程,所以要將不想置換的寄存器在中斷前進行保存,中斷后返回,中斷函數結束后要進行返回原來的操作(2).允許中斷允許中斷需要具備以下的條件:根據I標志(中斷禁止標志)確定是否允許中斷,是否允許全部的屏蔽中斷。根據每個中斷源優先級的設定,確定是否允許中斷。只允許符合條件的中斷源進行中斷,中斷優先級分為1-7級,數值大的,優先級高。(3)中斷向量的設定中斷向量是預先存放的中斷函數的起始地址。中斷函數與其它函數不同,它不是受另外函數調用而執行的。中斷函數是相應中斷請求時,根據存放著中斷向量的地址開始執行程序操作的。3.來自INT0口的中斷(1)控制INT0中斷的寄存器如圖:(2)規定。程序啟動時LED1-LED8等滅,按下INT0開關時LED1-LED8燈亮。(3)方法。main程序:使LED燈滅,建立中斷等待的無限循環語句。中斷程序:使用LED燈滅,從中斷返回。(4)文件的分配啟動程序:nctro.a30+sect30.inc主程序文件:rei3.c+m16io.h(5)文件的更改設定sect30.inc中斷向量的地址將中斷程序記敘到主程序中(6)程序清單文件名為sect30.a30的程序清單如下:程序文件名為rei3.c程序清單:4.定時器中斷M16C/62學習板內置有11個16位定時器,按功能可分為定時器A(5個)定時器B(6個)兩種,這些定時器有各種不同的功能。下面以定時器A0為例。(1)定時器A0相關的寄存器如下圖:(2)設定內容計數源f32( 主時鐘進行32分頻的時鐘)若做1秒的計數,則要選用周期最大的計數源無脈沖輸出無門功能(3)規定。用二進制數將LED1-LED8用于每1秒的累加計數。(4)方法。使用定時器A0做計數源,要做1s的計數,計算一個周期需要2us,則需要計數1s/2us=500000次,因為是16位計數器,不能設定為500000次,若取1s=100ms×10次100ms=2us×50000次這樣加入100ms的中斷,只需進行10次計數即可(5)文件的分配啟動程序:ncrt0.a30+0-sec30.inc主程序文件:rec3.c+m16io.h(6)文件的更改設定sect30.inc的中斷向量的地址將中斷程序記錄在主程序中。#include“m16io.h”#definePORTIN0x00#definePORTOUT0xff#defineLED_OFF0xff#defineLED_ON0x00#defineCNT_TA05000-1#defineCNTIS_TAO10voidportinit(void);voidtimerinit(void);voidta0int();#pragmaINTERRUPTta0intcharta0flag;intcnt1scharledcnt;voidmain(){ cnt1s=CNT1S_TAO;ledcnt=0x00;portint();timerinit();_asm(“\tFSETI”);while(1);}voidta0int(){cnt1s--;if(cnt1s==0){ledcnt++;port_7=ledcnt^0xff;cnt1s=CNT1S_TA0;}ta0=CNT_TA0;}voidtimerinit(void){ udf=0x00; ta0mr=0x80; ta0=CNT_TA0; ta0ic=0x06; tabsr=0x01;}voidport(void){ 同前}五.LCD模塊的控制LCD模塊是在LCD顯示器里預先裝入用于顯示的部件。在M16C/62學習板上的LCD板上的sc1602bs被廣泛的應用。1.LCD模塊的構成當將數據寫入LCD時,在LCD模塊內對應的文字顯示位置的存儲器也被寫入。只要不改寫,根據內部LCD控制器的控制,就將自動地繼續顯示。2.LCD模塊的初始設定LCD模塊在電源接通后,要進行一系列的初始化設定,其設定步驟如下:將復位的操作以8位方式進行3次,如下圖所示:此時LCD模塊接受8位信息,M16C/62學習板的LCD的低4位接地。傳輸“0”數據,根據3次操作送出的功能模塊,LCD模塊處于取8位數據的受信狀態。用4位傳輸數據的初始化如下圖所示:3.控制LCD模塊的函數(1)等待函數LCD板的控制中,要求等待的時間有三種:15ms,4.1ms,0.1ms。voidwait_ms(intk){ unsignedshortwi,wj; for(wi=0;wi<15*k;wi++) for(wj=0;wj<306;wj++) ;}
(2).8位命令輸出函數初始設定的開始不能用四位命令傳輸數據,為此要制作用8位傳輸數據的函數,如下圖所示:(3)用4位模式傳輸命令的函數命令數據采用8位無意義,4位傳輸需要分高4位,低4位二次傳輸。用4位模式傳輸命令的函數制作,如下圖所示:(4)用4位傳輸數據的函數在傳輸命令和數據時,RS的值會發生改變,為此,作出與傳輸命令不同的函數,如下圖所示:(5)BUSY校驗函數LCD模塊在前一寫入過程未結束時,后一數據不能送入。寫入過程中LCD模塊的BUSY標志為“1”,只有在BUSY標志為“0”時才能進行后一數據的寫入。為此,要制作讀出的BUSY標志的函數。如下圖所示;其流程和清單如下:(6)LCD模塊初始設定的函數在LCD模塊內時按照確定的規格來設定的,在下面的清單上加以說明。六.A/D和D/A轉換A/D轉換A/D轉換器由一個電容耦合放大器的10位逐位逼近A/D轉換電路構成。P100到P107為8個A/D輸入引腳,用A/D控制寄存器0的位2,位1和位0選擇其中的一個進行A/D轉換。P95和P96也可以用作模擬信號輸入端。用作A/D轉換的I/O口的方向寄存器必須設為輸入。原理框圖如下:A/D轉換可以用軟件啟動,也可以用外部信號觸發產生。A/D轉換的工作時鐘ФAD在電源為5V時有三種:FAD,FAD/2,FAD/4.在電源為3V時有FAD/2,FAD/4.FAD為CPU的主時鐘f(XIN)。A/D轉換的結果存在所選引腳的A/D寄存器中。共有8路A/D輸入,每路有兩個8位寄存器存放A/D轉換結果。它們的地址為03C0H-03CFH.當設為10位分辨率時,低8位存在偶地址中,高2位存在奇地址中。當設為8位分辨率時,8位存在偶地址中。A/D轉換有5種工作方式,由A/D控制寄存器0的位4和位3選擇。單次模式
對某個指定的引腳進行A/D轉換,只做一次。重復模式對某個指定的引腳進行A/D轉換,重復多次單次掃描模式對兩個或更多的引腳進行A/D轉換,逐個轉換一次重復掃描模式0對兩個或更多的引腳進行A/D轉換,重復輪流進行轉換。重復掃描模式1與重復掃描模式0不同是掃描時可以指定一些輸入引腳進行重點轉換。1.單次模式在單次模式中,對模擬輸入端選擇位選出的引腳進行單次A/D轉換。下表為單次模式的性能說明。下圖為用軟件觸發啟動A/D轉換的單次模式工作時序圖當A/D轉換開始標志設置為“1”,A/D轉換開始工作。在A/D轉換完成后,把逐次比較寄存器的內容(轉換結果)存到A/D寄存器。此時A/D轉換中斷請求變為“1”。A/D轉換啟動標志變為“0”,A/D轉換停止。下面圖示描述轉換過程:2.重復模式在重復模式中,對模擬輸入端選擇位選出的引腳重復進行A/D轉換。下表為重復模式的性能說明:3.單次掃描模式在單次掃描模式中,用A/D掃描引腳選擇位依次做A/D轉換的引腳。下表為單次掃描模式的性能說明:4.重復掃描模式有兩種重復掃描模式:重復掃描模式0和重復掃描模式1。在重復掃描模式0中,用A/D掃描引腳選擇位選出的用作重復掃描A/D轉換的引腳。重復掃描模式1在重復掃描模式1中,對所有引腳作重復掃描A/D轉換,重點是用A/D掃描引腳選擇位選出的引腳。5.A/D轉換注意事項:(1)對A/D控制寄存器0(位6除外)和1的各位及A/D控制寄存器2位0的寫操作,應在A/D轉換停止時進行。特別是VREF連接位從“0”變到“1”,要經過1us或更長的一段時間,再啟動A/D轉換。(2)為了減小噪聲對A/D轉換的影響,最好單用一個電源加到AVcc和VREF引腳。AVss和AVcc引腳之間,AVss和VREF引腳之間要接一個電容。AVss引腳和模擬輸入端之間最好也接一個電容。A/D轉換精度(1)10位模式和8位模式A/D轉換有10位和8位模式使用10位模式時,A/D轉換的輸出為10位,理論上A/D轉換特性如下圖。這時加到比較器的電壓Vref的值與逐次比較寄存器內容n的關系為:Vref=VREF/1024×n-VREF/2048式中VREF是A/D轉換的基準電壓。A/D轉換過程如下:①轉換開始時把逐次比較寄存器的內容清零,把第9位置置“1”,把由逐次比較寄存器產生的比較電壓Vref與模擬輸入端的電壓VIN進行比較如果Vref<VIN則把逐次比較寄存器的位9置“1”如果Vref>VIN則把逐次比較寄存器的位9置“0”轉換精度:A/D轉換的精度在10位模式時為有取樣保持功能:AN0到AN7輸入:±3LSBANEX0和ANEX1輸入(包括有外接運算放大器的模式):±7LSB
無取樣保持功能:±3LSB在8位模式時為:有取樣保持功能:±2LSB無取樣保持功能:±3LSB6.D/A轉換器它是一個8位R-2R型的D/A轉換器。片內含有兩個獨立的這種D/A轉換器。D/A轉換在寫入一個值到相應的D/A轉換寄存器時發生。兩個D/A轉換寄存器的地址分別為03D8H和03DAH。由D/A控制器的位0和位1決定轉換結果是否輸出。D/A轉換輸出端DA0,DA1與P93,P94引腳共用,這些端口用作D/A轉換時,不要把該端口設成輸出,不要接通相應端口的上拉。輸出模擬電壓(v)由D/A轉換寄存器中的設置值(n:十進制)決定。V=VREF×n/256(VREF為參考電壓)下表列出了D/A轉換器的性能下圖為D/A轉換器的方框圖下圖為D/A控制寄存器的組成下表為D/A轉換寄存器的組成下圖為D/A轉換器的等效電路下面我們舉一個在多媒體應用中,有關A/D和D/A轉換器的應用實例。首先我們必須了解下面的知識:在單片機的多媒體應用中,需要對聲光等模擬信號進行采集和處理。M16C/62單片機內部置有多路10位A/D轉換器和2個D/A轉換器,和適合這方面的應用。首先我們對語音信號進行采集,大概需要8K的采樣率,這樣才能使語音更接近真實,從而能夠對信號進行識別和分類。采集的語音信號經過低噪聲放大器放大到足夠的幅度后,才加到A/D輸入端。下面是語音信號采集電路圖,其中語音信號經過放大處理后,接到單片機的A/D輸入端AN0,每按一次鍵采集一段語音,存到RAM中。在上圖中,按鍵接在INT0端,工作在中斷方式,每次按鍵啟動一次DMA過程,把采集到的語音數據存到外部RAM中從D0000H地址開始的單元。本例中我們采樣個數為32K字節。
程序流程圖和信號采集程序清單如下所示:/*
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025【技術咨詢合同(含技術指導、技術評估)】技術服務合同
- 采購合同協議書范本(3篇)
- 充電樁epc合同標準文本
- 二零二五版聯合創始人協議書入股分紅協議書
- 親子道德合同樣本
- 地產項目合作開發合同
- 二零二五版幼兒園教師招聘合同
- 勞動關系轉移三方協議書
- 認識鐘表教學設計
- 招投標聯合體協議書
- 新申請艾滋病篩查實驗室驗收指南
- 倉儲設備操作安全操作培訓
- 上海電機學院計算機C語言專升本題庫及答案
- 幼兒園公開課:大班語言《相反國》課件(優化版)
- 2023年寧波房地產市場年度報告
- 員工身心健康情況排查表
- 模擬小法庭劇本-校園欺凌
- 危險化學品經營企業安全評價細則
- 哈利波特與死亡圣器下雙語電影臺詞
- 10以內數字的分解和組成
- 課堂教學技能講座課件匯編
評論
0/150
提交評論