; Orange programmer module v2.9 ; (c) 2000-2012 CnCLab ;CHIP=PIC12C508,511x12,P12C509.hpl ;AREA=CODE,511x12,0,0 ;AREA=CONFIG,1x14,0,0x1FFE ;CHIP=PIC12C508A,511x12,P12C509.hpl ;AREA=CODE,511x12,0,0 ;AREA=CONFIG,1x12,0,0x1FFE ;AREA=CALIBR,1x12,0x1FF,0x3FE,w ;CHIP=PIC12C509,1023x12,P12C509.hpl ;AREA=CODE,1023x12,0,0 ;AREA=CONFIG,1x12,0,0x1FFE ;CHIP=PIC12C509A,1023x12,P12C509.hpl ;AREA=CODE,1023x12,0,0 ;AREA=CONFIG,1x12,0,0x1FFE ;AREA=CALIBR,1x12,0x3FF,0x7FE,w ; ;Orange3,4,5 ; primary tested PIC12C509, PIC12C509A ; PIC12C509, PIC12C519 don't have CALIBRATION AREA ALLPINS=8 INFO="PIC Adapter" ; PING=SDA,1,7 ;GP0 PINO=CLK,0,6 ;GP1 PINO=MCLR,5,4 ;/VPP-MCLR PINO=VDD,254,1 ;Vdd PING=GND,255,8 ;Vss CDELAY=1 R1=CONFIG,H R10=FOSC,L,00:LP,01:XT,10:IntRc,11:ExtRc R11=WDTE,L,0:Off,1:On R12=CP,L,0:On,1:Off R13=MCLRE,L,0:Int,1:On ;R7 skip CONFIG ;R8 use for store address ;R9 current address register [_PULSE] CLK=1,P=2,CLK=0,P=2 [_PULSE0] SDA=0,P=1,CLK=1,P=2,CLK=0,P=1 [_PULSE1] SDA=1,P=1,CLK=1,P=2,CLK=0,P=1 [_COMMAND] ; R0 - CMD P=1 LOOP=(0,5){SDA=R0[I],_PULSE} P=1 [_OUTWORD] _PULSE0 LOOP=(0,13){SDA=R0[I],_PULSE} _PULSE0 [_INCADD] R8=ADR R8=+RC ;area address LOOP=(0,0xFFFF){ ;increment address to current value! R9?R8{BREAK} _COMMAND(6) ;INCADD R9=+1 } ;PRINT=L("ADR=%XH\n",R9) [INIT] VPP=0,MCLR=0 CLK=0,SDA=0 $VERSION=/65536 $VERSION?3{ P=250000 } ;The MCLR pin should be raised from VIL to VIHH within 9 ms of VDD rise. ;This is to ensure that the device does not have the PC incremented while in valid operation range. VCC=0,P=250000 VCC=1 ;без задержки! MCLR=1 ;Programm/Verify Mode! VPP=13000,P=80000 ; min delay for O4! R9=0 ;current address register R7=0 ;skip cfg ;-------------------------------------------------------- [_FUSE2BIT] ; unpack config word ; 12 11 10 9 8 7 6 5 4 3 2 1 0 ; - - - - - - - - MCLRE CP WDTE F0SC1 F0SC0 R10=0,R11=0,R12=0,R13=0 R10[0]=R1[0],R10[1]=R1[1] ;FOSC R11[0]=R1[2] ;WDTE R12[0]=R1[3] ;CP R13[0]=R1[4] ;MCLRE [_BIT2FUSE] ;copy separate bits to config word R1=0 ; Unimplemented bit, read as '0' R1[0]=R10[0],R1[1]=R10[1] ;FOSC R1[2]=R11[0] ;WDTE R1[3]=R12[0] ;CP R1[4]=R13[0] ;MCLRE ;PRINT=("Configuration Word = %04lX",R1) [_READFUSES] ;The configuration word can only be accessed immediately after MCLR going to VHH. R0=4,_COMMAND ;RDPROG R1=0 _PULSE1 LOOP=(0,13){_PULSE,R1[I]=SDA} _PULSE1 R1=&0xFFF ;copy config world to separate bits ADR=0 DATA=R1 ;_FUSE2BIT [_WRITEFUSES] ADR=0 _COMMAND(2) ;LDPROG R1=DATA _OUTWORD(R1) ;config _COMMAND(8) ; BEGPRG P=20000 _COMMAND(001110B) ;ENDPRG ; check? _COMMAND(4) ;RDPROG _PULSE1 R2=0xFFF LOOP=(0,13){_PULSE,R2[I]=SDA} _PULSE1 R2=&0xFFF R1?!R2{PRINT=("Write error! [%04lX]",R2)} ;-------------------------------------------------------- [READ] $AREA?1{_READFUSES,RETURN} R7?0{_COMMAND(6),R7=1} ;skip CONFIG if READ/VERIFY _INCADD _COMMAND(4) ;RDPROG _PULSE1 LOOP=(0,13){_PULSE,R1[I]=SDA} _PULSE1 R1=&0xFFF DATA=R1 [WRITEINIT] $AREA?1{_WRITEFUSES,EXIT} _COMMAND(6),R7=1 ;skip CONFIG ;One program pulse R1-Data [_PRG1] _COMMAND(2) ;LDPROG _PULSE0 LOOP=(0,13){SDA=R1[I],_PULSE} _PULSE0 _COMMAND(001000B) ;BEGPRG P=100 ;must be 100 us _COMMAND(001110B) ;ENDPRG [WRITE] $AREA?!0{RETURN} R1=DATA,R1?0xFFF{RETURN} _INCADD R4=1 ;counter LOOP=(8){ ;maximum prg pulses 8 R1=DATA,_PRG1 ; Verify: _COMMAND(4) ;RDPROG R1=0 _PULSE1 LOOP=(0,13){_PULSE,R1[I]=SDA} _PULSE1 R2=DATA,R2=&0xFFF ;mask data R1?R2{BREAK} R4=+1 } ;Apply 11N additional program pulses R4=*11,R4=+1 LOOP=(R4){ R1=DATA,_PRG1 } ["Check Blank"] R4=0 _COMMAND(6) ;INCADD for skip CONFIG LOOP=($SIZE){ _COMMAND(4) ;RDPROG R1=0 _PULSE1 LOOP=(0,13){_PULSE,R1[I]=SDA} _PULSE1 R1=&0xFFF ;PRINT=S("ADR:%04lX, DATA:%04lX",R4,R1) R1?!0xFFF{PRINT=E("Chip not blanked at %04lX!",R4),EXIT} R0=6,_COMMAND ;INCADD R4=+1 } PRINT=S("Blank Ok") P=300000 [~!#"Fuse Editor"] $AREA=1 ;FUSES R1=DATA _FUSE2BIT GET=("Edit Fuses",R10,R11,R12,R13) RA?0{EXIT} _BIT2FUSE DATA=R1 [END] MCLR=0,VPP=0,P=5000 CLK=0,SDA=0