; Orange programmer module v3.5 ; (c) 2010 CnCLab ;CHIP=PIC10F200,256x12,P10F206.HPL ;AREA=CODE,256x12,0 ;AREA=ID,4x12,0x100,0x200 ;AREA=CONFIG,1x12,0x1FF,0x3FE ;CHIP=PIC10F202,512x12,P10F206.HPL ;AREA=CODE,512x12,0 ;AREA=ID,4x12,0x200,0x400 ;AREA=CONFIG,1x12,0x3FF,0x7FE ;CHIP=PIC10F204,256x12,P10F206.HPL ;AREA=CODE,256x12,0 ;AREA=ID,4x12,0x100,0x200 ;AREA=CONFIG,1x12,0x1FF,0x3FE ;CHIP=PIC10F206,512x12,P10F206.HPL ;AREA=CODE,512x12,0 ;AREA=ID,4x12,0x200,0x400 ;AREA=CONFIG,1x12,0x3FF,0x7FE ; Microchip 41228e.pdf PIC10F20x Memory Programming Specification: ; PIC10F200, PIC10F202, PIC10F204, PIC10F206 ; Primary Tested PIC10F206 ; Orange3,4,5,SE ; First 128 bytes not code protected! ALLPINS=8 INFO="Special Adapter PIC10!!!" ; PING=SDA,1,5 ;GP0 PINO=CLK,0,4 ;GP1 PINO=MCLR,5,8 ;/MCLR PINO=VDD,254,2 ;Vdd PING=GND,255,7 ;Vss CDELAY=2 R1=CONFIG,H R10=Erase,L,Cancel,Code+ID R11=WDTE, L,0:Off,1:On R12=CP, L,0:On,1:Off R13=MCLRE,L,0:GP3,1:MCLR R1A=OSCALL, H4 R1B=SaveOSC,C1 ;R8 use for store address [_COMMAND] ; R0 - CMD P=1 LOOP=(0,5){SDA=R0[I],CLK=P} P=1 ;Tdly [_OUTWORD] SDA=0,CLK=1,CLK=0 LOOP=(0,13){SDA=R0[I],CLK=P} SDA=0,CLK=1,CLK=0 [_INWORD] R1=0 SDA=1,CLK=P LOOP=(0,13){CLK=P,R1[I]=SDA} SDA=1,CLK=P [_INCADD] R8=ADR,R8=+RC LOOP=(0xFFFF){ ;increment address to current value! R9?R8{BREAK} _COMMAND(6) ;INCADD R9=+1 R9=&0xFFF ;??? } ;PRINT=L("ADR=%X ",R9) [INIT] $VERSION=/65536 ;PRINT=("%u",$VERSION) MCLR=0 CLK=0,SDA=0 $VERSION?3{ PRINT=S("Power up...") P=600000 ;charge Vpp cap! PRINT=S(" ") } P=10000 VPP=12500 ;O4! MCLR=1 P=100000 ;SDA=1,P=16000 $AREA?!2{ ;Program mode entry will set the address to 0x1FF for PIC10F200/204 and 0x3FF for PIC10F202/206. _COMMAND(6) ;INCADD to 000 R9=0 ;current address register } $AREA?2{R9=RC} ; ;-------------------------------------------------------- [_FUSE2BIT] ; unpack config word ;11 10 9 8 7 6 5 4 3 2 1 0 ;- - - - - - - MCLRE CP WDTE - - R11=0,R12=0,R13=0 R11[0]=R1[2] ;WDTE R12[0]=R1[3] ;CP R13[0]=R1[4] ;MCLRE [_BIT2FUSE] ;copy separate bits to config word R1=0xFFF ; Unimplemented bit, read as '1' R1[2]=R11[0] ;WDTE R1[3]=R12[0] ;CP R1[4]=R13[0] ;MCLRE ;PRINT=("Configuration Word = %04lX",R1) ;-------------------------------------------------------- [READ] _INCADD _COMMAND(4) ;RDPROG _INWORD R1=&0xFFF DATA=R1 ;R0=ADR ;PRINT=("%04lX:%04lX",R0,R1) [_WRF] R1=R0 ;DATA _COMMAND(2) ;LDPROG _OUTWORD(R1) _COMMAND(0x08) ;BEGPRG Internally Timed P=10000 _COMMAND(0x0E) ;ENDPRG Internally Timed [WRITE] ;$AREA?1{_WRITEFUSES,EXIT} _INCADD _COMMAND(2) ;LDPROG R0=DATA,R0=&0xFFF R0?0xFFF{RETURN} ;íå ïèøåì ïóñòûå âî FLASH äëÿ óñêîðåíèÿ _OUTWORD(DATA) _COMMAND(0x08) ;BEGPRG Internally Timed P=5000 ;min 2ms _COMMAND(0x0E) ;ENDPRG Internally Timed [~!#"Fuse Editor"] $AREA=2 ;FUSES R1=DATA _FUSE2BIT GET=("Edit Fuses",R11,R12,R13) RA?0{EXIT} _BIT2FUSE DATA=R1 [Erase] $AREA?!0{PRINT("Select CODE area!"),EXIT} R10=0,R1B=1 GET=("Erase mode",R10,R1B) RA?0{EXIT} R10?0{EXIT} ; read OSCCAL RC=0 ; main flash area ADR=$SIZE, ADR=+4 ;0x204 _INCADD _COMMAND(4) ;RDPROG _INWORD R1A=R1 ;R1A=0xC26 R1A?0xFFF{ GET=("OSCCAL broken, enter new value:",R1A) RA?0{EXIT} } ;Erase ID&OSCCAL ADR=$SIZE ;0x200 Increment PC to 0x200/0x400 (first user ID location). _INCADD ;PRINT=("ADR=%03X",R9) RC=0 ; main flash area _COMMAND(9) ;Code Bulk Erase P=20000 R1B?!0{ ; restore OSC ADR=$SIZE, ADR=-1 ;0x1FF last CODE word _INCADD _WRF(R1A) } ;if erase ID&OSCCAL - restore OSCCAL ADR=$SIZE, ADR=+4 ;0x204 _INCADD _WRF(R1A) P=10000 ["Read Calibration"] $AREA?!0{PRINT("Select CODE area!"),EXIT} RC=0 ; main flash area ADR=$SIZE,ADR=+4 ;0x204 _INCADD _COMMAND(4) ;RDPROG _INWORD R1A=R1 GET=("OSCCAL value",R1A) [_READID] _COMMAND(0) ;LDCONF _OUTWORD(0x3FFF) ; dummy ADR=0 LOOP=(0,5){ ; goto adr 0x2005 _COMMAND(4) ;RDPROG _INWORD ;dummy read - ®¡ï§ â¥«ì­®... ADR=+1 _INCADD } _COMMAND(4) ;RDPROG ;2006 _INWORD R19=R1 [END] MCLR=0,VPP=0,CLK=0,SDA=0