




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、林夕依然ATmega16學(xué)習(xí)筆記例程移植到Atmel Studio 6.2筆記相信你已經(jīng)有了一定的C語言及數(shù)字電路基礎(chǔ),以及能定下心來,決心學(xué)點東西。如果做不到的話,麻煩您把我輕輕的放開,該干啥干啥去。前言最近學(xué)習(xí)AVR,網(wǎng)上找了N多資料后,發(fā)現(xiàn)就算林夕依然ATmega16學(xué)習(xí)筆記最合俺的心意。優(yōu)點如下:1、 不講原理,直接操作,適合俺這種不愿背書的差生。2、 每個例程都附有源程序及PROTEUS仿真文件,省了買零件的金錢及焊板的時間。缺點當(dāng)然也有:1、 太省事了,初學(xué)者容易只跑跑例程,不求甚解(這也是市售所有學(xué)習(xí)板的通?。?、 基于ICCAVR,而不是最新的AtmelStudio。3、 理
2、論知識太少(也算是優(yōu)點)。還有一條就是這玩意是用EXE文件打包的,初次下載時,我不敢打開,生怕會給我強裝軟件或者開個后門什么的。后來在網(wǎng)上下載了一個開發(fā)板的附帶光盤文件,發(fā)現(xiàn)里面也帶著這玩意。心想這里面不該會有問題呀,才不是太放心的打開,打開后發(fā)現(xiàn)相見恨晚呀!好吧,先把這些例程一個一個琢磨完吧。不過看程序時發(fā)現(xiàn)想打瞌睡,也難怪,看這玩意也太沒挑戰(zhàn)性了。既然我的電腦中裝了AtmelStudio,即然ICCAVR遲早要過時,不如把這里面的例程移植到AtmelStudio中吧!順便也可以學(xué)習(xí)一下編程。筆記不妨公開,俺也好刷一點成在感。本文中所有例程均在AtmelStudio6.2+Proteus7.
3、8中調(diào)試通過。本文是我個人學(xué)習(xí)時的筆記,希望后來者能少走一點彎路。學(xué)習(xí)MCU的惟一捷徑是多讀例程,多寫程序,別無他法。林夕依然ATmega16學(xué)習(xí)筆記下載鏈結(jié)如下:鏈接:/s/1eQBFb7k 密碼:mzah實驗1:8種LED點亮模式1、 移植到AtmelStudio中的步驟打開Atmel Studio 6.2,新建一個項目。不知道啥意思,我選第二個后,在下面起好項目名稱及選好項目目錄后OK。這個好辦,按CPU型號選就好了。終于進(jìn)入編輯窗口了。一言蔽之,提取包中所有.c(C源碼)、.h(C頭文件)、.dsn(PROTEUS仿真文件)文件。AtmelStud
4、io自己生成的那個.c文件要刪掉,否則你懂的。移植的時候,要把頭文件換一下,否則用不了所有的iom16v.h替換為avr/io.h所有#include 全部注釋掉。有這一句的文件中,全部增加#define BIT(x)(1 (x)當(dāng)然了,移植的時候,我們懶得逐一去改BIT,才這么將就一下。那么AtmelStudio與BIT()等價的命令是什么呢?打開sfr_defs.h文件,里面有一行:沒錯,AtmelStudio中與BIT等價的命令是_BV。再把隨項目自動生成的那個C文件(含main函數(shù)的那個)刪掉。main函數(shù)要改成int型。嗯,C99是這樣規(guī)定的,新出的標(biāo)準(zhǔn)C編譯器都得這么干,否則會有警
5、告。某個不僅僅是五百強的公司的編程規(guī)范中可是明文規(guī)定編譯時不準(zhǔn)有任何警告。按F7編譯在項目目錄中找到生成的hex文件,一般在DEBUG子目錄里,用Proteus仿真。2、Proteus仿真步驟假設(shè)已經(jīng)裝好Proteus,我裝的是7.8版本。雙擊打開包中的DSN文件。如上圖所示,雙擊CPU,彈出下框。在Program File中找到剛才編譯出來的hex文件。然后點擊OK。點擊程序左下角的三角形圖標(biāo)開始仿真我們現(xiàn)在可以愉悅的看著LED圖標(biāo)在歡快的上下滾動。3、知識點作為開山第一個實驗,知識點會多一些,我會很認(rèn)真的寫,希望你能看懂。AtmelStudio不支持直接對單個位進(jìn)行操作,若要對單個位進(jìn)行操
6、作,則要通過與或非的辦法。小知識:ICCAVR位操作的宏定義/huangbin_1985/blog/static/1344470372010259113386/C語言位操作的功能是其比較出色的地方,現(xiàn)在許多微處理器都支持C編譯器也可看出。匯編語言的位操作也很直觀,但在某些C編譯器對位操作卻不能象匯編中對單個的位進(jìn)行直接處理,而要轉(zhuǎn)化為對一個字節(jié)的操作,在ICCAVR中這種限制充分體現(xiàn)出來。如要對PORTA的PORTA0置1,則應(yīng)寫成PORTA|=0X01;這樣的位處在字節(jié)的兩端還比較直觀,但若是要置PORTA的第3位,第6位置1,則寫出的程序可讀性不強了。于
7、是便有了一些宏操作定義#define BIT(x) (1 (x)(需要包含頭文件macros.h)才可直接使用。下面給出兩種置1和清0的宏定義:置1:1,#define set(x) (1(x)2,#define setb(temp,x) temp|=(1(x)清0:1,#define clr(x) (1(x)2,#define clrb(temp,x) temp&=(1(x)比較上述置1的兩種宏定義,第1種在寫1時需寫成 PORTA|=set(x); x表示要處理的位,第2種更象函數(shù),使用起來也比較直觀:setb(PORTA,x), 可讀性比較強 但是第2種卻并非是萬能的,以MEGA8515
8、為例,USART的UBRRH和UCSRC共用一個I/O location,在寫UBRRH的時候最高位必須為0,寫UCSRC時則正好相反。上述第2種的置1和清0操作只能對1 個BIT進(jìn)行操作,所以是不能處理UBRRH和UCSRC的寫入工作的,而第1種置1和清0操作卻可以通過或/與進(jìn)行多個位操作的,比如寫入UCSRC 0x01可以寫作:UCSRC|=set(7)|set(0); 而如果用第2種宏定義則讓它太為難了。兩種方法有其利弊,使用的時候靠自己衡量了。#define checkbit(var,bit) (var&(0x01(bit) /*定義查詢位函數(shù)*/#define setbit(var,
9、bit) (var|=(0x01(bit) /*定義置位函數(shù)*/#define clrbit(var,bit) (var&=(0x01(bit) /*定義清零位函數(shù)*/#define TGLBIT(reg,bit) reg=bit /*定義取反函數(shù)*/實驗2:有源蜂鳴器驅(qū)動實驗實驗二很簡單,移植也很簡單,只要把所有#include 全部注釋掉。所有的iom16v.h替換為avr/io.h,因為沒有使用BIT(),所以不用加相應(yīng)的宏定義。main函數(shù)改為int型。程序就是這么個樣子。void bell(void) PORTD&=(1PD5); DelayMs(50); PORTD|=(1PD5)
10、; DelayMs(50);int main(void) DDRD=0XFF; PORTD=0XFF; while(1) bell(); 其實bell()可以改得更簡單一些,因為編譯器不支持端口位操作,但是PORTD只接了個蜂鳴器,所以大可以把整個PORTD取反。PORTD=PORTD;雖然說編譯器不支持端口位操作,不過我們可以犧牲點效率,用與或非的辦法實現(xiàn)端口位操作。PORTD = _BV(PD5);可能會有人問PD5是什么意思,怎么定義的?在PD5上右擊,點擊Goto Implementation,會自動跳到PD5的定義。恩,PD5=5;下面是我改動過后的bell(),每一種方法都是可行的
11、。void bell(void)/方法一、原例,不停的輸出高低電平PORTD&=(1PD5);/PD5等價于數(shù)值5,15表示把1左移五位。即000000015 = 00100000DelayMs(50);PORTD|=(1PD5);DelayMs(50);/方法二、對PORTD不停的取反PORTD=PORTD;/對整個端口取反DelayMs(50);/方法三、循環(huán)對單個端口置高低電平/編譯器不支持對端口進(jìn)行位操作,需要使用標(biāo)準(zhǔn)C語言中位操作的技巧,可以參看譚版C程序設(shè)計,位操作一章。PORTD |= _BV(PD5);/單獨把PD5置高電平。DelayMs(50);PORTD &= _BV(P
12、D5);/單獨把PD5置低電平DelayMs(50);/方法四、對單個位取反PORTD = _BV(PD5);/對單個端口進(jìn)行取反操作DelayMs(50);實驗3:按鍵掃描(用KEY選擇對應(yīng)LED點亮)繼續(xù)按實驗一的方法處理:所有#include 全部注釋掉,有這個頭文件的地方增加宏定義#define BIT(x)(1 (x)。所有的iom16v.h替換為avr/io.h。main函數(shù)改為int型。這個程序很簡單,先初始化端口,然后循環(huán)運行key_scan函數(shù)。key_scan函數(shù)掃描所有有開關(guān)的端口,如果其中有一個為低電平的話,則將對應(yīng)LED點亮,之后檢查PINA有沒有電平變化,如果有的話
13、,跳出while,然后重復(fù)上述流程。因為開關(guān)無論抖動幾次,都不會影響結(jié)果,所以不需要防抖動。實驗4:按鍵掃描+8種LED亮滅模式控制移植方法與實驗3一樣一樣的。程序是實驗3與實驗1的結(jié)合版本,很簡單。實驗5:按鍵掃描(用KEY選擇LED點亮模式)實驗6:無源蜂鳴器驅(qū)動實驗(ICC)依電腦配置及設(shè)置不同,仿真時可能會有下列警告,表示仿真時間與實際時間不符。若把兩個電阻屬性改為數(shù)字的,警告會消失,不過聲音會異常。實驗7:外部中斷INT0實驗這個實驗就麻煩多了。先按照之前的套路:所有#include 全部注釋掉,有這個頭文件的地方增加宏定義#define BIT(x)(1 (x)。所有的iom16v
14、.h替換為avr/io.h。main函數(shù)改為int型。因為main()調(diào)用了SEI(),所以要增加宏定義:#define SEI()asm(sei)AtmelStudio的中斷函數(shù)與ICCAVR不一樣,需要改,如下圖:前面還要增加一個頭文件:#include ISR表示是中斷服務(wù)函數(shù),所有中斷服務(wù)函數(shù)必須叫這個名字,INT0_vect表示INT0入口,中斷入口可以在iom16.h文件中找到(此為舉例,實際CPU不同,文件名也會不同)。正常情況下,這樣就大功告成了,實際仿真結(jié)果卻與預(yù)期值大相徑庭。預(yù)期值是程序運行后D0慢閃,按下INT0鍵后,這一組LED花樣閃爍。實際仿真結(jié)果卻是按下鍵后似乎毫無
15、反應(yīng),從邏輯分析儀上看,好像又有一點變化。我花費了好幾個小時找資料排查,毫無所獲,分析代碼也沒有發(fā)現(xiàn)任何問題,修改程序定位的結(jié)果DelayMs()好像沒有執(zhí)行。但是在main()中調(diào)用該函數(shù)卻毫無問題。DelayMs()僅僅只是一個延時N毫秒的程序,其實我們完全可以用AtmelStudio自帶的庫函數(shù)替代。在main.c與functions.c文件頭上增加如下定義及頭文件#define F_CPU 3686400UL#define _DELAY_BACKWARD_COMPATIBLE_#include F_CPU表示CPU時鐘頻率,最后的UL代表無符長整型。后面一句可以參看下面的文章:/u010173859/article/details/20285627現(xiàn)在我們可以愉快的在這兩個函數(shù)中調(diào)用_delay_ms()函數(shù)了,但是改后,結(jié)果還沒有改善。好吧,現(xiàn)在把程序復(fù)原,然后回過頭把這個程序再讀一遍,發(fā)現(xiàn)這中斷服務(wù)函數(shù)也太長了吧,長就算了,哪有中斷服務(wù)程序加這么延時的?再者說,這函數(shù)內(nèi)的變量也定義太多了吧?一個i不就得了。但是就算這樣,也不該會出這種問題吧!接著上網(wǎng)查資料,死了無數(shù)腦細(xì)胞后,發(fā)現(xiàn)原來是AtmelStudio編譯時,認(rèn)為延時函數(shù)沒有做任何操作,將其忽略掉了。解決起來也很簡單,在延時函數(shù)的變量前加入關(guān)鍵字volatile就好了。htt
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 客戶忠誠度建設(shè)中的情感價值挖掘與利用考核試卷
- 包裝設(shè)備成本控制與能源消耗管理考核試卷
- 定制海報設(shè)計印刷市場前景展望考核試卷
- 農(nóng)產(chǎn)品加工質(zhì)量安全管理技術(shù)考核試卷
- 情緒智力培養(yǎng)與兒童社會性發(fā)展研究考核試卷
- 公司員工月工作總結(jié)15篇
- 個人挖機轉(zhuǎn)讓合同
- 婚姻協(xié)議約定
- 與眾不同的升學(xué)宴致辭
- 消防主題班會課件
- 廣告法法律培訓(xùn)課件
- 肢體離斷傷的護(hù)理
- 電子審圖系統(tǒng)行業(yè)深度研究分析報告(2024-2030版)
- 彩繪臉部兒童課件
- 小學(xué)出入庫管理制度
- 員工帶小孩管理制度
- 2025年中國高壓電源供應(yīng)器行業(yè)市場調(diào)查、投資前景及策略咨詢報告
- 2024年中國黑龍江省農(nóng)藥市場調(diào)查報告
- 衛(wèi)生法律法規(guī)典型案例解析
- 注塑廠薪資管理制度
- 2025-2030年中國黑膠唱片行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
評論
0/150
提交評論