個人資料
歸檔
正文

Microchip PIC

(2022-02-02 11:02:12) 下一個

警告:PIC係列程序存儲器10年後內容丟失,軟件bug很多而且多變,除非你要直插代替,不要用它。arduino要好的太多太多,也支持ESP32。用低壓5V編程時,PICKit沒有調試功能!

1. 幾款8bit uP

1.1 PIC16F628/648和16F716

前者有內置1% 4M時鍾和串口,後者有A/D,兩者均有Vref/比較器/PWM及在線編程ICSP(RB6-7)。

RAM分4塊各80H長,直接尋址時狀態寄存器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計數/定時器,OPTION=7時預置prescaler為255,對於4M時鍾成為64bus,8bit定時最大為16.384ms,參照E6-2。任何TMR0寫入均清除定標器。TMR1包括2x8bit可為16bit上增計數、定時器。TMR2是8bit常用於PWM。串口獲得19.2K很容易,115.2K精準須用14.7456M時鍾,20M時誤差-1.36%還很不錯。

1.2 PIC16F1847

指令係統:https://microchipdeveloper.com/mcu1102:instruction-set? 

上兩片子的優點合並就是PICF1847,18/20/28p腳,DIP18仍與16C54向下兼容。8K程序/1KRAM/256B EEROM。棧深16可訪,溢出可中斷。12CH 10bit ADC、5bit DAC、增強串口、32M並內置1%RC時鍾(需編譯選項)。如前類似,程序過界是繞回,RAM共32塊Bank,由BSR或FSR切換,每塊的最低32B是各類寄存器可能有多地址映射到同一寄存器,20~6F是80B可直接間接尋址RAM,最高16B均映射到70-7F(因此訪問不受bank切換限製)為common RAM;各塊的80B RAM還映射到FSR線性地址2000-29AF,訪問更為方便。

BROV是欠壓複位Brown-out reset(BORV=1/0時約1.9/2.7V),而STVREN是堆棧溢出複位。配置FOSC=100即INTOSC時,CLKIN/OUT均可用作IO(/CLKOUTEN=0),時鍾可選為32M~31K倍減,見5.2.2。用外部時鍾時可以4倍頻。此外,CLKOUT可在/2~/128後由CLKR輸出。程序數據和EE均有保護位可選用。地址8006h處是芯片ID和版本。

對於中斷,INTCON可設置保存幾個現場寄存器,見8.5。VPP=RA5可用作輸入並上拉,建議留作編程。此外RBx可由WPUB選擇各位上拉與否。與前片不同,RB各位均可配置改變中斷且可選前後沿。因有ADA,端口有更多的配置,其它功能包括片上

TMR0增量定時/計數器現在可用於TMR1的門控。如前芯片,TMR1可外接32768Hz晶振,但現在多了1-8的定標器並可用Fosc/4,4M時鍾定時可達524ms。TMR4/6與TMR2類似,帶1-64/1-16前後定標器。增強的全雙工異步/半雙工同步EUSART帶有波特率檢測和校準,IO緩存,可發送中斷字串,115.2K的支持更好。

ICSP線內串行編程使用RB6-7作時鍾數據(不能上拉),PICkit有6芯接口。溫度傳感器、比較、SR寄存器、調製器、PWM,ADA、電容傳感從略。

對於我的抽油煙機,CLKR可輸出4M/128=31.25K。加ICSP接口:/MCLR=Vpp現接5V需斷開;設置MCLRE=1上拉;RB6-7已接去鍵盤/顯示,可以顯示編程狀態。

由F31-41可見輸出電流-10mA電平約4V(-20mA在25C輸出位3V但隨溫度變化大),故紅色LED限流以220歐為佳;如果下拉可輸出20mA。

1.3 PIC16F18446 etc

類似F1847但為20pin封裝,有A/D。DM164144為其低價nano板帶debugger和編程見3.4.4。

新片PIC18F26/46/56Q43為28/40/44/48pin,PIC18F26Q43-I/SP $2.08,PIC18F45Q43T-I/PT $1.7, PIC18F4550T-I/PT $7.91:
18F4550T-I/PT  TQFP44,10x10 2.0-5.5V 32K 2KB-DRAM 256B-EEPROM 48MHz I/O-35 UART/I2C/SPI 10bx13chAD no-DAC  USB2.0
18F45Q43T-I/PT TQFP48,7x7   1.8-5.5V 32K 2KB-DRAM  1KB-EEPROM 64MHz I/O-36 +I2S+PWM     12bx35chAD 8bx1ch no-USB
18F45K50-I/P   DIP40        2.3-5.5V $2.08 32K 2KB-DRAM 256B-EEPROM 48MHz I/O-35 UART/I2C/SPI 10bx13chAD 5bx1ch USB2.0

