; Orange programmer module v4.1 ; (c) 2005-2013 CnCLab. Edited by EugenOS ; CHIP=PIC12F1822,2Kx14 ; CHIP=PIC12LF1822,2Kx14 ; CHIP=PIC16F1823,2Kx14 ; CHIP=PIC16LF1823,2Kx14 ; CHIP=PIC16F1824,4Kx14 ; CHIP=PIC16LF1824,4Kx14 ; CHIP=PIC16F1825,8Kx14 ; CHIP=PIC16LF1825,8Kx14 ; CHIP=PIC16F1826,2Kx14 ; CHIP=PIC16LF1826,2Kx14 ; CHIP=PIC16F1827,4Kx14 ; CHIP=PIC16LF1827,4Kx14 ; CHIP=PIC16F1828,4Kx14 ; CHIP=PIC16LF1828,4Kx14 ; CHIP=PIC16F1829,8Kx14 ; CHIP=PIC16LF1829,8Kx14 ;CHIP=PIC12F1822,2Kx14,p1xF182x.hpl ;AREA=CODE,2Kx14(8),0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16F1823,2Kx14,p1xF182x.hpl ;AREA=CODE,2Kx14(8),0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16F1824,4Kx14,p1xF182x.hpl ;AREA=CODE,4Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16F1825,8Kx14,p1xF182x.hpl ;AREA=CODE,8Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16F1826,2Kx14,p1xF182x.hpl ;AREA=CODE,2Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16F1827,4Kx14,p1xF182x.hpl ;AREA=CODE,4Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16F1828,4Kx14,p1xF182x.hpl ;AREA=CODE,4Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ;CHIP=PIC16F1829,8Kx14,p1xF182x.hpl ;AREA=CODE,8Kx14,0 ;AREA=DATA,256,0,0x1E000,b ;AREA=CONFIG ,2x14,0,0x1000E ;AREA=USER_ID,4x14,0,0x10000 ; Primary Tested PIC12LF1822,PIC12F1822 ; 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=8 INFO="PIC Adapter" OPTIONS=f,b CDELAY=1 ; PING=SDA,1,7 ;RB7 or RA0 PINO=CLK,0,6 ;RB6 or RA1 PINO=MCLR,5,4 ;/MCLR PING=GND,255,8 ;Vss PINO=VDD,254,1 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 ;#def AREA_CODE=0 ;#def AREA_DATA=1 ;#def AREA_CFG=2 ;#def AREA_USERID=3 ;#def FCMEN=R10 ;#def IESO=R11 ;#def CLKOUTEN=R12 ;#def BOREN=R13 ;#def PROTECT=R14 ;#def MCLRE=R15 ;#def PWRTE=R16 ;#def WDTE=R17 ;#def FOSC=R18 ;#def LVP=R19 ;#def DEBUG=R1A ;#def BORV=R1B ;#def STVREN=R1C ;#def PLLEN=R1D ;#def WRT=R1E ;#def curAddr=R1F ;13 12 11 10 9 8 7 ;R10 R11 R12 R131 R130 CPD CP ;6 5 4 3 2 1 0 ;R15 R16 R171 R170 R182 R181 R180 ;#struct config1=R8 ; FOSC=3 ; WDTE=2 ; PWRTE ; MCLRE ; PROTECT=2 ; BOREN=2 ; CLKOUTEN ; IESO ; FCMEN ;#ends ;13 12 10 9 8 1 0 ;R19 R1A R1B R1C R1D R1E1 R1E0 ;#struct config2=R9 ; WRT=2 ; RESERVED=6 ; PLLEN ; STVREN ; BORV ; UNUSED ; DEBUG ; LVP ;#ends ;------------------- COMMANDS ------------------------------ ;#def cmdLoadCfg=0 ;#def cmdLdProg=2 ;#def cmdLdData=3 ;#def cmdRdProg=4 ;#def cmdRdData=5 ;#def cmdIncAddr=6 ;#def cmdRstAddr=0x16 ;#def cmdBeginIntPgm=8 ;#def cmdBeginExtPgm=0x18 ;#def cmdEndExtPgm=0xA ;#def cmdBulkEraPgm=9 ;#def cmdBulkEraData=0x0B ;#def cmdRowEraPgm=0x11 ;----------------------------------------------------------- ;[_PULSE] ;CLK=P [_COMMAND] ;( R0:CMD ) ;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 ; 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] 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[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] ADR=0 P=100000 ; for erase User ID Locations set address Address 8000h _COMMAND(0) ;LDCONF Load Configuration _OUTWORD(0x3FFF) ;dummy P=10 _COMMAND(9) ;Chip Erase ;R0=8,_COMMAND ;begin P=50000 _COMMAND(0x0B) ;Bulk Erase Data Memory P=50000 [EraseCode] ADR=0 P=50000 _COMMAND(9) ;Bulk Erase Prg ;R0=8,_COMMAND ;begin P=50000 [EraseData] ADR=0 P=50000 _COMMAND(0x0B) ;Bulk Erase Data ;R0=8,_COMMAND ;begin P=50000 [_EraseRow] GET=("RowAddr", R1F ); RA?0{EXIT} R1F[15]?1{ R1F[15]=0 R0=0,_COMMAND ;LDCONF R0=0x3FFF,_OUTWORD ; dummy!!! } ADR=R1F, R1F=0 P=50000 _INCADD _COMMAND( 0x11 ) P=50000 [!#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,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?0x2780{PRINT=("ID = %04lX - PIC16F1826",R0 ), EXIT } R1?0x27A0{PRINT=("ID = %04lX - PIC16F1827",R0 ), EXIT } R1?0x2880{PRINT=("ID = %04lX - PIC16LF1826",R0 ), EXIT } R1?0x28A0{PRINT=("ID = %04lX - PIC16LF1827",R0 ), EXIT } R1?0x2720{PRINT=("ID = %04lX - PIC16F1823",R0 ), EXIT } R1?0x2820{PRINT=("ID = %04lX - PIC16LF1823",R0 ), EXIT } R1?0x2700{PRINT=("ID = %04lX - PIC12F1822",R0 ), EXIT } R1?0x2800{PRINT=("ID = %04lX - PIC12LF1822",R0 ), EXIT } R1?0x2740{PRINT=("ID = %04lX - PIC16F1824",R0 ), EXIT } R1?0x2840{PRINT=("ID = %04lX - PIC16LF1824",R0 ), EXIT } R1?0x2760{PRINT=("ID = %04lX - PIC16F1825",R0 ), EXIT } R1?0x2860{PRINT=("ID = %04lX - PIC16LF1825",R0 ), EXIT } R1?0x27C0{PRINT=("ID = %04lX - PIC16F1828",R0 ), EXIT } R1?0x28C0{PRINT=("ID = %04lX - PIC16LF1828",R0 ), EXIT } R1?0x27E0{PRINT=("ID = %04lX - PIC16F1829",R0 ), EXIT } R1?0x28E0{PRINT=("ID = %04lX - PIC16LF1829",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) }