找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4089|回复: 2
收起左侧

初用microchip的实践

[复制链接]
ID:22218 发表于 2022-3-19 03:34 | 显示全部楼层 |阅读模式
警告:PIC系列的软件bug很多而且老变,除非你要直插代替,不要用它。arduino要好的太多太多,也支持ESP32。用低压5V编程时,PICKit没有调试功能!10年后芯片闪会飞!
其实我20年前用过,但只是汇编,发定时精确的短脉冲让电视机进入工厂调试模式。上月因抽油烟机随机跳变,上网看要1000美刀,花了20美刀买了PICjit3.5和几个片子,仿真了一下,烧入后一次成功,证实原来的芯片跑飞了!下面是这次工作的小结,对初次接触PIC的可能有帮助。我就用过16C54和这次的F1847,谬误请指正。一句话,装XIDE和XC8,仿真后烧入,跑!
1. 几款8bit uP
老片子16C54偶尔可见价格比新的贵。因此找了一下在产的18、20脚片子。
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
指令系统:
上两片子的优点合并就是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
类似F1847但为20pin封装,有A/D。DM164144为其低价nano板带debugger和编程见3.4.4。
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也没能在函数中产生额外代码,换句话没法换段。用MCC配置较为方便,但是就只能用XC8。
旧版: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
包括汇编器、链接器和实用程序;汇编器支持定点和浮点数据、宏、命令行,LIB是库。
源码:https://github.com/microchip-pic-avr-examples
Newark yahooC1,t440p: 28d2445b88ec,
3.2.2 CC5X
效率最高:安装在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/ HiTECH-C已断档。
3.3  X SIM
MPLAB X SIM是软件仿真工具。安装后得hostid:54e1add0e1a。
一个大缺陷是不支持上拉。有人写了SCL脚本,在Stimulus中经Attach SCL File载入。
3.4  调试/编程器
3.4.1 山寨的PICkit 3/3.5调试/编程器
未必都可靠。v=UiTKBwKBf6g PICkit 3.5比3多了固件恢复,均可与原厂XIDE/ISP联用,6线接口用于调试和编程。我用PICkit 3.5没几次感觉不错,ZIF直插不用连线,第二次运行后固件自动更新了。
PICkit 3.5,可选带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:How-to-load-a-SQTP-file-in-MPLAB-IPE。但我觉得还是在XIDE下编程为好,在XIDE下编程的步骤:
1.项目配置若为Simulator改成相关硬件如PICKit 3,2.项目配置中PICKit3,Option下拉选Power,勾选5V3.工具行点击往下指向芯片的图标“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:
3.4.3 原装PCIkit4
PG164140 70刀:PG164140 带固件恢复按键。
3.4.3.1 原装Snap
PG164100 31刀但运费不菲:PG164100 单板,外壳可打印:与PICkit4比:同是USB高速(kit3是全速),1.8~5.5V目标机,需另外供电(kit4可以50mA)、只能低压编程且电压不可调、不支持SD转存(Programmer Go)。固件恢复可由软件。割线后运行XIDE5.3据说可作通用编程器。
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可以用该板作其它编程:该文用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 -F
我建议XIDE 5.30,因为上述的缘故,而且6.0的MCC链接去几个网页,慢且啰嗦。我还是喜欢什么东西都在本地的软件,不要时不时链接去互联网,后者变的快谁知链接会不会失效?
3.4.5 用Arduino给PIC16F1847编程
v=nbSd0FlJh0I? Arduino nano的RA0/1/3分别接PIC的ICSPCLK/ICSPDAT/MCLR,实测PIC16F1847成功。
3.4.6 其它编程器

3.4.6 编程方法
上述工具多半只能低压编程,因为LVP缺省为1且只能高压改变。低压编程时/MCLR=VPP必须由软件拉低,且经ICSPDAT/ICSPCLK发送32b序列。标准6线为/MCLR-Vdd-Vss-DAT-CLK-NC。IPE是XIDE里编程功能也可单独运行,口令是microchip,用于烧入hex程序。多半也可由命令行编程。

3.4.7 调试
debug:v=RVPOhPopujs v=RVPOhPopujs
调试教程系列:playlist?list=PLtQdQmNK_0DTsTgCR47l9l6HHQIb6b3-T 不如早期的好:v=pnkUOL0mmyA 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,才会出现相应图标。

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,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? 基本流程是:监控到串口后由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配置要一样否则报错。
这段我没试过,备忘。
回复

使用道具 举报

ID:195496 发表于 2022-10-26 19:24 | 显示全部楼层
还没有搞明白,XIDE平台又不支持KIT3了,
回复

使用道具 举报

ID:183271 发表于 2023-10-3 09:48 | 显示全部楼层
大漠落日 发表于 2022-10-26 19:24
还没有搞明白,XIDE平台又不支持KIT3了,

最新版的 V6.15 又支持Kit3 Snipaste_2023-10-03_09-46-56.png

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表