首先講講題目的由來吧。我做的東西原本是利用ARDUINO MEGA2560及各種模塊搭建起來的,程序自然也是用ARDUINO IDE寫的。但這種東拼西湊的產(chǎn)品自然不夠好,更主要的是,之前ARDUINO板的電源燒掉了,我看了下原理圖,當(dāng)電腦USB電源和12V電源都接上時,USB5V和12V轉(zhuǎn)的5V并聯(lián)了,以此來提供大電流,但是我上網(wǎng)查了下,兩個相同電壓的電源并聯(lián)其實是很容易出問題的,電流的分配關(guān)系并沒有想象的那么聽話是均分的,而是和電源的內(nèi)阻有關(guān),很容易燒電源,于是想著自己參考著開源原理圖設(shè)計了一塊電路板,修改了電源方案并把所有元件都放在一塊板上,并修改固件(即之前說的程序)后燒進(jìn)單片機中。說到這里,有必要闡述一下AVR與ARDUINO的關(guān)系。
ARDUINO是以ATMEL公司的AVR單片機為主控芯片的開源硬件,同時它還有自己的開發(fā)環(huán)境ARDUINO IDE。那么ARDUINO板是怎么利用AVR單片機搭建起來的呢?比如ARDUINO MEGA2560就是以AT MEGA2560 為主控芯片搭建起來的。ARDUINO把AVR單片機的部分通用I/O口挑出來,給他重新賦予名字:如maga2560 中PD0對應(yīng)ARDUINO板上的digital 21(PWM和COMMUNICATION 的I/O口也是DIGITAL口),PF0對應(yīng)ADC0即板子上ANALOG IN的A0.每個版本都是事先把AVR單片機的各設(shè)置都設(shè)置好了之后才出售的。每個版本的相關(guān)信息可通過ARDUINO所在文件夾下hardwarearduino下的boards.txt查看,里面記載了各版本的熔絲位設(shè)置,串口波特率設(shè)置,bootloader文件所在位置等等。在ARDUINO IDE中選擇版本時,就會把相關(guān)參數(shù)切換為這個文件里說明的參數(shù)。
?

說完I/O口,再說說ARDUINO的下載方式。AVR單片機的下載方式有ISP,JTAG仿真,高壓并行下載等。早期的ARUIDNO的下載用的還是CH340G,后來從某個版本開始就使用AT MEGA8以及16來實現(xiàn)USB轉(zhuǎn)串口了。ARDUINO MEGA2560的手冊的下載模塊原理圖如下:

BOOTLOADER就是正式程序之前的一段小程序,他在FLASH中有自己專門的存儲區(qū)(忘記叫什么了),可以根據(jù)需要實現(xiàn)各種功能,一般被用作系統(tǒng)啟動前的初始化工作。而ARDUINO就利用他實現(xiàn)了串行口下載。具體步驟見后面敘述。
下面說下我的開發(fā)過程。
一.利用PROGISP實現(xiàn)ARDUINO IDE編寫的程序的下載
由于我的micro usb焊接不上去,又不想浪費其余部分已經(jīng)焊好的板子,于是用PROGISP來下載ARDUINO IDE上寫好的程序。
ARDUINO板子正常的下載是通過USB口,在編譯器上一鍵下載的。而我們用PROGISP下載則需要編譯好的16進(jìn)制文件。導(dǎo)出ARDUINO IDE編譯好的hex文件設(shè)置如下:
打開ARDUINO IDE,F(xiàn)ile->preferences,點那個C盤的路徑,用記事本打開preferences.txt