https://github.com/tahaemara/MicroRTOS-for-PIC-18F-Family PIC18F4550用mikroc PRO for PIC編譯。https://www.youtube.com/watch?v=hYynOanPZWU 使用T0時鍾延遲和軟件堆棧。uP初始化棧指針STKPTR為0,TOSU:TOSH:TOSL存有當前棧指針STKPTR的內容24bit,操作棧時需禁止GIE。STKOVF/STKUNF為上溢/下溢標誌。上溢時若STVREN置位將中斷,否則棧頂0x7F內容被重寫;但是人工設置STVREN不會中斷。STKUNF同理。新品F45K50:1) Have lesser flash write cycles
2) Needs no crystal for USB. built in oscillator works up to 16 MHz.
3) Oscillator configuration, config bits are slightly different.
4) Has a 5-bit DAC and CTMU peripheral for capacitive sensing.
5) might not supported by free mcc18 compilers
6) not supported by PICkit2 (non-official device file supports this)
7) LPT1OSC config bit not available on the K part.

1.4 指令係統(14bit),T29-3

以ADDWF f,d為例,1/3指令是W(ACC)寄存器和f(0-7F直接尋址RAM稱為reg file)之間的操作,d=dst=w|f。1/3指令是對常量或標號(地址)的操作,稱為Literal operations,如MOVLW k。第三類是skip/branch/call/ret,最後是所謂固有和C語言支持的指令。除CALL和GOTO尋址為8K,其餘bra/call範圍均為8bit。FSR0/1 H/L用於全範圍間接尋址。

ASM指令banksel在器件手冊中沒有隻在ASM中有。

3.開發工具

舊版軟件可能不支持較新的片子。IDE以為多平台XIDE取代,HITECH C編譯已過時,CC5X免費版不支持任何C庫也不支持banksel,#pragma rambank 0也沒能在函數中產生額外代碼,換句話沒法換段。

舊版:https://www.microchip.com/en-us/tools-resources/archives/mplab-ecosystem 

3.1 IDE 和XIDE

XIDE內置ASM和仿真,目前6.0而MCC 5.1,安裝完成時需選裝Code Config(MCC)和XC,將會彈出兩個窗口,先下載安裝XC8,我也裝了另外下載的cc5x免費版;再進XIDE後Tools|Plug in中MCC裝和cc5x插件。

若因3.4.4緣故需要裝XIDE 5.3.0,需要手動安裝MCC 4.0.2 :即下載解壓後由Plugins>downloaded點擊Add Plugins button,安裝MCC外的所有*.nbm文檔再安裝mcc*.nbm,重新運行XIDE即可。建議用此版,快,MCC是內置的非web頁麵。https://ww1.microchip.com/downloads/en/DeviceDoc/release_notes_mcc_4_0_2.pdf?

3.2 C編譯 

3.2.1 MPLAB XC

https://microcontrollerslab.com/mplab-xc8-compiler-getting-started/ https://www.microchip.com/en-us/tools-resources/develop/mplab-xc-compilers#tabs 包括匯編器、鏈接器和實用程序;匯編器支持定點和浮點數據、宏、命令行,LIB是庫。

源碼:https://github.com/microchip-pic-avr-examples

Newark yahooC1,t440p: 28d2445b88ec, 

3.2.2 CC5X

效率最高:http://www.cogitosoft.com/m/html/product/item.aspx?id=1277?  下載http://www.bknd.com/cc5x/download.html安裝在C:Program Files (x86)bkndCC5X,項目:https://github.com/mc6pac/toolchainCC5X   

CC5X免費版與XIDE連用時不用uP頭文件,在MCC中配置uP。沒有任何C的頭文件如stdio或C庫函數,也不支持banksel

unsigned/char/int is 8bit,unsigned long/long is 16bit,浮點24bit,支持bit(bit outPCM @ PORTA.2;),little endian。涉及數組或16bit的操作,等號某端須為簡單變量。用MCC產生的代碼首先需要在CC5X環境中加頭文件路徑,但是MCC的源碼需XC8,因此還是不能用。

 

3.2.3 其它C編譯

許多項目隻能用HiTECH-C,其試用版在XIDE6下常不能連上:HiTECH-C 171073 https://www.microchipc.com/sourcecode/  其它C源碼:https://www.microchipc.com/sourcecode/ 

3.3  X SIM

