; Orange programmer module v4.1 ; (c) 2010-2015 CnCLab. ;CHIP=PIC16F1503,2Kx14,p16F1509.hpl ;AREA=CODE,2Kx14,0 ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;IMAGE=pic16fs14 ;CHIP=PIC16LF1503,2Kx14,p16F1509.hpl ;AREA=CODE,2Kx14,0 ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;IMAGE=pic16fs14 ;CHIP=PIC16F1507,2Kx14,p16F1509.hpl ;AREA=CODE,2Kx14,0 ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;IMAGE=pic16fs20 ;CHIP=PIC16LF1507,2Kx14,p16F1509.hpl ;AREA=CODE,2Kx14,0 ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;IMAGE=pic16fs20 ;Config bits F1508/1509 DEVICES ONLY: ;FCMEN, IESO,FOSC2,DEBUG ; Primary Tested PIC16F1503 ; Based on DS41573C.PDF - PIC16F Memory Programming Specification ;Vihh High voltage on MCLR/VPP for Program/Verify mode entry 8-9V SOCKET=0 ALLPINS=28 INFO="PIC Adapter" OPTIONS=f,b CDELAY=1 ; PING=SDA,1,28 ;RB7 or RA0 PINO=CLK,0,27 ;RB6 or RA1 PINO=MCLR,5,1 ;/MCLR PING=GND,255,8 ;Vss PINO=VDD,254,20 R4=Erase,L,Cancel,Erase ;R1F=ROW_ADDR,H5 R8=CONFIG1,H R9=CONFIG2,H ;R10=FCMEN,L,Off,On ; Fail-Safe Clock Monitor Enable bit ;R11=IESO,L,Off,On ; Internal External Switchover bit R12=CLKOUTEN,L,On,Off ; Clock Out Enable bit R13=BOREN,L,Off,SBOREN,BUTSLLEP,On ; Brown-out Reset Enable bits(1) R14=CP,L,On,Off ; CP R15=MCLRE,L,DIGINPUT,MCLR ; MCLR/VPP Pin Function Select bit R16=PWRTE,L,On,Off ; Power-up Timer Enable bit(1) R17=WDTE,L,Off,SWDTEN,BUTSLLEP,On ; Watchdog Timer Enable bit R18=FOSC,L,INTOSC,ECL,ECM,ECH ; Oscillator Selection bits R19=LVP,L,Off,On ; Low-Voltage Programming Enable bit(1) ;R1A=DEBUG,L,On,Off ; In-Circuit Debugger Mode bit R1B=LPBOR,L,On,Off ;Low-Power BOR bit R1C=BORV,L,2_7V,1_9V ; Brown-out Reset Voltage Selection bit R1D=STVREN,L,Off,On ; Stack Overflow/Underflow Reset Enable bit R1E=WRT,L,ALL,HALF,200h,NONE ; Flash Memory Self-Write Protection bits ;R5=VCAPEN,L,RA0,RA5,RA6,Disable ;VCAP only for PIC16F193x ;----------------------------------------------------------- ;R0:CMD [_COMMAND] ;P=1 LOOP=(0,5){SDA=R0[I],CLK=P} ;P=1 [_OUTWORD] ;( R0:WORD) SDA=0,CLK=P LOOP=(0,13){SDA=R0[I],CLK=P} SDA=0,CLK=P [_INCADD] R7=ADR LOOP=(0,0xFFFF){ ;increment address to current value! R1F?R7{BREAK} _COMMAND(6) ;INCADD R1F=+1 ;PRINT=L("a"); } ;VDD - FIRST ENTRY MODE [INIT] VPP=0,MCLR=0 CLK=0,SDA=0,P=1000 R6=$VERIFY ;store ;PRINT=S("Power up...") $VERSION=/65536 $VERSION?3{ P=100000 ;charge MCLR=1 P=50000 ;charge2 } $VERSION?!3{ VPP=8800 ;9V max!!!! MCLR=1 ;Vcc pulse for re-enter prg mode } P=10000 ;PRINT=S(" ") R1F=0 ;current address register !!! ;------------------------------------------------- [_FUSE2BIT] R10=0,R11=0,R12=0,R13=0,R14=0 R15=0, R16=0,R17=0, R18=0 R19=0, R1B=0, R1C=0, R1D=0, R1E=0 R5=0 ; word 1 R18[0]=R8[0], R18[1]=R8[1] ;R18=FOSC R17[0]=R8[3], R17[1]=R8[4] ;R17=WDTE R16[0]=R8[5] ;R16=PWRTE R15[0]=R8[6] ;R15=MCLRE R14[0]=R8[7] ;R14=CP R13[0]=R8[9], R13[1]=R8[10] ;R13=BOREN R12[0]=R8[11] ;R12=CLKOUTEN ;R11[0]=R8[12] ;R11=IESO ;R10[0]=R8[13] ;R10=FCMEN ; word 2 R1E[0]=R9[0], R1E[1]=R9[1] ;R1E=WRT R1D[0]=R9[9] ;R1D=STVREN R1C[0]=R9[10] ;R1C=BORV R1B[0]=R9[11] ;R1B=LPBOR ;R1A[0]=R9[12] ;R1A=DEBUG R19[0]=R9[13] ;R19=LVP [_BIT2FUSE] ;copy separate bits to config word R8=0x3FFF,R9=0x3FFF R8[0]=R18[0], R8[1]=R18[1] ;R18=FOSC R8[3]=R17[0], R8[4]=R17[1] ;R17=WDTE R8[5]=R16[0] ;R16=PWRTE R8[6]=R15[0] ;R15=MCLRE R8[7]=R14[0] ;R14=CP R8[9]=R13[0], R8[10] = R13[1] ;R13=BOREN R8[11]=R12[0] ;R12=CLKOUTEN ;R8[12]=R11[0] ;R11=IESO ;R8[13]=R10[0] ;R10=FCMEN ; word 2 R9[0]=R1E[0], R9[1] = R1E[1] ;R1E=WRT R9[9]=R1D[0] ;R1D=STVREN R9[10]=R1C[0] ;R1C=BORV R9[11]=R1B[0] ;R1B=LPBOR ;R9[12]=R1A[0] ;R1A=DEBUG R9[13]=R19[0] ;R19=LVP ;--------------------------------------------------- [_SELFUSESAREA] ADR=0 _COMMAND(0) ;LDCONF Load Configuration _OUTWORD(0x3FFF) ; dummy!!! LOOP=(0,6){ ; goto adr 0x8007 _COMMAND(6) ;INCADD } ;--------------------------------------------------- [READ] ;R0=ADR,PRINT=L("READ=%04X. int adr=%04X\n",R0,R1F) $AREA?1{ R0=ADR R0?0{ _SELFUSESAREA } } $AREA?2{ R0=ADR R0?0{ _COMMAND(0) ;LDCONF _OUTWORD(0x3FFF) ; dummy!!! } } _INCADD R0=4 ;RDPROG ;$AREA?1{R0=5} ;RDDATA _COMMAND SDA=1,CLK=P R0=0 LOOP=(0,13){CLK=P,R0[I]=SDA} SDA=1,CLK=P DATA=R0 ;For Orange5 только через регистр! [WRITE] $AREA?1{ R0=ADR R0?0{ _SELFUSESAREA } } $AREA?2{ R0=ADR R0?0{ _COMMAND( 0 ) ;LDCONF R0=0x3FFF,_OUTWORD ; dummy!!! } } _INCADD R0=2 ;LDPROG ;$AREA?1{R0=3 } ;LDDATA _COMMAND SDA=0,CLK=P LOOP=(0,13){SDA=DATA[I],CLK=P} SDA=0,CLK=P _COMMAND( 8 ) ;BEG INT PROG P=3000 ; 2.5 ms to write [#!WRITEINIT] $AREA?0{ ;PRINT=L("INIT $BLOCKSIZE=%u $VERIFY=%u\n",$BLOCKSIZE,$VERIFY) $BLOCKSIZE?!0{ R0=$VERIFY R0[0]?1{$VERIFY=|2} $VERIFY=&2 } } [WRITEBLOCK] $AREA?!0{EXIT} ;only for code! R0=ADR,R0?0{ ;auto erase code PRINT=S("Erase..") _COMMAND(9) ;Bulk Erase Prg P=50000 PRINT=S("") } ;PRINT=L("$BLOCKSIZE=%u $VERIFY=%u\n",$BLOCKSIZE,$VERIFY) ;верификация блока не работает нормально из за смещения адреса. ;использовать проверку после записи ;$VERIFY=0 LOOP($BLOCKSIZE){ _INCADD _COMMAND(2) ;LDPROG SDA=0,CLK=P LOOP=(0,13){SDA=DATA[I],CLK=P} SDA=0,CLK=P ADR=+1 } _COMMAND(8) ;BEG INT PROG P=3000 ; 2.5 ms to write ;R0=$VERIFY,R0[0]?1{_COMMAND(0x16),R1F=0} ;Reset Address [Erase] R4=0 GET=("Erase",R4) RA?0{EXIT} R4?0{EXIT} ADR=0 P=50000 _COMMAND(9) ;Bulk Erase Prg P=150000 [!#EditCFG] $AREA=1 ;cfg ADR=0, R8=DATA ADR=1, R9=DATA PRINT=L("Config: %04lX : %04lX\n", R8, R9); _FUSE2BIT GET=("Write Fuses",R12,R13,R14,R15, R16,R17,R18,R19,R1B,R1C,R1D,R1E) RA?0{EXIT} _BIT2FUSE ADR=0, DATA=R8 ADR=1, DATA=R9 ["Read ID"] _COMMAND(0) ;LDCONF R0=0x3FFF,_OUTWORD ; dummy!!! ADR=0 LOOP=(0,5){ ;goto adr 0x8006 _COMMAND(6) ;INCADD } _COMMAND(4) ;RDPROG ;2006h SDA=0,CLK=P SDA=1 R0=0 LOOP=(0,13){CLK=P,R0[I]=SDA} SDA=1,CLK=P R1=R0 MCLR=0,CLK=0,SDA=0,VCC=0 R1=&0x3FE0 ;PIC12F1501 0010 1100 110x xxxx ;PIC12LF1501 0010 1101 100x xxxx ;PIC16F1503 0010 1100 111x xxxx ;PIC16LF1503 0010 1101 101x xxxx ;PIC16F1507 0010 1101 000x xxxx ;PIC16LF1507 0010 1101 110x xxxx ;PIC16F1508 0010 1101 001x xxxx ;PIC16LF1508 0010 1101 111x xxxx ;PIC16F1509 0010 1101 010x xxxx ;PIC16LF1509 0010 1110 000x xxxx R1?0x2CC0{PRINT=("ID = %04lX - PIC12F1501",R0),EXIT} R1?0x2D80{PRINT=("ID = %04lX - PIC12LF1501",R0),EXIT} R1?0x2CE0{PRINT=("ID = %04lX - PIC16F1503",R0),EXIT} R1?0x2DA0{PRINT=("ID = %04lX - PIC16LF1503",R0),EXIT} R1?0x2D00{PRINT=("ID = %04lX - PIC16F1507",R0),EXIT} R1?0x2DC0{PRINT=("ID = %04lX - PIC16LF1507",R0),EXIT} R1?0x2D20{PRINT=("ID = %04lX - PIC16F1508",R0),EXIT} R1?0x2DE0{PRINT=("ID = %04lX - PIC16LF1508",R0),EXIT} R1?0x2D40{PRINT=("ID = %04lX - PIC16F1509",R0),EXIT} R1?0x2E00{PRINT=("ID = %04lX - PIC16LF1509",R0),EXIT} PRINT=("ID = %04lX",R0) [#END] MCLR=0 VPP=0 CLK=0,SDA=0 $AREA?0{ RE?2{$VERIFY=R6} ;restore after write and verify blocks ;R6=$VERIFY, PRINT=L("END...VERIFY=%u, OP=%u\n",R6,RE) }