?
關(guān)閉ARDUINO IDE(非常重要?。?/p>
用記事本打開preferences.txt后,選擇hex文件存放的路徑,在最后行加入 build.path=D:arduinoMyHexDir。這個路徑自己選擇。關(guān)閉文件。
驗證是否成功,如果沒有成功,很可能是修改文件時ARDUINO沒有關(guān)閉,此時重新打開文件,會發(fā)現(xiàn)那段語句并沒有加入到文中。
成功后,目錄里能找到編譯好的HEX文件。
接下來就是AVR單片機的一些需要設(shè)置的地方了,談下我的經(jīng)歷以及需要注意的東西:熔絲位。這是我第一次接觸AVR單片機,很多地方都不懂,之前一直以為直接用CH340G就可以實現(xiàn)下載了,后來發(fā)現(xiàn)并不是這樣。首先AVR的熔絲位就是一個很獨特的東西,它決定了時鐘選擇,系統(tǒng)時鐘分頻,啟動時從哪個地址開始執(zhí)行程序,各種使能等等。AVR出廠時默認(rèn)的是使用內(nèi)部的RC振蕩電路,我的板子上用的是外部的16M晶振,所以需要修改熔絲位來選擇外部晶振作為時鐘電路。而熔絲位是需要用ISP來下載的,所以第二版PCB我增加了ISP的下載口,并在網(wǎng)上買了兩個usb isp下載器,無奈的是,把下載器插到電腦上后,電腦竟然沒發(fā)現(xiàn)新硬件,在設(shè)備管理器里也沒有找到。好在賣家負(fù)責(zé),給我發(fā)了個免驅(qū)動的燒錄軟件,見下圖。
?

?
這個軟件對熔絲位的燒寫有向?qū)J?,非常方便,不用去查熔絲位各個位的意義,大大便利了熔絲位的設(shè)置。利用這個軟件,我成功的實現(xiàn)了熔絲位的修改和程序的燒錄(別忘了第一步永遠(yuǎn)是先選擇芯片型號)。當(dāng)然中間也有一些小插曲。比如說熔絲位中我選擇了“系統(tǒng)時鐘8分頻”,導(dǎo)致實際時鐘只有晶振值的八分之一,又如我明明沒用BOOTLOADER,卻選擇了“將復(fù)位向量移至BOOT區(qū)起始地址”,導(dǎo)致單片機沒有執(zhí)行我的程序。其中主要的問題是單片機時鐘選擇的問題,這里需要重點強調(diào)一下:“RC振蕩器”指的是利用電路和電容電路組成的時鐘電路,“外部時鐘”指的是一種有源晶振而不是我們平時所見的細(xì)長的無源晶振,“外部低頻晶振”就是頻率很低的無源晶振,“外部滿幅晶振”我不懂,看有些地方寫的它對應(yīng)的幾個熔絲位的值是外部RC振蕩電路,總之不用他就對了,而“外部低功率晶振”則是我們常用的外接的無源晶振加起振電容組成的時鐘電路,它對應(yīng)的CKSEL3:0=1000~1111?,F(xiàn)在,熔絲位的設(shè)置就完成了。
?
接下來看燒入程序,點“調(diào)入FLASH”,設(shè)置好其他的選項后,點“自動”就可完成所有操作。這里順便說下FLASH和EEPROM的區(qū)別,F(xiàn)LASH容量很大,一般程序就裝在里面。而EEPROM的容量較小,對MEGA2560,它只有4K的大小,多用于非易失性的數(shù)據(jù)存儲器。至此,你已經(jīng)成功的完成了用PROGISP下載ARDUINO IDE編好的程序到AVR里。
現(xiàn)在說下我在開發(fā)的過程中遇到的一個很有趣的現(xiàn)象。當(dāng)我全部設(shè)置好熔絲位后,我立即用示波器觀察了下晶振的起振情況,得到的卻是下面的結(jié)果:
電壓大概是1V,有輕微的紋波。于是我判斷晶振依然沒有起振。后來又是重焊時鐘電路,始終沒有解決問題。最后我抱著試一試的態(tài)度寫了個LED閃爍的程序,并把時鐘改成內(nèi)部RC振蕩電路,測試了下輸出,發(fā)現(xiàn)有輸出,只不過頻率不對,并且實際頻率是理論頻率的八分之一,我突然想到之前的“系統(tǒng)時鐘8分頻”,于是我把這個選項去掉了,果然,輸出正常了。緊接著,我把時鐘切換為外部晶振,又測了一下輸出,輸出正常!接著重新測了下晶振,波形依然是一條橫線!得出結(jié)論:AVR與C51不同,晶振起振后并沒有明顯的正弦波波形。當(dāng)設(shè)置為內(nèi)部RC振蕩電路時,晶振的引腳電平為0V;當(dāng)設(shè)置為外部晶振時,晶振的一只引腳電壓為1V,另一只電壓為0.7V,沒有正弦波形。
二.利用ARDUINO IDE實現(xiàn)AVR單片機的下載
上一種下載方法是AVR的下載方式,而這里提到的下載方法就是ARDUINO的下載方式。前面說過,要想用ARDUINO的正常下載方式,就要先用ISP下載器燒錄相應(yīng)的BOOTLOADER,然后禁止ISP下載,之后都用串口方式下載程序。
在你的串口芯片好使以及焊接等都沒問題的情況下,把電腦和板子用AVR ISP連好,在ARDUINO里的TOOLS->Board上選擇好板子型號后,再在programmer里選擇AVR ISP,最后點Burn Bootloader。成功后,你就可以用ARDUINO正常的下載方式實現(xiàn)下載啦。如果你怕以后BOOTLOADER損壞,那么干脆用PROGISP禁止ISP下載。
電子發(fā)燒友App










評論