MPLAB X SIM是軟件仿真工具。安裝後得hostid:54e1add0e1a。

一個大缺陷是不支持上拉。有人寫了SCL腳本,在Stimulus中經Attach SCL File載入。 

3.4  調試/編程器

3.4.1 山寨的PICkit 3/3.5調試/編程器

未必可靠。https://www.youtube.com/watch?v=UiTKBwKBf6g PICkit 3.5比3多了固件恢複,均可與原廠XIDE/ISP聯用,6線接口用於調試和編程。

PICkit 3.5https://www.aliexpress.com/item/32949836067.html,可選帶ZIF插座。 支持芯片PIC16/18xx DIP18/28/40(16F57/59除外),DIP8/14/20(10FXX除外)。DIP28/40對準A線,DIP8/14/18/20對準B線。Ali上買的,跳線接法在背麵。運行XIPE,放入F1847後圖點變綠,點擊Connect顯示:

連接到MPLAB PICkit 3...
Currently loaded firmware on PICkit 3
固件套件版本.....01.28.90 *
固件類型..............中檔
Now Downloading new Firmware for target device: PIC16F1847
下載啟動引導程序中
啟動引導程序下載完成
編程下載...
下載RS中...
RS下載完成
編程下載...
下載AP中...
AP下載完成
編程下載...

但是Import隻有SQTP而非hex可選!再次運行顯示:

連接到MPLAB PICkit 3...
Currently loaded firmware on PICkit 3
固件套件版本.....01.56.02
固件類型..............增強型中檔

進Advanced setting點了一些鍵後,hex可以裝載了,也可以用SQTP給每個片子獨特ID:https://microchipsupport.force.com/s/article/How-to-load-a-SQTP-file-in-MPLAB-IPE。但我覺得還是在XIDE下編程為好,在XIDE下編程的步驟:

1.項目配置若為Simulator改成相關硬件如PICKit 3,
2.項目配置中PICKit3,Option下拉選Power,勾選5V
3.工具行點擊往下指向芯片的圖標“Make and Program Device Main Project”

https://blog.csdn.net/sllin/article/details/109575653  某次自己寫燒錄芯片的時候一直無法重新燒錄,重新安裝了IDE和更換了電腦都無法燒錄成功,後來谘詢了技術支持,應該是在某次更新固件的時候跟新沒有完全成功,需要手動更新才可以正常使用,特記錄一下。開發環境: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... 更新燒錄器固件是否成功。

鍵修復固件方法: 若kit3.5不能連電腦,所有燈全亮,電腦無法識別按下步驟(整個過程隻需要USB口提供電源): 1> 開機前 按著 按鍵不放; 2> 插上usb線上電(不連目標板); 3> 等待 3-4秒鐘紅綠色狀態STATUS燈快閃(此時可以鬆開按鍵); 4> 等待藍色ACTIVE燈閃爍表示恢復結束; 5> 拔掉usb線重新插上,kit就可以正常工作了! 手動更新kit3/3.5內部固件步驟: MPLAB IDE v8.92 1.菜單 Programmer/Select Programmer/Pickit3 2.菜單 Programmer/Setting.../Configuration -->點擊按鈕 ManualDownload -->彈出對話方塊:按兩下PK3FW_012890.jam 文件 看MPLAB IDE Output狀態列 -- PICkit3 狀態直到結束。 3.5版優勢: 1、離線燒寫永不死機。 完美支援所有版本軟體MPLAB、MPLAB X 離線燒寫永不死機,燒寫速度更快。 2、KIT3.5 固件自恢復。 3、採用1812自恢復保險絲及強大保護電路。 4、每個KIT3有唯一序號. 支援MPLAB X ,可以操作多個KIT3。 5、程式設計電壓穩定,供電電流大。 6、完善介麵保護電路。短路不會壞。 KIT3適合開發使用,也適合批量生產燒寫使用。沒電腦也能燒程式! 7.官方開放標準電路。7.支援離線下載,可以適合現場程式升級和批量程式設計。8.直接調試PIC18FXXK係列,以及PIC16F72X等VPP低於10V的晶片,無須手動為VPP增加降壓電路。9. 燒寫調試電源輸出,並可以在軟體上進行調整.如dspic33f,可以直接輸出3.3V供電.。打開MPLAB IDE軟體,configure->select device 以PIC16F877A為例,1的位置相應工具前麵綠色,表示支持線上燒寫;2的位置相應工具前麵綠色,表示支持線上調試的;3 的位置是紅色就無需模擬頭直接調試,如果是綠色後麵帶的型號就是模擬頭的型號,需要模擬頭才可以調試。

