首先講講題目的由來(lái)吧。我做的東西原本是利用ARDUINO MEGA2560及各種模塊搭建起來(lái)的,程序自然也是用ARDUINO IDE寫的。但這種東拼西湊的產(chǎn)品自然不夠好,更主要的是,之前ARDUINO板的電源燒掉了,我看了下原理圖,當(dāng)電腦USB電源和12V電源都接上時(shí),USB5V和12V轉(zhuǎn)的5V并聯(lián)了,以此來(lái)提供大電流,但是我上網(wǎng)查了下,兩個(gè)相同電壓的電源并聯(lián)其實(shí)是很容易出問(wèn)題的,電流的分配關(guān)系并沒(méi)有想象的那么聽(tīng)話是均分的,而是和電源的內(nèi)阻有關(guān),很容易燒電源,于是想著自己參考著開(kāi)源原理圖設(shè)計(jì)了一塊電路板,修改了電源方案并把所有元件都放在一塊板上,并修改固件(即之前說(shuō)的程序)后燒進(jìn)單片機(jī)中。說(shuō)到這里,有必要闡述一下AVR與ARDUINO的關(guān)系。
ARDUINO是以ATMEL公司的AVR單片機(jī)為主控芯片的開(kāi)源硬件,同時(shí)它還有自己的開(kāi)發(fā)環(huán)境ARDUINO IDE。那么ARDUINO板是怎么利用AVR單片機(jī)搭建起來(lái)的呢?比如ARDUINO MEGA2560就是以AT MEGA2560 為主控芯片搭建起來(lái)的。ARDUINO把AVR單片機(jī)的部分通用I/O口挑出來(lái),給他重新賦予名字:如maga2560 中PD0對(duì)應(yīng)ARDUINO板上的digital 21(PWM和COMMUNICATION 的I/O口也是DIGITAL口),PF0對(duì)應(yīng)ADC0即板子上ANALOG IN的A0.每個(gè)版本都是事先把AVR單片機(jī)的各設(shè)置都設(shè)置好了之后才出售的。每個(gè)版本的相關(guān)信息可通過(guò)ARDUINO所在文件夾下hardwarearduino下的boards.txt查看,里面記載了各版本的熔絲位設(shè)置,串口波特率設(shè)置,bootloader文件所在位置等等。在ARDUINO IDE中選擇版本時(shí),就會(huì)把相關(guān)參數(shù)切換為這個(gè)文件里說(shuō)明的參數(shù)。
?
說(shuō)完I/O口,再說(shuō)說(shuō)ARDUINO的下載方式。AVR單片機(jī)的下載方式有ISP,JTAG仿真,高壓并行下載等。早期的ARUIDNO的下載用的還是CH340G,后來(lái)從某個(gè)版本開(kāi)始就使用AT MEGA8以及16來(lái)實(shí)現(xiàn)USB轉(zhuǎn)串口了。ARDUINO MEGA2560的手冊(cè)的下載模塊原理圖如下:
BOOTLOADER就是正式程序之前的一段小程序,他在FLASH中有自己專門的存儲(chǔ)區(qū)(忘記叫什么了),可以根據(jù)需要實(shí)現(xiàn)各種功能,一般被用作系統(tǒng)啟動(dòng)前的初始化工作。而ARDUINO就利用他實(shí)現(xiàn)了串行口下載。具體步驟見(jiàn)后面敘述。
下面說(shuō)下我的開(kāi)發(fā)過(guò)程。
一.利用PROGISP實(shí)現(xiàn)ARDUINO IDE編寫的程序的下載
由于我的micro usb焊接不上去,又不想浪費(fèi)其余部分已經(jīng)焊好的板子,于是用PROGISP來(lái)下載ARDUINO IDE上寫好的程序。
ARDUINO板子正常的下載是通過(guò)USB口,在編譯器上一鍵下載的。而我們用PROGISP下載則需要編譯好的16進(jìn)制文件。導(dǎo)出ARDUINO IDE編譯好的hex文件設(shè)置如下:
打開(kāi)ARDUINO IDE,F(xiàn)ile->preferences,點(diǎn)那個(gè)C盤的路徑,用記事本打開(kāi)preferences.txt
?
關(guān)閉ARDUINO IDE(非常重要?。?/p>
用記事本打開(kāi)preferences.txt后,選擇hex文件存放的路徑,在最后行加入 build.path=D:arduinoMyHexDir。這個(gè)路徑自己選擇。關(guān)閉文件。
驗(yàn)證是否成功,如果沒(méi)有成功,很可能是修改文件時(shí)ARDUINO沒(méi)有關(guān)閉,此時(shí)重新打開(kāi)文件,會(huì)發(fā)現(xiàn)那段語(yǔ)句并沒(méi)有加入到文中。
成功后,目錄里能找到編譯好的HEX文件。
接下來(lái)就是AVR單片機(jī)的一些需要設(shè)置的地方了,談下我的經(jīng)歷以及需要注意的東西:熔絲位。這是我第一次接觸AVR單片機(jī),很多地方都不懂,之前一直以為直接用CH340G就可以實(shí)現(xiàn)下載了,后來(lái)發(fā)現(xiàn)并不是這樣。首先AVR的熔絲位就是一個(gè)很獨(dú)特的東西,它決定了時(shí)鐘選擇,系統(tǒng)時(shí)鐘分頻,啟動(dòng)時(shí)從哪個(gè)地址開(kāi)始執(zhí)行程序,各種使能等等。AVR出廠時(shí)默認(rèn)的是使用內(nèi)部的RC振蕩電路,我的板子上用的是外部的16M晶振,所以需要修改熔絲位來(lái)選擇外部晶振作為時(shí)鐘電路。而熔絲位是需要用ISP來(lái)下載的,所以第二版PCB我增加了ISP的下載口,并在網(wǎng)上買了兩個(gè)usb isp下載器,無(wú)奈的是,把下載器插到電腦上后,電腦竟然沒(méi)發(fā)現(xiàn)新硬件,在設(shè)備管理器里也沒(méi)有找到。好在賣家負(fù)責(zé),給我發(fā)了個(gè)免驅(qū)動(dòng)的燒錄軟件,見(jiàn)下圖。
?

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