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