PN的配置與GCC入門
單片機AVR的編程工具很多,有C,ASM,PASCAL,BASIC等等。除ASM由ATMEL公司免費提供外,其它大多數的工具都是需要收費的。而C編譯器更是其中收費最高的編譯器。但也有例外,那就是GCC——它不但免費而且功能也幾乎是“最強”的。所以我作為入門者,就開始學習它了!
一、 單片機編程
1、 單片機與電腦的編程有些許不同,它除一些必要地算法外,更重要的是對端口的操作。如開關量
采集、開關量控制輸出、模擬量的輸入、通訊的操作、顯示器與鍵的控制等等都需要操作端口。
2、 電腦存儲永久數據一般都在硬盤等介質中。而單片機則存放在EPROM、EEPROM、FLASH等存儲器中。
3、 通訊接口的編程對單片機來說是至關重要的,特別在工控、網絡等的應用中猶為重要。
4、 單片機的編程與電腦編程相比有諸多限制。這就要求編程者對單片機硬件有一定的了解。
二、 AVR單片機編程
1、 AVR單片的硬件:我們以ATMega 16為例為說明一下AVR單片機吧!
這是ATMEGA 16的引腳及其功能圖(來自其DataSheet)
A、 從圖中我們可以看出有4個8位端口共32個引腳,大多有雙重功能。它們分別命名為PORTA、PORTB、PORTC、PORTD。
B、 PORTA具備普通IO口功能外還有AD轉換功能,其精度可以達到10位,即采集到的ADC的值最大不超過1023(0-1023),對應外面實際電壓值的精度需要一定的簡單換算(主要看其參考電壓)。如參考電壓為2.5V,則有2.5V為1023,則其精度為2.5V/1023就是0.00244V。如參考電壓為5V,則有5V/1023也就是0.0049V。
C、 PORTB口除了基本的IO功能外,特別要提的是PB4、5、6、7的功能,它是SPI(同步串行接口),更重要的是,它可以用來下載程序。
D、 其它的暫且不說,必竟不是AVR單片機的介紹文章嘛。
2、 AVR單片機的軟件:
軟件當然是用來控控制這些接口的運作及其代表的含義的。這也是個非常大的問題,如果你一點都不懂軟件,請也找本計算機編程的書看看吧。
三、 開始AVRGCC編程吧
好了,下面我們來看一個簡單的程序吧。
圖2
執行Make All后,生成HEX文件(本例中的文件名2.HEX)。以下是它的全過程。
> "make.exe" all-------- begin --------
avr-gcc (GCC) 3.4.1 //告知avr-gcc的版本號
Copyright (C)2004 Free Software Foundation,Inc. //編譯器所屬于公司及其版權信息
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.//這是ELF文件的一些信息,ELF文件用于調試。
Size before: //轉換前的ELF文件信息
2.elf :
section size addr
.text 208 0
.data 0 8388704
.bss 0 8388704
.noinit 0 8388704
.eeprom 0 8454144
.stab 780 0
.stabstr 1469 0
Total 2457Converting to AVR Extended COFF: 2.cof//將ELF文件轉換成AVR Studio能夠接受的格式
avr-objcopy --debugging --change-section-address .data-0x800000 --change-section-address .bss-0x800000 --change-section-address .noinit-0x800000 --change-section-address .eeprom-0x810000 -O coff-ext-avr 2.elf 2.cof
Discarding local symbol outside any compilation unit: .do_copy_data_start
Discarding local symbol outside any compilation unit: .do_copy_data_loop
Discarding local symbol outside any compilation unit: .do_clear_bss_start
Discarding local symbol outside any compilation unit: .do_clear_bss_loopSize after: //轉換后的文件信息。
2.elf :
section size addr
.text 208 0
.data 0 8388704
.bss 0 8388704
.noinit 0 8388704
.eeprom 0 8454144
.stab 780 0
.stabstr 1469 0
Total 2457Errors: none //編譯過程中產生的錯誤數
-------- end -------- //編譯結束> Process Exit Code: 0 //avr-gcc結束信息,0表示正常結束
接下來用AVRISP程序將2.hex文件下載后AVR單片機中,觀看效果。
下面我們來看看avr-gcc的IDE吧。
主窗口(圖3)
這是非常標準的Windows Style窗口。當然它由于不是專為avr-gcc設計,所以對它進行設置是必不可少的!下面我就來設置它,以使它成為我們好用的工具吧。(呵呵!可千萬別小看它哦)
在設置它之前讓我們來看看,我們希望是一個怎樣的工具吧。參照其它軟件的IDE。
首先,我們得有個工程(項目)管理器,這點PN已有,不需我們去設它。
其次,得方便我們編輯源代碼,最好是有關鍵字(代碼)高度顯示,以方便我們識別它們。如果能再給我們實時的一些提示就更好了!這方便PN做得非常很好(有人說SI很好,不過我覺得每個人有每個人的習慣,不必強求)。
再次,我們得在不離開IDE的情況下,編輯C語言的makefile文件。生成我“目標代碼”(計算機中術語的話叫可執行文件),并且,下載到我們單片機中。
好了!來看看我們對它的設置吧!
1、代碼高亮設置將它設置成你習慣的模式。步驟如下:打開PN菜單Tools->Options,在Options對話框中選擇Style->Schemes,你說看到了如圖4、5、6所示的內容了。現在開始你的設置吧。
代碼高亮設置1-預編譯(圖4)
代碼高亮設置2-操作符(如+-*/括號等)(圖5)
代碼高亮設置3-數字(圖6)
別小看這點小功能啊,它能幫你找到不少編程錯誤哦(圖7)
想將代碼打印出來嗎,有幫助的!(圖8)
其它高亮設置同上請大家自已動手吧!一定要按自己的習慣哦。3、 設置PN中的菜單“新建”和工具欄圖標 ,點擊它新建文件時的文件缺省類型。我們當然希望是C類型文件啦,如下圖:
定義新建缺省的文件類型(圖9)
4、 下面開始設置的我們的avr-gcc工具菜單吧!
C語文的Make工具設定(圖10): 精心的設置可以讓你的PN,不必其它工具差哦。
5、 C語言Makefile對于初學者來說太難了,根本不知道它是干嘛的,怎么工作(說的有點夸張)及怎么編寫。幸好WinAVR提供給了我們一個非常好用的工具mfile。下面就將它集成到我們的PN中來吧!
Makefile工具在PN中的設定(圖11)(注意本工具設置為特殊設置)
Makefile的設置是將C:\WinAVR\bin下的wish84.exe、tcl84.dll、tk84.dll三個文件復制到C:\WinAVR\mfile目錄下。并用PN打開C:\WinAVR\mfile\mfile.tcl。修改成下圖所示
修改mfile.tcl為圖中選中的部分并保存(圖12)
6、 設置ISP Programmer工具
ISP串行下載器的設置(圖13)
按下F4后運行的結果(圖14)
7、 到現在,我想你對PN有了一些了解了吧。看看下面幾個圖吧!
幾個快捷鍵及其對應工具的設置(圖15)它們用著實在是方便啊
Makefile執行后的圖(圖16)
這是PN對大項目、大工程管理的超強部分了(圖17)
到此,Programmer NotePad 設置完成。
四、 Avr-gcc簡易入門
1、 對端口的操作:
A、 如果我想將PORTB端口設置為輸出口(8位),則在gcc中用如下方式
DDRB=0xFF; 注意:0xFF=0B1111 1111表示全為1,代表了輸出。如果你改上式為:
DDRB=0x01; //即0B0000 0001,則表示,你將PORTB的第0位(PB0)設置為輸出,其它PB1-7為輸入。
DDRB為AVR的端口設置寄存器。B、 從端口PORTB中讀入狀態,用如下方式:
Unsigned Char a=PINB; //讀入端口PORTB的狀態。若端口PORTB的狀態如下:
PB0為高電平 1
PB1為低電平 0
PB2為高電平 1
PB3為高電平 1
PB4為高電平 1
PB5為低電平 0
PB6為低電平 0
PB7為高電平 1則有a = 0b1001 1101 = 0x9D
C、 向端口PORTB寫狀態(設置狀態):若要裝PORTB第0位和第2位置1(高電平)。
DDRB=0;//PORTB全部為輸出。
PORTB=0x03; //0b0000 0101D、 而更多的情況,我們是要將端口的某一位改變狀態,而不是對整個端口操作。或只想知道端口的某一位的狀態如何的?那么如何來做呢?
例如:
將PB4置1,PORTB=PORTB | 0x10; //0x10=0b0001 0000
將PB4置0,PORTB=PORTB & 0xEF; //0xEF=0b1110 1111
將PB4置翻轉,PORTB=PORTB^0x10; //0x10=0001 0000
檢驗PB4的狀態,char a=PINB & 0x10; //如果PB4為1,是a>0,否則a=0
當然,上面寫法對C語言來說,簡直就是垃圾代碼了。C語言有它自己的方式,
例如:
PORTB |= 0x10;
PORTB &= 0xEF;
PORTB ^=0x10;
If (PINB & 0x10){ 你的語句; }
是否感覺到比較簡潔啊?!E、 當然avr-gcc也提供了兩個函數對操作位,如:sbi (PORTB,4); cbi (PORTB,4);分別將PB4置1和清零。
2、 變量的類型
char
unsigned char
short
unsigned short
int
unsigned int
long
unsigned long
long long
unsigned long long
float
double
void等等等等,這就請讀者自己看資料了。
3、 程序控制語句,C語言提供了非常豐富的程序流程控制語句。i. 循環語句
A、 For(;;)語句,如:
for(i=0;i<8;i++){
循環體;
} //本例循環8次。
注意!for語句是先比較后加減的。B、 While(exp)語句,如:
i=0; While(i<8){
循環體;
i++;
} //本例循環8次。也是先比較后執行循環體的。C、 Do while語句,如:
i=0;
do{
i++;
循環體;
}while(x<8);
//本例循環7次,因為它是先執行后比較的語句。因為i++在第一次比較時i已經是1了。ii. 分支語句。
A、 if語句,大名鼎鼎語句了,幾乎所有編程軟件都有它的身影。沒什么好說的。
B、 switch語句。等
好了,這些就不說下去了,因為如果你連這些都不清楚。你該做的是找本C教程吧。
4、 中斷服務控制(SIGNAL)void UART_Init(void){ //中斷初始化函數//
UART_Ready = 1;
UART_ReceivedChar = 0;
pUART_Buffer = 0;
outp(BV(RXCIE)|BV(RXEN),UCR); // 允許串行接收中斷 //
outp( (u08)UART_BAUD_SELECT, UBRR); // 設置UART波特率 //
sei(); // 打開全局中斷 //
}SIGNAL(SIG_UART_RECV){ //串口接收完成中斷服務進程(子程序)//
UART_ReceivedChar = 1; // 指示已經接收到一個字符 //
UART_RxChar = inp(UDR); // 將收到的字符存儲起來 //
}
其中SIGNAL標示了下面的語句由中斷來調用。五、 實例設計與編程
試驗電路圖(圖18)
好了,寫了這么多,讓我們也看個實例先吧,硬件電路圖如圖18。
軟件編程如下:
軟件在PN中編寫的結果如上圖。
其中第1、2行為預編譯語句,它們告訴編譯器一些重要的信息。如單片機內的寄存器名稱對應的向量等.DDRB、PORTB就在io.h內定義的(其實它在本例中是在iom16.h中定義的,io.h是所有AVR單片機公共定義,它從makefile中提取單片機類型,來從include\avr下取出對應的實際io*.h文件)。
第4行為C語言的主函數,特別要注意的是,avr-gcc的主函數類型必須為int類型。否則出現警告錯誤warning: return type of 'main' is not `int'。
第5行定義了三個無符號字符型變量:i,j,k。
第6行定義了端口PORTB全部為輸出。
第7行在端口PORTB中輸出高電平。
第8行到第18行為一個無限循環語句。
第9行開始到第17行也是一個循環。用它的目的是將端口PORTB的某一位置低,讓LED點亮。
第10行是向端口的某一位(由變量k指定),其中十分重要的是 ~(1<
第11行到第15行由兩個for循環構成的延時部分,它可以使LED移動的速度放慢,好讓我們的肉眼能看到。
評論