; Orange programmer module v3.0 - Orange3,4,5,SE ; (c) 2000-2010 CnCLab ; CHIP=PIC16F84,1024x14 ; Tested ALLPINS=18 INFO="PIC Adapter" ; PING=SDA,1,13 ;RB7 PINO=CLK,0,12 ;RB6 PINO=MCLR,5,4 ;/MCLR PING=GND,255,5 ;Vss CDELAY=2 R11=CONFIG,H R12=CP,L,0:On,1:Off R13=PWRTE,L,0:On,1:Off ;!!! vs 16C84! R14=WDTE,L,0:Off,1:On R15=FOSC,L,00:LP,01:XT,10:HS,11:RC [_PULSE] CLK=1,P=2,CLK=0,P=2 [_COMMAND] ; R0 - CMD P=1 LOOP=(0,5){SDA=R0[I],CLK=1,CLK=0} P=1 ;PRINT=L("CMD=%02X\n",R0) [_OUTWORD] SDA=0,CLK=1,CLK=0 LOOP=(0,13){SDA=R0[I],_PULSE} SDA=0,CLK=1,CLK=0 [_INCADD] R8=ADR LOOP=(0xFFFF){ ;increment address to current value! R9?R8{BREAK} R0=6,_COMMAND ;INCADD R9=+1 } [_FUSE2BIT] ; unpack config word R12=0,R13=0,R14=0,R15=0 R12[0]=R1[4] ;CP R13[0]=R1[3] ;PWRT R14[0]=R1[2] ;WDTE R15[1]=R1[1] ;FOSC1 R15[0]=R1[0] ;FOSC0 [_BIT2FUSE] ;copy separate bits to config word R1=0x3FFF R1[4]=R12[0] ;CP R1[3]=R13[0] ;PWRT R1[2]=R14[0] ;WDTE R1[1]=R15[1] ;FOSC1 R1[0]=R15[0] ;FOSC0 ;PRINT=("Configuration Word = %04lX",R1) [_READFUSES] R0=0,_COMMAND ;LDCONF R0=0x3FFF,_OUTWORD ; dummy ADR=0 LOOP=(0,6){ ; goto adr 0x2007 _COMMAND(4) ;RDPROG SDA=1,_PULSE LOOP=(0,13){_PULSE} ;dummy read... SDA=0,_PULSE ADR=+1 _INCADD } _COMMAND(4) ;RDPROG SDA=0,_PULSE R1=0 LOOP=(0,13){_PULSE,SDA=1,R1[I]=SDA,SDA=0} SDA=1,_PULSE ;PRINT=("Configuration Word = %04lX",R1) ;copy config world to separate bits ADR=0 DATA=R1 [_WRITEFUSES] ADR=0 R1=DATA _FUSE2BIT _COMMAND(0) ;LDCONF R0=0x3FFF,_OUTWORD ; dummy LOOP=(0,6){ ; goto adr 0x2007 _COMMAND(2) ; LDPROG _OUTWORD(0x3FFF) ; dummy data ;R0=8,_COMMAND ; BEGPRG - don't really programm P=10000 ADR=+1 _INCADD } _COMMAND(2) ;LDPROG R0=R1,_OUTWORD ;config! R0=8,_COMMAND ; BEGPRG P=10000 ; check only if not code protected! R12?!0{ _COMMAND(4) ;RDPROG SDA=0,_PULSE R2=0x3FFF LOOP=(0,13){_PULSE,SDA=1,R2[I]=SDA,SDA=0} SDA=1,_PULSE R1?!R2{PRINT=("Fuses Write error %04lX!",R2),EXIT} PRINT=S("Verify Fuses Ok"),P=600000 } ;The OSC must not have 72 osc clocks while the device MCLR is between VIL and VIHH. [INIT] VPP=0 MCLR=0,CLK=0,SDA=0,P=100 $VERSION=/65536 $VERSION?3{ P=150000 } CLK=0,SDA=0,P=20 MCLR=1 ;Programm/Verify Mode! VPP=13000,P=10000 ; min delay for O4! SDA=1,P=500 R9=0 ;current address register [READ] $AREA?2{_READFUSES,RETURN} _INCADD R0=4 ;RDPROG $AREA?1{R0=5} ;RDDATA _COMMAND SDA=1,_PULSE R0=0 LOOP=(0,13){_PULSE,R0[I]=SDA} SDA=1,_PULSE DATA=R0 ;For Orange5 только через регистр! ;CLK=1,CLK=0 ;R0=6,_COMMAND ;INCADD [WRITE] $AREA?0{R0=DATA,R0=&0x3FFF,R0?0x3FFF{RETURN}} ;не пишем пустые во FLASH для ускорения $AREA?2{_WRITEFUSES,EXIT} ;no RETURN _INCADD R0=2 ;LDPROG $AREA?1{R0=3} ;LDDATA _COMMAND SDA=0,CLK=1,CLK=0 LOOP=(0,13){SDA=DATA[I],_PULSE} SDA=0,CLK=1,CLK=0 R0=8,_COMMAND ;BEGPRG P=10000 [~!#"Fuse Editor"] $AREA=2 ;FUSES R1=DATA _FUSE2BIT GET=("Edit Fuses",R12,R13,R14,R15) RA?0{EXIT} _BIT2FUSE DATA=R1 [Erase] R0=0,_COMMAND ;LDCONF R0=03FFFH,_OUTWORD R0=6,LOOP=(0,6){_COMMAND} ;INCADD R0=1,_COMMAND ;? R0=7,_COMMAND ;? R0=8,_COMMAND ;BEGPRG P=10000 R0=1,_COMMAND ;? R0=7,_COMMAND ;? [END] MCLR=0 VPP=0 CLK=0,SDA=0