3.4.2 原裝PCIkit3 

PG164130 supported list: https://pic-microcontroller.com/pickit-3-supported-devices/ 產品過期

3.4.3 原裝PCIkit4 

PG164140 70刀:https://www.microchip.com/en-us/development-tool/PG164140 帶固件恢複按鍵。

3.4.3.1 原裝Snap

PG164100 31刀但運費不菲:https://www.microchipdirect.com/dev-tools/PG164100 單板,外殼可打印:https://www.thingiverse.com/thing:3074301。與PICkit4比:同是USB高速(kit3是全速),1.8~5.5V目標機,需另外供電(kit4可以50mA)、隻能低壓編程且電壓不可調、不支持SD轉存(Programmer Go)。固件恢複可由軟件。

3.4.4 Curiosity Nano board

如帶PIC16F18446的: https://www.microchip.com/en-us/development-tool/DM164144 帶debugger芯片,編程口ICSPDAT/ICSPCLK/MCLR。板上VCON可用作獨立的串口調試器。USB供電VBUS經調壓後為1.7~VBUS為VTG供uP,另轉3V3給debugger,後者控製VBUS/VOFF;僅在VOFF對地短接時,可由VTG外接供電2.3-5.5V。板上RA2是LED,RC2對地是按鍵,32K晶體未連接,可補焊J210/211接RA4/5。RA0/1/3是ICSP的DAT/CLK/MCLR,RA0對地有47K,僅影響D/A和調試。DIP插頭可不焊直接插上。可以劃斷PCB使得debugger和f18446完全斷開,筆者建議:劃斷RA3-D3, RA3去NC腳外引去外編程口adapter腳6,內編程時NC跳接D3;外uP編程口6接地,/MCLR需上拉10K,由VTG供電。

XIDE 5.30可以用該板作其它編程:https://support.melabs.com/forum/picbasic-pro-compiler-3-0-and-later/microcode-studio-ide/8176-adventures-in-microchip-curiosity-nano-land 該文用MElabs MCS的創建用戶編程器,選 “c:Program Files (x86)MicrochipMPLABXv5.30mplab_platformmplab_ipeipecmd.exe”。如果是Windows下命令行,參數為:-TPPKOB -P16f1847 F -E -M -OL -OB -Y 參數細節運行該程序可見。Linux下XIDE 5.5對應的命令實例:ipecmd.sh -TPPK4 -P<32MZ2064DAS176-ID> -I -K -M -Fhttps://microchipsupport.force.com/s/article/Automate-MPLAB-programming-process-using-command-lineIPECMD 

3.4.5 用Arduino給PIC16F1847編程

https://www.youtube.com/watch?v=nbSd0FlJh0I? Arduino nano的RA0/1/3分別接PIC的ICSPCLK/ICSPDAT/MCLR,實測PIC16F1847成功。

3.4.6 其它編程器

http://picpgm.picprojects.net/hardware.html 

3.4.6 編程方法

上述工具多半隻能低壓編程,因為LVP缺省為1且隻能高壓改變。低壓編程時/MCLR=VPP必須由軟件拉低,且經ICSPDAT/ICSPCLK發送32b序列。標準6線為/MCLR-Vdd-Vss-DAT-CLK-NC。IPE是XIDE裏編程功能也可單獨運行,口令是microchip,用於燒入hex程序。多半也可由命令行編程。https://ww1.microchip.com/downloads/en/DeviceDoc/41439A.pdf https://www.best-microcontroller-projects.com/pic-icsp.html 

3.4.7 調試

debug:https://www.youtube.com/watch?v=RVPOhPopujs https://www.youtube.com/watch?v=RVPOhPopujs 

調試教程係列:https://www.youtube.com/playlist?list=PLtQdQmNK_0DTsTgCR47l9l6HHQIb6b3-T 不如早期的好:https://www.youtube.com/watch?v=pnkUOL0mmyA https://www.youtube.com/watch?v=O4IpwgWhqLY 

 

3.7 開發環境

 

點擊XIDE EDIT下的folder建立standalone app,選芯片,tool可選軟件simulator或硬件snap或nano板,然後會彈出編譯器選擇,可選的由XC8/CC5X/HI-TECH PICC和pic-as(匯編),我選XC8(v2.36),然後輸入項目名和目錄,缺省是C:Users用戶名MPLABXProjects項目名,結束。

此時GUI左下是dashboard,點擊其左上角彈出項目特性,可設置時鍾、串口緩存、include folder,更改編譯器等,先不必管。

