Microchip PIC

打印 被阅读次数

警告: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 -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 //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

 

登录后才可评论.