|
警告:PIC系列的軟件bug很多而且老變,除非你要直插代替,不要用它。arduino要好的太多太多,也支持ESP32。用低壓5V編程時,PICKit沒有調(diào)試功能!10年后芯片閃會飛!
其實(shí)我20年前用過,但只是匯編,發(fā)定時精確的短脈沖讓電視機(jī)進(jìn)入工廠調(diào)試模式。上月因抽油煙機(jī)隨機(jī)跳變,上網(wǎng)看要1000美刀,花了20美刀買了PICjit3.5和幾個片子,仿真了一下,燒入后一次成功,證實(shí)原來的芯片跑飛了!下面是這次工作的小結(jié),對初次接觸PIC的可能有幫助。我就用過16C54和這次的F1847,謬誤請指正。一句話,裝XIDE和XC8,仿真后燒入,跑!
1. 幾款8bit uP
老片子16C54偶爾可見價格比新的貴。因此找了一下在產(chǎn)的18、20腳片子。
1.1 PIC16F628/648和16F716
前者有內(nèi)置1% 4M時鐘和串口,后者有A/D,兩者均有Vref/比較器/PWM及在線編程ICSP(RB6-7)。
RAM分4塊各80H長,直接尋址時狀態(tài)寄存器RP-0、間接尋址時IRP和FSR.7用于分塊Bank,見E4.1。
RA0-4可由MOVWF TRISA配置,各位置1為輸入,RA5=VPP=VCC,RA6-7=CLKOUT/CLKIN,PCON.3=1配置INTOSC=4M此時CLKOUT=1MHz。類似的RB0-7由TRISB配置,OPTION.7=1配置上拉電阻約11K,RB7-4配置為輸入時可在改變時做喚醒中斷。BCF/BSF是讀-修改-寫會將8bit讀出再寫回,如果某位由輸入改為輸出,該位在重寫前的輸出可能是上次BCF/BSF時的輸入值,見E5-2。
對TMR0計數(shù)/定時器,OPTION=7時預(yù)置prescaler為255,對于4M時鐘成為64bus,8bit定時最大為16.384ms,參照E6-2。任何TMR0寫入均清除定標(biāo)器。TMR1包括2x8bit可為16bit上增計數(shù)、定時器。TMR2是8bit常用于PWM。串口獲得19.2K很容易,115.2K精準(zhǔn)須用14.7456M時鐘,20M時誤差-1.36%還很不錯。
1.2 PIC16F1847
指令系統(tǒng):
上兩片子的優(yōu)點(diǎn)合并就是PICF1847,18/20/28p腳,DIP18仍與16C54向下兼容。8K程序/1KRAM/256B EEROM。棧深16可訪,溢出可中斷。12CH 10bit ADC、5bit DAC、增強(qiáng)串口、32M并內(nèi)置1%RC時鐘(需編譯選項(xiàng))。如前類似,程序過界是繞回,RAM共32塊Bank,由BSR或FSR切換,每塊的最低32B是各類寄存器可能有多地址映射到同一寄存器,20~6F是80B可直接間接尋址RAM,最高16B均映射到70-7F(因此訪問不受bank切換限制)為common RAM;各塊的80B RAM還映射到FSR線性地址2000-29AF,訪問更為方便。
BROV是欠壓復(fù)位Brown-out reset(BORV=1/0時約1.9/2.7V),而STVREN是堆棧溢出復(fù)位。配置FOSC=100即INTOSC時,CLKIN/OUT均可用作IO(/CLKOUTEN=0),時鐘可選為32M~31K倍減,見5.2.2。用外部時鐘時可以4倍頻。此外,CLKOUT可在/2~/128后由CLKR輸出。程序數(shù)據(jù)和EE均有保護(hù)位可選用。地址8006h處是芯片ID和版本。
對于中斷,INTCON可設(shè)置保存幾個現(xiàn)場寄存器,見8.5。VPP=RA5可用作輸入并上拉,建議留作編程。此外RBx可由WPUB選擇各位上拉與否。與前片不同,RB各位均可配置改變中斷且可選前后沿。因有ADA,端口有更多的配置,其它功能包括片上
TMR0增量定時/計數(shù)器現(xiàn)在可用于TMR1的門控。如前芯片,TMR1可外接32768Hz晶振,但現(xiàn)在多了1-8的定標(biāo)器并可用Fosc/4,4M時鐘定時可達(dá)524ms。TMR4/6與TMR2類似,帶1-64/1-16前后定標(biāo)器。增強(qiáng)的全雙工異步/半雙工同步EUSART帶有波特率檢測和校準(zhǔn),IO緩存,可發(fā)送中斷字串,115.2K的支持更好。
ICSP線內(nèi)串行編程使用RB6-7作時鐘數(shù)據(jù)(不能上拉),PICkit有6芯接口。溫度傳感器、比較、SR寄存器、調(diào)制器、PWM,ADA、電容傳感從略。
對于我的抽油煙機(jī),CLKR可輸出4M/128=31.25K。加ICSP接口:/MCLR=Vpp現(xiàn)接5V需斷開;設(shè)置MCLRE=1上拉;RB6-7已接去鍵盤/顯示,可以顯示編程狀態(tài)。
由F31-41可見輸出電流-10mA電平約4V(-20mA在25C輸出位3V但隨溫度變化大),故紅色LED限流以220歐為佳;如果下拉可輸出20mA。
1.3 PIC16F18446
類似F1847但為20pin封裝,有A/D。DM164144為其低價nano板帶debugger和編程見3.4.4。
1.4 指令系統(tǒng)(14bit),T29-3
以ADDWF f,d為例,1/3指令是W(ACC)寄存器和f(0-7F直接尋址RAM稱為reg file)之間的操作,d=dst=w|f。1/3指令是對常量或標(biāo)號(地址)的操作,稱為Literal operations,如MOVLW k。第三類是skip/branch/call/ret,最后是所謂固有和C語言支持的指令。除CALL和GOTO尋址為8K,其余bra/call范圍均為8bit。FSR0/1 H/L用于全范圍間接尋址。ASM指令banksel在器件手冊中沒有只在ASM中有。
3.開發(fā)工具
舊版軟件可能不支持較新的片子。IDE以為多平臺XIDE取代,HITECH C編譯已過時,CC5X免費(fèi)版不支持任何C庫也不支持banksel,#pragma rambank 0也沒能在函數(shù)中產(chǎn)生額外代碼,換句話沒法換段。用MCC配置較為方便,但是就只能用XC8。
舊版:https://www.microchip.com/en-us/tools-resources/archives/mplab-ecosystem
3.1 IDE 和XIDE
XIDE內(nèi)置ASM和仿真,目前6.0而MCC 5.1,安裝完成時需選裝Code Config(MCC)和XC,將會彈出兩個窗口,先下載安裝XC8,我也裝了另外下載的cc5x免費(fèi)版;再進(jìn)XIDE后Tools|Plug in中MCC裝和cc5x插件。
若因3.4.4緣故需要裝XIDE 5.3.0,需要手動安裝MCC 4.0.2 :即下載解壓后由Plugins>downloaded點(diǎn)擊Add Plugins button,安裝MCC外的所有*.nbm文檔再安裝mcc*.nbm,重新運(yùn)行XIDE即可。建議用此版,快,MCC是內(nèi)置的非web頁面。https://ww1.microchip.com/downloads/en/DeviceDoc/release_notes_mcc_4_0_2.pdf?
3.2 C編譯
3.2.1 MPLAB XC
包括匯編器、鏈接器和實(shí)用程序;匯編器支持定點(diǎn)和浮點(diǎn)數(shù)據(jù)、宏、命令行,LIB是庫。
源碼:https://github.com/microchip-pic-avr-examples
Newark yahooC1,t440p: 28d2445b88ec,
3.2.2 CC5X
效率最高:安裝在C:Program Files (x86)bkndCC5X,項(xiàng)目:https://github.com/mc6pac/toolchainCC5X
CC5X免費(fèi)版與XIDE連用時不用uP頭文件,在MCC中配置uP。沒有任何C的頭文件如stdio或C庫函數(shù),也不支持banksel。
unsigned/char/int is 8bit,unsigned long/long is 16bit,浮點(diǎn)24bit,支持bit(bit outPCM @ PORTA.2;),little endian。涉及數(shù)組或16bit的操作,等號某端須為簡單變量。用MCC產(chǎn)生的代碼首先需要在CC5X環(huán)境中加頭文件路徑,但是MCC的源碼需XC8,因此還是不能用。
3.2.3 其它C編譯
許多項(xiàng)目只能用HiTECH-C,其試用版在XIDE6下常不能連上:HiTECH-C 171073 https://www.microchipc.com/sourcecode/ 其它C源碼:https://www.microchipc.com/sourcecode/ HiTECH-C已斷檔。
3.3 X SIM
MPLAB X SIM是軟件仿真工具。安裝后得hostid:54e1add0e1a。
一個大缺陷是不支持上拉。有人寫了SCL腳本,在Stimulus中經(jīng)Attach SCL File載入。
3.4 調(diào)試/編程器
3.4.1 山寨的PICkit 3/3.5調(diào)試/編程器
未必都可靠。v=UiTKBwKBf6g PICkit 3.5比3多了固件恢復(fù),均可與原廠XIDE/ISP聯(lián)用,6線接口用于調(diào)試和編程。我用PICkit 3.5沒幾次感覺不錯,ZIF直插不用連線,第二次運(yùn)行后固件自動更新了。
PICkit 3.5,可選帶ZIF插座。 支持芯片PIC16/18xx DIP18/28/40(16F57/59除外),DIP8/14/20(10FXX除外)。DIP28/40對準(zhǔn)A線,DIP8/14/18/20對準(zhǔn)B線。Ali上買的,跳線接法在背面。運(yùn)行XIPE,放入F1847后圖點(diǎn)變綠,點(diǎn)擊Connect顯示:
連接到MPLAB PICkit 3...Currently loaded firmware on PICkit 3固件套件版本.....01.28.90 *固件類型..............中檔Now Downloading new Firmware for target device: PIC16F1847下載啟動引導(dǎo)程序中啟動引導(dǎo)程序下載完成編程下載...下載RS中...RS下載完成編程下載...下載AP中...AP下載完成編程下載...
但是Import只有SQTP而非hex可選!再次運(yùn)行顯示:
連接到MPLAB PICkit 3...Currently loaded firmware on PICkit 3固件套件版本.....01.56.02固件類型..............增強(qiáng)型中檔
進(jìn)Advanced setting點(diǎn)了一些鍵后,hex可以裝載了,也可以用SQTP給每個片子獨(dú)特ID:How-to-load-a-SQTP-file-in-MPLAB-IPE。但我覺得還是在XIDE下編程為好,在XIDE下編程的步驟:
1.項(xiàng)目配置若為Simulator改成相關(guān)硬件如PICKit 3,2.項(xiàng)目配置中PICKit3,Option下拉選Power,勾選5V3.工具行點(diǎn)擊往下指向芯片的圖標(biāo)“Make and Program Device Main Project”
https://blog.csdn.net/sllin/article/details/109575653 某次自己寫燒錄芯片的時候一直無法重新燒錄,重新安裝了IDE和更換了電腦都無法燒錄成功,后來咨詢了技術(shù)支持,應(yīng)該是在某次更新固件的時候跟新沒有完全成功,需要手動更新才可以正常使用,特記錄一下。開發(fā)環(huán)境:MPLAB IDE V8.92 燒錄工具: PICKit3.5。1)Configure->Select Device... ->選擇你需要燒錄的芯片。 2)Programmer-->Select Programmer(選擇PiCkit3)。3)打開燒錄器Power給器件供電,Programmer->setting->Power (選擇輸出的電壓,勾選按鍵)。需要這里提示識別了Device ID,否則無法燒錄。如果沒有找到,請檢查接線方式,是否有虛焊等問題。4)File->Import->選擇需要燒錄的hex文件。5)Programmer->Program,燒錄,成功會提示,不成功的話,會有紅色字體提示。6)如果第三步不能識別, 很有可能需要手動更新燒錄器的程序:Programmer->setting->Configuration->Manual Download,會提示Downloading Firware... 更新燒錄器固件是否成功。
一鍵修復(fù)固件方法: 若kit3.5不能連電腦,所有燈全亮,電腦無法識別按下步驟(整個過程只需要USB口提供電源): 1> 開機(jī)前 按著 按鍵不放; 2> 插上usb線上電(不連目標(biāo)板); 3> 等待 3-4秒鐘紅綠色狀態(tài)STATUS燈快閃(此時可以鬆開按鍵); 4> 等待藍(lán)色ACTIVE燈閃爍表示恢復(fù)結(jié)束; 5> 拔掉usb線重新插上,kit就可以正常工作了! 手動更新kit3/3.5內(nèi)部固件步驟: MPLAB IDE v8.92 1.菜單 Programmer/Select Programmer/Pickit3 2.菜單 Programmer/Setting.../Configuration -->點(diǎn)擊按鈕 ManualDownload -->彈出對話方塊:按兩下PK3FW_012890.jam 文件 看MPLAB IDE Output狀態(tài)列 -- PICkit3 狀態(tài)直到結(jié)束。 3.5版優(yōu)勢: 1、離線燒寫永不死機(jī)。 完美支援所有版本軟體MPLAB、MPLAB X 離線燒寫永不死機(jī),燒寫速度更快。 2、KIT3.5 固件自恢復(fù)。 3、採用1812自恢復(fù)保險絲及強(qiáng)大保護(hù)電路。 4、每個KIT3有唯一序號. 支援MPLAB X ,可以操作多個KIT3。 5、程式設(shè)計電壓穩(wěn)定,供電電流大。 6、完善介面保護(hù)電路。短路不會壞。 KIT3適合開發(fā)使用,也適合批量生產(chǎn)燒寫使用。沒電腦也能燒程式! 7.官方開放標(biāo)準(zhǔn)電路。7.支援離線下載,可以適合現(xiàn)場程式升級和批量程式設(shè)計。8.直接調(diào)試PIC18FXXK系列,以及PIC16F72X等VPP低於10V的晶片,無須手動為VPP增加降壓電路。9. 燒寫調(diào)試電源輸出,並可以在軟體上進(jìn)行調(diào)整.如dspic33f,可以直接輸出3.3V供電.。打開MPLAB IDE軟體,configure->select device 以PIC16F877A為例,1的位置相應(yīng)工具前面綠色,表示支持線上燒寫;2的位置相應(yīng)工具前面綠色,表示支持線上調(diào)試的;3 的位置是紅色就無需模擬頭直接調(diào)試,如果是綠色後面帶的型號就是模擬頭的型號,需要模擬頭才可以調(diào)試。
3.4.2 原裝PCIkit3
PG164130 supported list:
3.4.3 原裝PCIkit4
PG164140 70刀:PG164140 帶固件恢復(fù)按鍵。
3.4.3.1 原裝Snap
PG164100 31刀但運(yùn)費(fèi)不菲:PG164100 單板,外殼可打印:與PICkit4比:同是USB高速(kit3是全速),1.8~5.5V目標(biāo)機(jī),需另外供電(kit4可以50mA)、只能低壓編程且電壓不可調(diào)、不支持SD轉(zhuǎn)存(Programmer Go)。固件恢復(fù)可由軟件。割線后運(yùn)行XIDE5.3據(jù)說可作通用編程器。
3.4.4 Curiosity Nano board
如帶PIC16F18446的: https://www.microchip.com/en-us/development-tool/DM164144 帶debugger芯片,編程口ICSPDAT/ICSPCLK/MCLR。板上VCON可用作獨(dú)立的串口調(diào)試器。USB供電VBUS經(jīng)調(diào)壓后為1.7~VBUS為VTG供uP,另轉(zhuǎn)3V3給debugger,后者控制VBUS/VOFF;僅在VOFF對地短接時,可由VTG外接供電2.3-5.5V。板上RA2是LED,RC2對地是按鍵,32K晶體未連接,可補(bǔ)焊J210/211接RA4/5。RA0/1/3是ICSP的DAT/CLK/MCLR,RA0對地有47K,僅影響D/A和調(diào)試。DIP插頭可不焊直接插上。可以劃斷PCB使得debugger和f18446完全斷開,筆者建議:劃斷RA3-D3, RA3去NC腳外引去外編程口adapter腳6,內(nèi)編程時NC跳接D3;外uP編程口6接地,/MCLR需上拉10K,由VTG供電。
XIDE 5.30可以用該板作其它編程:該文用MElabs MCS的創(chuàng)建用戶編程器,選 “c:Program Files (x86)MicrochipMPLABXv5.30mplab_platformmplab_ipeipecmd.exe”。如果是Windows下命令行,參數(shù)為:-TPPKOB -P16f1847 F -E -M -OL -OB -Y 參數(shù)細(xì)節(jié)運(yùn)行該程序可見。Linux下XIDE 5.5對應(yīng)的命令實(shí)例:ipecmd.sh -TPPK4 -P<32MZ2064DAS176-ID> -I -K -M -F
我建議XIDE 5.30,因?yàn)樯鲜龅木壒剩?.0的MCC鏈接去幾個網(wǎng)頁,慢且啰嗦。我還是喜歡什么東西都在本地的軟件,不要時不時鏈接去互聯(lián)網(wǎng),后者變的快誰知鏈接會不會失效?
3.4.5 用Arduino給PIC16F1847編程
v=nbSd0FlJh0I? Arduino nano的RA0/1/3分別接PIC的ICSPCLK/ICSPDAT/MCLR,實(shí)測PIC16F1847成功。
3.4.6 其它編程器
3.4.6 編程方法
上述工具多半只能低壓編程,因?yàn)長VP缺省為1且只能高壓改變。低壓編程時/MCLR=VPP必須由軟件拉低,且經(jīng)ICSPDAT/ICSPCLK發(fā)送32b序列。標(biāo)準(zhǔn)6線為/MCLR-Vdd-Vss-DAT-CLK-NC。IPE是XIDE里編程功能也可單獨(dú)運(yùn)行,口令是microchip,用于燒入hex程序。多半也可由命令行編程。
3.4.7 調(diào)試
debug:v=RVPOhPopujs v=RVPOhPopujs
調(diào)試教程系列:playlist?list=PLtQdQmNK_0DTsTgCR47l9l6HHQIb6b3-T 不如早期的好:v=pnkUOL0mmyA v=O4IpwgWhqLY
3.7 開發(fā)環(huán)境
點(diǎn)擊XIDE EDIT下的folder建立standalone app,選芯片,tool可選軟件simulator或硬件snap或nano板,然后會彈出編譯器選擇,可選的由XC8/CC5X/HI-TECH PICC和pic-as(匯編),我選XC8(v2.36),然后輸入項(xiàng)目名和目錄,缺省是C:Users用戶名MPLABXProjects項(xiàng)目名,結(jié)束。
此時GUI左下是dashboard,點(diǎn)擊其左上角彈出項(xiàng)目特性,可設(shè)置時鐘、串口緩存、include folder,更改編譯器等,先不必管。
項(xiàng)目打開后可點(diǎn)擊MCC圖標(biāo),XIDE 6需在彈出的Wizard中點(diǎn)擊中間的classic圖標(biāo),彈出一堆庫可選,包括DAC/LIN(串口)/TCPIP等。比起老版這是繁雜的開始,不管它點(diǎn)擊finish;XIDE 5直接進(jìn)入。
點(diǎn)擊右下窗口Pin Manager選擇端口I/O,凡固定為輸出的點(diǎn)擊Output鎖定,其余點(diǎn)擊Input鎖定。在右上窗口點(diǎn)System module|Easy setup書簽設(shè)置時鐘、WDT等,點(diǎn)Pin module|Easy setup配置各端口屬性,如初始電平、關(guān)閉模擬、上拉WPU等;這里顯示的端口都是上一步鎖定的。
如果不顯示Pin Manager或芯片接腳圖,要點(diǎn)擊圖標(biāo)行下,tab行中/右窗口右上角的打開按鈕。
MCC運(yùn)行后在Project圖標(biāo)右側(cè)增加Resource management書簽,點(diǎn)擊Generate圖標(biāo)后,MCC生成代碼,在Project|Source files和Headfiles里可以看見。打開其生成的main.c,將所有生成的head file都include進(jìn)去。此步必不可少。用DM164144評價板的實(shí)例見3.8.1。
編譯后要注意源碼隔行的警鈴符號。點(diǎn)擊后發(fā)現(xiàn)PORT無定義但各bit有定義,XC8手冊沒有這個關(guān)鍵字,bug!
有時需要把缺省的C99標(biāo)準(zhǔn)變?yōu)镃90以避免編譯出錯,方法是電機(jī)坐下窗外緣的圖標(biāo)打開project配置,在C編譯的“XC8 Global options”中改變。
調(diào)試時,先點(diǎn)擊Window|Stimulator把Stimulus tab加在右下窗口中,給輸入腳如RA3加負(fù)脈沖,用時點(diǎn)擊Fire發(fā)送;在Variables中加觀察變量,也可打開Windows|Debug|Watches窗口。注意simulater不支持上拉,建議直接上硬件板,simulater有限制或bug。
閃存編程時可以獨(dú)立運(yùn)行XIPE或命令行,更方便的是打開XIDE project配置,找到Conf:下的編程器如PKOB nano,點(diǎn)擊Apply,才會出現(xiàn)相應(yīng)圖標(biāo)。
3.8 實(shí)例
3.8.1 XC8 under Windows 10
#include "mcc_generated_files/mcc.h" //already in MCC generated main.c#include "mcc_generated_files/device_config.h" //watch include files and add these two#include "mcc_generated_files/pin_manager.h" void main(void){ SYSTEM_Initialize(); while (1) { IO_RA2_Toggle(); //already defined in MCC generated pin_manager.c __delay_ms(500); //also generated code, add this line for 1 sec circle //go device_config.h, check freq is 4MHz }}
3.8.2 SDCC under Linux
https://hackaday.io/project/8559-microchip-pic-arduino-based-programmer/log/35064-goals-slightly-revisited-pic18f25k50-support? #include "pic18f25k50.h"#pragma config XINST=OFF //good old instruction set, don't change this#pragma config WDTEN = OFF //we don't need WDT here#pragma config FOSC = INTOSCIO //internal oscillator, IO on RA6,7volatile int i,j; //we don't want the compiler to optimize out the delay
void main(void) OSCCON = 0x70; //switch the internal oscillator to 16MHz ANSELC = 0; TRISC = 0x00; //and make them IO outputs while (1) { LATC = ~ LATC; //flip all C pins to opposite state for (i=0;i<20000;i++) j++; //and burn some time
}}
3.9 Boot loader
https://www.microchip.com/en-us/tools-resources/develop/libraries/microchip-bootloaders? 基本流程是:監(jiān)控到串口后由Boot loader開始固件更新,或啟動應(yīng)用同時由應(yīng)用監(jiān)控PC的請求,復(fù)位交權(quán)給Boot loader;開始固件更新時由PC發(fā)出命令擦除、然后校驗(yàn)、確定結(jié)果,更新后復(fù)位如前。8位源碼見AN1310或下載https://github.com/luciodj/PIC16-Serial-Bootloader,其它的可由廠家下載。
用戶手冊中建議Bootloader的cfg分為兩個拷貝:有/無cfg配置;end app分為三個:Standalone/Offset/Combined。先調(diào)好Standalone,再調(diào)好為Bootloader預(yù)留的Offset,最后把沒有配置的Bootlaoder加入到Combined項(xiàng)目里,以免linker報“(944) data conflict error at...”錯。
實(shí)例:在XIDE中已建立的app下端右擊loadable,裝入下載的Bootloader ,注意兩者cfg配置要一樣否則報錯。
這段我沒試過,備忘。
|
|