; Orange programmer module v3.5 ; (c) 2000-2014 CnCLab ;CHIP=PIC12F609,1Kx14,P12F616.HPL ;AREA=CODE,1Kx14,0 ;AREA=CONFIG,1x14,0,0x400E ;CHIP=PIC12HV609,1Kx14,P12F616.HPL ;AREA=CODE,1Kx14,0 ;AREA=CONFIG,1x14,0,0x400E ;CHIP=PIC12F610,1Kx14,P12F616.HPL ;AREA=CODE,1Kx14,0 ;AREA=CONFIG,1x14,0,0x400E ;CHIP=PIC12HV610,1Kx14,P12F616.HPL ;AREA=CODE,1Kx14,0 ;AREA=CONFIG,1x14,0,0x400E ;CHIP=PIC12F615,1Kx14,P12F616.HPL ;AREA=CODE,1Kx14,0 ;AREA=CONFIG,1x14,0,0x400E ;CHIP=PIC12HV615,1Kx14,P12F616.HPL ;AREA=CODE,1Kx14,0 ;AREA=CONFIG,1x14,0,0x400E ;CHIP=PIC12F616,2Kx14,P12F616.HPL ;AREA=CODE,2Kx14,0 ;AREA=CONFIG,1x14,0,0x400E ;CHIP=PIC12HV616,2Kx14,P12F616.HPL ;AREA=CODE,2Kx14,0 ;AREA=CONFIG,1x14,0,0x400E ;CHIP=PIC12F617,2Kx14,P12F616.HPL ;AREA=CODE,2Kx14,0 ;AREA=CONFIG,1x14,0,0x400E ; Microchip 41284E.pdf PIC12F6XX/ Memory Programming Specification: ;PIC12F615, PIC12HV615, PIC12F609, PIC12HV609, PIC12F617, ;PIC16HV616, PIC16F616 , PIC16HV610, PIC16F610 ; No Tested ; Orange3,4,SE ALLPINS=8 INFO="PIC Adapter" ; PING=SDA,1,7 ;GP0 PINO=CLK,0,6 ;GP1 PINO=MCLR,5,4 ;/MCLR PINO=VDD,254,1 ;Vdd PING=GND,255,8 ;Vss CDELAY=2 R1=CONFIG,H R6=Erase,L,None,Code,Code+UserID R10=FOSC,L,000:LP,001:XT,010:HS,011:EC(GP4-IO),100:intOSCIO,101:intOSC,110:extRCIO,111:extRC R11=WDTE,L,0:On,1:Off R12=PWRTE,L,0:On,1:Off R13=MCLRE,L,0:Off,1:On R14=CP,L,0:Code Protect,1:Off R15=IOSCFS,L,"0:4MHz,1:8MHz" R16=BOREN,L,00,01,10,11 R1A=CALIBR,H4 ;R8 use for store address [_PULSE] CLK=1,P=3,CLK=0,P=3 [_COMMAND] ; R0 - CMD P=1 LOOP=(0,5){SDA=R0[I],CLK=P} P=1 [_OUTWORD] SDA=0,CLK=P LOOP=(0,13){SDA=R0[I],CLK=P} SDA=0,CLK=P [_INWORD] R1=0 SDA=1,CLK=P LOOP=(0,13){CLK=P,R1[I]=SDA} SDA=1,CLK=P [_INCADD] R8=ADR LOOP=(0xFFFF){ ;increment address to current value! R9?R8{BREAK} _COMMAND(6) ;INCADD R9=+1 } [!#SETUP] R6=0 $WDELAY=6000 ;VDD-FIRST PROGRAM/VERIFY MODE ENTRY [INIT] CLK=0,SDA=0,MCLR=0 $VERSION=/65536 $VERSION?3{ PRINT=S("Power up...") P=600000 ;charge Vpp cap! } P=50000 VPP=12000,P=10 ;O4! MCLR=1 ;Vcc pulse for re-enter prg mode ;Programm/Verify Mode! P=250000 PRINT=S(" ") R9=0 ;currrent address register ;-------------------------------------------------------- [_FUSE2BIT] ; unpack config word ;13 12 11 10 9 8 7 6 5 4 3 2 1 0 ; - - - - BOREN1 BOREN0 IOSCFS CP MCLRE PWRTE WDTE FOSC2 F0SC1 F0SC0 R10=0,R11=0,R12=0,R13=0,R14=0,R15=0,R16=0 R10[0]=R1[0] ;FOSC0 R10[1]=R1[1] ;FOSC1 R10[2]=R1[2] ;FOSC2 R11[0]=R1[3] ;WDTE R12[0]=R1[4] ;PWRTE R13[0]=R1[5] ;MCLRE R14[0]=R1[6] ;CP R15[0]=R1[7] ;IOSCFS R16[0]=R1[8] ;BOREN0 R16[1]=R1[9] ;BOREN1 [_BIT2FUSE] ;copy separate bits to config word R1=0x3FFF ; Unimplemented bit, read as '1' R1[0]=R10[0] ;FOSC0 R1[1]=R10[1] ;FOSC1 R1[2]=R10[2] ;FOSC2 R1[3]=R11[0] ;WDTE R1[4]=R12[0] ;PWRTE R1[5]=R13[0] ;MCLRE R1[6]=R14[0] ;CP R1[7]=R15[0] ;IOSCFS R1[8]=R16[0] ;BOREN0 R1[9]=R16[1] ;BOREN1 ;PRINT=("Configuration Word = %04lX",R1) [_READFUSES] _COMMAND(0) ;LDCONF _OUTWORD(0x3FFF) ; dummy ADR=0 LOOP=(7){ ; goto adr 0x2007 _COMMAND(4) ; LDPROG _INWORD _COMMAND(6) ;INCADD } ADR=0 _COMMAND(4) ;RDPROG _INWORD ;PRINT=S("Configuration Word = %04lX",R1) ;copy config world to separate bits DATA=R1 [_WRITEFUSES] ADR=0 _COMMAND(0) ;LDCONF _OUTWORD(0x3FFF) ; dummy data LOOP=(7){ ; goto adr 0x2007 _COMMAND(4) ; LDPROG _INWORD _COMMAND(6) ;INCADD } ADR=0 _COMMAND(2) ;LDPROG R1=DATA _OUTWORD(R1) ;config _COMMAND(0x18) ;BEGPRG Externally Timed Timed P=$WDELAY P=20000 ;add _COMMAND(01010B) ;ENDPRG ; check? _COMMAND(4) ;RDPROG R2=R1 _INWORD R1?!R2{PRINT=("Write error! [%04lX]",R1)} ;-------------------------------------------------------- [READ] $AREA?1{_READFUSES,RETURN} _INCADD R0=4 ;RDPROG _COMMAND _INWORD DATA=R1 [WRITE] $AREA?1{_WRITEFUSES,RETURN} _INCADD $AREA?0{ R0=DATA,R0=&0x3FFF R0?0x3FFF{RETURN} ;не пишем пустые во FLASH для ускорения _COMMAND(2) ;LDPROG } R0=DATA _OUTWORD _COMMAND(0x18) ;BEGPRG Externally Timed Timed P=$WDELAY ;Programming cycle time _COMMAND(01010B) ;ENDPRG [Erase] GET=("Erase mode",R6) RA?0{EXIT} R6?0{EXIT} R6?1{ _COMMAND(9) ;Bulk Erase } R6?1{ ;Code+ID _COMMAND(0) ;LDCONF _OUTWORD(03FFFH) ;R0=6,LOOP=(8){_COMMAND} ;INCADD _COMMAND(9) ;Bulk Erase } P=50000 ["Read Calibration"] _COMMAND(0) ;LDCONF _OUTWORD(0x3FFF) ; dummy ADR=0 LOOP=(0,7){ ; goto adr 0x2008 _COMMAND(4) ;RDPROG _INWORD ;dummy read - ®Ўп§ вҐ«м­®... ADR=+1 _INCADD } _COMMAND(4) ;RDPROG ;2008 _INWORD R1A=R1 GET=("Read Calibration",R1A) [_READID] _COMMAND(0) ;LDCONF _OUTWORD(0x3FFF) ; dummy ADR=0 LOOP=(6){ ; goto adr 0x2005 _COMMAND(4) ;RDPROG _INWORD ;dummy read - обязательно... ADR=+1 _INCADD } _COMMAND(4) ;RDPROG ;2006 _INWORD R19=R1 ["Read ID"] _READID R1=R19,R1=/32,R1=&01FFH R1?100001100B{PRINT=("PIC12F615\nID=%04lX",R19),EXIT} R1?100001101B{PRINT=("PIC12HV615\nID=%04lX",R19),EXIT} R1?010011011B{PRINT=("PIC16F617\nID=%04lX",R19),EXIT} R1?010010010B{PRINT=("PIC16F616\nID=%04lX",R19),EXIT} R1?010010011B{PRINT=("PIC16HV616\nID=%04lX",R19),EXIT} R1?100010010B{PRINT=("PIC16F609\nID=%04lX",R19),EXIT} R1?100010100B{PRINT=("PIC16HV609\nID=%04lX",R19),EXIT} R1?100010011B{PRINT=("PIC16F610\nID=%04lX",R19),EXIT} R1?100010101B{PRINT=("PIC16HV610\nID=%04lX",R19),EXIT} PRINT=("ID=%04lX",R19) [~!#"Fuse Editor"] $AREA=2 ;FUSES R1=DATA _FUSE2BIT GET=("Edit Fuses",R10,R11,R12,R13,R14,R15,R16) RA?0{EXIT} _BIT2FUSE DATA=R1 [END] MCLR=0,VPP=0,CLK=0,SDA=0