; Orange programmer module v2.1 ; (c) 2005-2014 CnCLab. ;CHIP=PIC16F722,2Kx14,p16F727.hpl ;AREA=CODE,2Kx14,0 ;AREA=CONFIG ,2x14,0,0x400E ;AREA=USER_ID,4x14,0,0x4000 ;CHIP=PIC16F722,2Kx14,p16F727.hpl ;AREA=CODE,2Kx14,0 ;AREA=CONFIG ,2x14,0,0x400E ;AREA=USER_ID,4x14,0,0x4000 ;VCC=3250 ;CHIP=PIC16F723,4Kx14,p16F727.hpl ;AREA=CODE,4Kx14,0 ;AREA=CONFIG ,2x14,0,0x400E ;AREA=USER_ID,4x14,0,0x4000 ;CHIP=PIC16F724,4Kx14,p16F727.hpl ;AREA=CODE,4Kx14,0 ;AREA=CONFIG ,2x14,0,0x400E ;AREA=USER_ID,4x14,0,0x4000 ;CHIP=PIC16F726,8Kx14,p16F727.hpl ;AREA=CODE,8Kx14,0 ;AREA=CONFIG ,2x14,0,0x400E ;AREA=USER_ID,4x14,0,0x4000 ;CHIP=PIC16F727,8Kx14,p16F727.hpl ;AREA=CODE,8Kx14,0 ;AREA=CONFIG ,2x14,0,0x400E ;AREA=USER_ID,4x14,0,0x4000 ; Primary Tested PIC16F722-I/SS ; Based on DS41332D - PIC16(L)F72X 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 PING=GND1,255,19 ;Vss PINO=VDD,254,20 ;R8=CONFIG1,H ;R9=CONFIG2,H ;CONFIG1: R10=FOSC,L,000:LP,001:XT,010:HS,011:EC,100:INTOSC,101:INTOSC,101:RC,111:RC-CLKOUT ; Oscillator Selection bits R11=WDTE,L,0:Off,1:On ; Watchdog Timer Enable bit R12=PWRTE,L,0:On,1:Off ; Power-up Timer Enable bit(1) R13=MCLRE,L,0:DIGINPUT,1:MCLR ; MCLR/VPP Pin Function Select bit R14=CP,L,0:On,1:Off ; CP R15=BOREN,L,00,01,10,11 ; Brown-out Reset Enable bits R16=BORV,L,0:2.5V,1:1.9V ; Brown-out Reset Voltage Selection bit R17=PLLEN,L,0:500K,1:16M ; 4xPLL Enable bit R18=DEBUG,L,0:On,1:Off ; In-Circuit Debugger Mode bit ;CONFIG2: R19=VCAPEN,L,00,01,10,11 ; For PIC16LF72X bits are ignored! ;----------------------------------------------------------- ;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=(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 !!! ;------------------------------------------------- ;R8,R9 [_FUSE2BIT] R10=0,R11=0,R12=0,R13=0,R14=0 R15=0,R16=0,R17=0,R18=0,R19=0 ; word 1 R10[0]=R8[0] R10[1]=R8[1] R10[2]=R8[2] ;FOSC,L,000:LP,001:XT,010:HS,011:EC,100:INTOSC,101:INTOSC,101:RC,101:RC-CLKOUT ; Oscillator Selection bits R11[0]=R8[3] ;WDTE,L,0:Off,1:On R12[0]=R8[4] ;PWRTE,L,0:On,1:Off R13[0]=R8[5] ;MCLRE,L,0:DIGINPUT,1:MCLR R14[0]=R8[6] ;CP,L,0:On,1:Off R15[0]=R8[8] R15[1]=R8[9] ;BOREN,L,00,01,10,11 R16[0]=R8[10] ;BORV,L,0:2.5V,1:1.9V R17[0]=R8[12] ;PLLEN,L,0:500K,1:16M R18[0]=R8[13] ;DEBUG,L,0:On,1:Off ;CONFIG2: R19[0]=R9[4] R19[1]=R9[5] ;R19=VCAPEN,L,00,01,10,11 ;R8,R9 copy separate bits to config word [_BIT2FUSE] R8=0x3FFF,R9=0x3FFF R8[0]=R10[0] R8[1]=R10[1] R8[2]=R10[2] ;FOSC, R8[3]=R11[0] ;WDTE, R8[4]=R12[0] ;PWRTE, R8[5]=R13[0] ;MCLRE R8[6]=R14[0] ;CP R8[8]=R15[0] R8[9]=R15[1] ;BOREN R8[10]=R16[0] ;BORV R8[12]=R17[0] ;PLLEN R8[13]=R18[0] ;DEBUG R9[4]=R19[0] R9[5]=R19[1] ;VCAPEN ;--------------------------------------------------- [_SELFUSESAREA] ADR=0 _COMMAND( 0 ) ;LDCONF R0=0x3FFF,_OUTWORD ; 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 _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{ ;conf R0=ADR R0?0{ _COMMAND( 0 ) ;LDCONF _OUTWORD(0x3FFF) ; dummy!!! } } _INCADD _COMMAND(2) ;LDPROG 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 $AREA?1{P=3000} ;Configuration fuses min 5ms [Erase] ADR=0 P=10000 ;_COMMAND( 0 ) ;LDCONF ;R0=0x3FFF,_OUTWORD ; dummy!!! ;P=100 _COMMAND(9) ;Chip Erase P=500000 [!#"Edit CFG"] $AREA=1 ;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) 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?0x1880{PRINT=("ID = %04lX - PIC16F722",R0),RETURN} R1?0x1B20{PRINT=("ID = %04lX - PIC16F722A",R0),RETURN} R1?0x1860{PRINT=("ID = %04lX - PIC16F723",R0),RETURN} R1?0x1B00{PRINT=("ID = %04lX - PIC16F723A",R0),RETURN} R1?0x1840{PRINT=("ID = %04lX - PIC16F724",R0),RETURN} R1?0x1820{PRINT=("ID = %04lX - PIC16F726",R0),RETURN} R1?0x1800{PRINT=("ID = %04lX - PIC16F727",R0),RETURN} R1?0x1980{PRINT=("ID = %04lX - PIC16LF722",R0),RETURN} R1?0x1B60{PRINT=("ID = %04lX - PIC16LF722A",R0),RETURN} R1?0x1960{PRINT=("ID = %04lX - PIC16LF723",R0),RETURN} R1?0x1B40{PRINT=("ID = %04lX - PIC16LF723A",R0),RETURN} R1?0x1940{PRINT=("ID = %04lX - PIC16LF724",R0),RETURN} R1?0x1920{PRINT=("ID = %04lX - PIC16LF726",R0),RETURN} R1?0x1900{PRINT=("ID = %04lX - PIC16LF727",R0),RETURN} R1?0x2780{PRINT=("ID = %04lX - PIC16F1826",R0 ),RETURN} R1?0x27A0{PRINT=("ID = %04lX - PIC16F1827",R0 ),RETURN} R1?0x2880{PRINT=("ID = %04lX - PIC16LF1826",R0 ),RETURN} R1?0x28A0{PRINT=("ID = %04lX - PIC16LF1827",R0 ),RETURN} R1?0x2720{PRINT=("ID = %04lX - PIC16F1823",R0 ),RETURN} R1?0x2820{PRINT=("ID = %04lX - PIC16LF1823",R0 ),RETURN} R1?0x2700{PRINT=("ID = %04lX - PIC12F1822",R0 ),RETURN} R1?0x2800{PRINT=("ID = %04lX - PIC12LF1822",R0 ),RETURN} R1?0x2740{PRINT=("ID = %04lX - PIC16F1824",R0 ),RETURN} R1?0x2840{PRINT=("ID = %04lX - PIC16LF1824",R0 ),RETURN} R1?0x2760{PRINT=("ID = %04lX - PIC16F1825",R0 ),RETURN} R1?0x2860{PRINT=("ID = %04lX - PIC16LF1825",R0 ),RETURN} R1?0x27C0{PRINT=("ID = %04lX - PIC16F1828",R0 ),RETURN} R1?0x28C0{PRINT=("ID = %04lX - PIC16LF1828",R0 ),RETURN} R1?0x27E0{PRINT=("ID = %04lX - PIC16F1829",R0 ),RETURN} R1?0x28E0{PRINT=("ID = %04lX - PIC16LF1829",R0 ),RETURN} PRINT=("ID = %04lX",R0) [#END] MCLR=0 VPP=0 CLK=0,SDA=0