項目打開後可點擊MCC圖標,XIDE 6需在彈出的Wizard中點擊中間的classic圖標,彈出一堆庫可選,包括DAC/LIN(串口)/TCPIP等。比起老版這是繁雜的開始,不管它點擊finish;XIDE 5直接進入。

點擊右下窗口Pin Manager選擇端口I/O,凡固定為輸出的點擊Output鎖定,其餘點擊Input鎖定。在右上窗口點System module|Easy setup書簽設置時鍾、WDT等,點Pin module|Easy setup配置各端口屬性,如初始電平、關閉模擬、上拉WPU等;這裏顯示的端口都是上一步鎖定的。

如果不顯示Pin Manager或芯片接腳圖,要點擊圖標行下,tab行中/右窗口右上角的打開按鈕。

MCC運行後在Project圖標右側增加Resource management書簽,點擊Generate圖標後,MCC生成代碼,在Project|Source files和Headfiles裏可以看見。打開其生成的main.c,將所有生成的head file都include進去。此步必不可少。用DM164144評價板的實例見3.8.1。

編譯後要注意源碼隔行的警鈴符號。點擊後發現PORT無定義但各bit有定義,XC8手冊沒有這個關鍵字,bug!

有時需要把缺省的C99標準變為C90以避免編譯出錯,方法是電機坐下窗外緣的圖標打開project配置,在C編譯的“XC8 Global options”中改變。

調試時,先點擊Window|Stimulator把Stimulus tab加在右下窗口中,給輸入腳如RA3加負脈衝,用時點擊Fire發送;在Variables中加觀察變量,也可打開Windows|Debug|Watches窗口。注意simulater不支持上拉,建議直接上硬件板,simulater有限製或bug。

閃存編程時可以獨立運行XIPE或命令行,更方便的是打開XIDE project配置,找到Conf:下的編程器如PKOB nano,點擊Apply,才會出現相應圖標。

5.35 MCC: download MCC 4.0.2 from https://www.microchip.com/en-us/development-tools-tools-and-software/embedded-software-center/mplab-code-configurator#Downloads and extract the files. Go XIDE Plugins|downloaded, Choose all *.nbm files and install.  

nano用printf 輸出到IDE terminal的例子:https://www.youtube.com/watch?v=PpmGGq5pPYw? 

 

3.8 實例

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,7
volatile 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? 基本流程是:監控到串口後由Boot loader開始固件更新,或啟動應用同時由應用監控PC的請求,複位交權給Boot loader;開始固件更新時由PC發出命令擦除、然後校驗、確定結果,更新後複位如前。8位源碼見AN1310或下載https://github.com/luciodj/PIC16-Serial-Bootloader,其它的可由廠家下載。

用戶手冊中建議Bootloader的cfg分為兩個拷貝:有/無cfg配置;end app分為三個:Standalone/Offset/Combined。先調好Standalone,再調好為Bootloader預留的Offset,最後把沒有配置的Bootlaoder加入到Combined項目裏,以免linker報“(944) data conflict error at...”錯。

實例:在XIDE中已建立的app下端右擊loadable,裝入下載的Bootloader ,注意兩者cfg配置要一樣否則報錯。

 

4. 取代方案舊DIP18芯片要取下改用IC插座。然後用比nano板大點的PCB板做adapter。Adapter的中間按300mil焊接單排針腳以便插入原PCB的DIP座,

Nano版上也加兩排針座焊在adapter上。Adapter是第二層而Nano板是第三層,Adapter到Nano間跳線

Nano  RA5  RA4  RA2  RA1       RC3  RC2  RC1  RC0  GND
7-Seg e=p4  d=p5               b=p9 a=10 f=p2 g=p1  
Conn.  7    6                   5    4    3    2   1=GND 9=0.7V
      KR1  KLMP                KR3  KR4       KR2  
16C54 RA1  RA0  CKO  CKI  VDD  RB7  RB6  RB5  RB4  
16C54 p18  17   16   15   14   13   12   11   10     
16C54 pin1  2    3    4    5    6    7    8    9     
16C54 RA2  RA3  T0KI VPP  VSS  RB9  RB1  RB2  RB3    
      RLY4 KPWR GND  5V   GND  RLMP RLY1 RLY2 RLY3  
Conn.       8         
7-Seg      c=p7        
Nano  RB4  RB6  RB5  RB7       RC5  RC4  RC6  RC7  GND

 

[ 打印 ]
閱讀 ()評論 (0)
評論
目前還沒有任何評論
登錄後才可評論.