前言:
最近由于開始設(shè)計無刷直流電機電子調(diào)速器,參考網(wǎng)上的一些資料,選用了Atmega8A-AU單片機作為主控芯片。
該芯片采用8位結(jié)構(gòu),最高主頻16MHz(內(nèi)部振蕩器則8MHz),可實現(xiàn)2.7V-5.5V供電,單個IO口最大可支持40mA的拉/灌電流,更難能可貴的是,價格十分便宜,我在淘寶上面購買才3塊多一片。
之前從未使用過AVR系列的單片機,于是一開始編程也遇到了一些障礙,直至最終編寫好第一個程序,整個過程在此記錄下來,供以后參考。
一、下載器
首先我在百度上和阿莫論壇里面查詢了一下AVR單片機的下載器,然后又在淘寶上面搜索對應(yīng)的型號,發(fā)現(xiàn)目前國內(nèi)主流的是ISP串口下載器,也就是和51單片機的下載器原理一樣。于是乎在淘寶上面花了不到10塊錢購買了一個,鏈接如下:
http://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-5310596272.60.cLIhnZ&id=9726069282
準確的說這只是一個燒錄器,不具備在線調(diào)試功能,只能把寫好的程序燒錄進單片機。
二、代碼開發(fā)環(huán)境
一開始我在網(wǎng)上搜索的時候,發(fā)現(xiàn)AVR單片機的開發(fā)環(huán)境琳瑯滿目,比如ICC-AVR,AVR GCC,IAR For AVR,AVR Studio,Atmel Studio......
按照以往的經(jīng)驗,IAR支持的型號比較多,用的也比較多,于是我先在網(wǎng)上下載了一個IAR For AVR,后來在網(wǎng)上查詢相關(guān)源代碼,發(fā)現(xiàn)很少有基于IAR的,另外IAR還需要激活,搞了半天也沒搞好,于是乎又卸載了。
后來再查詢的時候,發(fā)現(xiàn)Atmel公司官方的開發(fā)環(huán)境Atmel Studio是免費的,而且同時用的人也不少,于是乎我又下載了一個Atmel Studio。安裝好后,發(fā)現(xiàn)界面非常友好現(xiàn)代,不像IAR那樣古老,后來又了解到這個開發(fā)環(huán)境是基于VisualStudio開發(fā)的,因此界面與VisualStudio非常相似,于是好感度一下就上升了。
Atmel Studio開發(fā)界面?
進入軟件界面后的第一個問題是,如何創(chuàng)建第一個工程:
這個難不倒我,一般就是File->New->New Project,但是問題來了,一開始我建立工程,選擇工程類型的時候,發(fā)現(xiàn)可供選擇的對象和網(wǎng)上的不一樣,少了好多,于是乎我又重新在官網(wǎng)上面下載了最新的版本,終于出現(xiàn)了網(wǎng)上所述的選項:
如上圖所示,選擇GCC C Executable Project即可,然后是選擇器件,選擇我們的Atmega8A即可。
點擊OK后,熟悉的main函數(shù)驟然出現(xiàn)在屏幕上,AtmelStudio已經(jīng)幫你把前期的繁瑣工作都做好了,包括頭文件的引用,頭文件只有一個#include ,所有AVR單片機都引用同一個頭文件,其余開發(fā)環(huán)境會自動處理。
下一步是如何編寫中斷程序,這個是參考百度文庫的《AtmelStudio-6.0簡易入門教程(精煉實用)》:
在AS6中,需加載頭文件#include ,并且函數(shù)名為ISR,不可自定義函數(shù)名,格式如下:
ISR( TIMER0_OVF_vect ) {?} TIMER0_OVF_vect 含義同iv_TIMER0_OVF,是T0溢出中斷號。不同型號mcu的中斷向量號的名稱不同,A6的中斷向量號請從avr/iomXXX.h中查找。
有幾個事情需要備注一下:1、中斷函數(shù)不需要清除中斷標志位,這個過程是由硬件實現(xiàn)的。2、中斷使能有兩個,一個是全局的asm("sei");//開啟全局中斷,一個是每個中斷各自的寄存器使能位。
三、程序的下載
程序下載不是在AtmelStudio里面實現(xiàn)的,因為我們使用的不是Atmel官方的調(diào)試器,因此AtmelStudio在開發(fā)過程中起到的作用是將C語言或匯編源代碼編譯鏈接成bin二進制文件,然后使用第三方下載軟件通過網(wǎng)上購買的ISP下載器將二進制文件下載進去。在這里,我使用淘寶上購買的下載器店家推薦的下載軟件-progisp1.72 ,這是由智峰工作室開發(fā)的。使用了一段時間,發(fā)現(xiàn)挺好用的,沒發(fā)現(xiàn)什么BUG。
這里有一個東西需要備注一下,就是熔絲位的問題,之前用的單片機從未有過熔絲位的概念,在網(wǎng)上搜索了一番,發(fā)現(xiàn)所謂熔絲位其實就相當于系統(tǒng)寄存器的功能,熔絲位中存儲著系統(tǒng)最關(guān)鍵的設(shè)置,比如時鐘來源選擇,時鐘頻率選擇等等,只不過熔絲位是與程序分開的,不受程序影響,只能由下載器直接對單片機進行讀寫,還好,progisp1.72可以完美的實現(xiàn)這一功能,并且還有向?qū)J?,免去了查詢寄存器手冊的麻煩?/p>
好像差不多了吧,就這些,有什么想到再補充。