; Orange programmer module v4.1 ; (c) 2010-2015 CnCLab. ;CHIP=PIC16LF1902,2Kx14,p16F1947.hpl ;AREA=CODE,2Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;CHIP=PIC16LF1903,4Kx14,p16F1947.hpl ;AREA=CODE,4Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;CHIP=PIC16LF1904,4Kx14,p16F1947.hpl ;AREA=CODE,4Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;CHIP=PIC16LF1906,8Kx14,p16F1947.hpl ;AREA=CODE,8Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;CHIP=PIC16LF1907,8Kx14,p16F1947.hpl ;AREA=CODE,8Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;CHIP=PIC16F1933,4Kx14,p16F1947.hpl ;AREA=CODE,4Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16LF1933,4Kx14,p16F1947.hpl ;AREA=CODE,4Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;CHIP=PIC16F1934,4Kx14,p16F1947.hpl ;AREA=CODE,4Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16LF1934,4Kx14,p16F1947.hpl ;AREA=CODE,4Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;CHIP=PIC16F1936,8Kx14,p16F1947.hpl ;AREA=CODE,8Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16LF1936,8Kx14,p16F1947.hpl ;AREA=CODE,8Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;CHIP=PIC16F1937,8Kx14,p16F1947.hpl ;AREA=CODE,8Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16LF1937,8Kx14,p16F1947.hpl ;AREA=CODE,8Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;CHIP=PIC16F1938,16Kx14,p16F1947.hpl ;AREA=CODE,16Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16LF1938,16Kx14,p16F1947.hpl ;AREA=CODE,16Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;CHIP=PIC16F1939,16Kx14,p16F1947.hpl ;AREA=CODE,16Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16LF1939,16Kx14,p16F1947.hpl ;AREA=CODE,16Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;CHIP=PIC16F1946,8Kx14,p16F1947.hpl ;AREA=CODE,8Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16LF1946,8Kx14,p16F1947.hpl ;AREA=CODE,8Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ;CHIP=PIC16F1947,16Kx14,p16F1947.hpl ;AREA=CODE,16Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16LF1947,16Kx14,p16F1947.hpl ;AREA=CODE,16Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;VCC=3250 ; Primary Tested PIC16F1933 ; Based on 41390C.PDF - PIC16F/LF182X/PIC12F/LF1822 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,Code,Data,All ;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=PROTECT,L,ALL,_DATA,CODE,NONE ; CPD and 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,LP,XT,HS,RC,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=BORV,L,2_7V,1_9V ; Brown-out Reset Voltage Selection bit R1C=STVREN,L,Off,On ; Stack Overflow/Underflow Reset Enable bit R1D=PLLEN,L,Off,On ; 4xPLL 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 } ;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, R1A=0, R1B=0, R1C=0, R1D=0, R1E=0 R5=0 ; word 1 R18[0] = R8[0], R18[1] = R8[1], R18[2] = R8[2] R17[0] = R8[3], R17[1] = R8[4] R16[0] = R8[5] R15[0] = R8[6] R14[0] = R8[7], R14[1] = R8[8] R13[0]= R8[9], R13[1] = R8[10] R12[0] = R8[11] R11[0]= R8[12] R10[0] = R8[13] ; word 2 R1E[0] = R9[0], R1E[1] = R9[1] R5[0]=R9[4],R5[1]=R9[5] R1D[0]= R9[8] R1C[0]= R9[9] R1B[0]= R9[10] R1A[0]= R9[12] R19[0]= R9[13] [_BIT2FUSE] ;() ;copy separate bits to config word R8=0x3FFF,R9=0x3FFF R8[0]=R18[0], R8[1]=R18[1], R8[2]=R18[2] R8[3]=R17[0], R8[4]=R17[1] R8[5] = R16[0] R8[6] = R15[0] R8[7] = R14[0], R8[8] = R14[1] R8[9] = R13[0], R8[10] = R13[1] R8[11] = R12[0] R8[12] = R11[0] R8[13] = R10[0] ; word 2 R9[0] = R1E[0], R9[1] = R1E[1] R9[4] = R5[0], R9[5]=R5[1] R9[8] = R1D[0] R9[9] = R1C[0] R9[10] = R1B[0] R9[12] = R1A[0] R9[13] = R19[0] ;--------------------------------------------------- [_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?2{ R0=ADR R0?0{ _SELFUSESAREA } } $AREA?3{ 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?2{ R0=ADR R0?0{ _SELFUSESAREA } } $AREA?3{ 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 ;0 Cancel,1 Code, 2 Data, 3 All R4?1{ ;Code _COMMAND(9) ;Bulk Erase Prg } R4?2{ ;Data _COMMAND(0x0B) ;Bulk Erase Data } R4?3{ ;All ; for erase User ID Locations set address Address 8000h _COMMAND(0) ;LDCONF Load Configuration _OUTWORD(0x3FFF) ;dummy P=10 _COMMAND(9) ;Chip Erase P=50000 _COMMAND(0x0B) ;Bulk Erase Data Memory } P=150000 [!#EditCFG] $AREA=2 ;cfg ADR=0, R8=DATA ADR=1, R9=DATA PRINT=L("Config: %04lX : %04lX\n", R8, R9); _FUSE2BIT GET=("Write Fuses",R10,R11,R12,R13,R14,R15, R16,R17,R18,R19,R1A,R1B,R1C,R1D,R5,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 R1?0x2300{PRINT=("ID = %04lX - PIC16F1933",R0),EXIT} R1?0x2340{PRINT=("ID = %04lX - PIC16F1934",R0),EXIT} R1?0x2360{PRINT=("ID = %04lX - PIC16F1936",R0),EXIT} R1?0x2380{PRINT=("ID = %04lX - PIC16F1937",R0),EXIT} R1?0x23A0{PRINT=("ID = %04lX - PIC16F1938",R0),EXIT} R1?0x23C0{PRINT=("ID = %04lX - PIC16F1939",R0),EXIT} R1?0x2400{PRINT=("ID = %04lX - PIC16LF1933",R0),EXIT} R1?0x2440{PRINT=("ID = %04lX - PIC16LF1934",R0),EXIT} R1?0x2460{PRINT=("ID = %04lX - PIC16LF1936",R0),EXIT} R1?0x2480{PRINT=("ID = %04lX - PIC16LF1937",R0),EXIT} R1?0x24A0{PRINT=("ID = %04lX - PIC16LF1938",R0),EXIT} R1?0x24C0{PRINT=("ID = %04lX - PIC16LF1939",R0),EXIT} R1?0x2500{PRINT=("ID = %04lX - PIC16F1946",R0),EXIT} R1?0x2520{PRINT=("ID = %04lX - PIC16F1947",R0),EXIT} R1?0x2580{PRINT=("ID = %04lX - PIC16LF1946",R0),EXIT} R1?0x25A0{PRINT=("ID = %04lX - PIC16LF1947",R0),EXIT} R1?0x2C00{PRINT=("ID = %04lX - PIC16LF1903",R0),EXIT} R1?0x2C20{PRINT=("ID = %04lX - PIC16LF1902",R0),EXIT} R1?0x2C40{PRINT=("ID = %04lX - PIC16LF1907",R0),EXIT} R1?0x2C60{PRINT=("ID = %04lX - PIC16LF1906",R0),EXIT} R1?0x2C80{PRINT=("ID = %04lX - PIC16LF1904",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) }