; Orange programmer module v2.9 ; Orange3,4,SE only ; (c) 2000-2006 CnCLab ; CHIP=PIC16C620,512x14 ; CHIP=PIC16C620A,512x14 ; CHIP=PIC16C623,512x14 ; 30228k.pdf - programming specifications for the following devices: ; PIC16C61 PIC16C72A PIC16CE623 ; PIC16C62 PIC16C73 PIC16CE624 ; PIC16C62A PIC16C73A PIC16CE625 ; PIC16C62B PIC16C73B PIC16C710 ; PIC16C63 PIC16C74 PIC16C711 ; PIC16C63A PIC16C74A PIC16C712 ; PIC16C64 PIC16C74B PIC16C716 ; PIC16C64A PIC16C76 PIC16C745 ; PIC16C65 PIC16C77 PIC16C765 ; PIC16C65A PIC16C620 PIC16C773 ; PIC16C65B PIC16C620A PIC16C774 ; PIC16C66 PIC16C621 PIC16C923 ; PIC16C67 PIC16C621A PIC16C924 ; PIC16C71 PIC16C622 PIC16C925 ; PIC16C72 PIC16C622A PIC16C926 ;CONFIGURATION WORD FOR: PIC16C62A/62B/62C/63/63A/64A/65A/65B/66/67 ;PIC16C72/72A/73A/73B/74A/74B/76/77 ;PIC16C620/620A/621/621A/622/622A/712/716 ;PIC16CE623/624/625 (ADDRESS 2007h) ; not Tested ALLPINS=14 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 R10=FOSC,L,LP,XT,HS,RC R11=WDTE,L,Off,On R12=PWRTE,L,On,Off R13=CP,L,00:On,01:Off,10:Off,11:Off R14=BOREN,L,Off,On ;R15=CONFIG,H [_PULSE] CLK=1,P=3,CLK=0,P=3 [_COMMAND] ; R0 - CMD P=1 LOOP=(0,5){SDA=R0[I],CLK=1,CLK=0} P=1 [_OUTWORD] SDA=0,CLK=1,CLK=0 LOOP=(0,13){SDA=R0[I],_PULSE} SDA=0,CLK=1,CLK=0 [_INCADD] R8=ADR LOOP=(0,0xFFFF){ ;increment address to current value! R9?R8{BREAK} R0=6,_COMMAND ;INCADD R9=+1 } [_FUSE2BIT] ; unpack config word ;13 12 11 10 9 8 7 6 5 4 3 2 1 0 ;CP1 CP0 CP1 CP0 CP1 CP0 - BOREN CP1 CP0 PWTREN WDTEN F0SC1 F0SC0 R10=0,R11=0,R12=0,R13=0,R14=0 R10[0]=R1[0] ;FOSC0 R10[1]=R1[1] ;FOSC1 R11[0]=R1[2] ;WDTE R12[0]=R1[3] ;PWRT R13[0]=R1[4] ;CP0 R13[1]=R1[5] ;CP1 R14[0]=R1[6] ;BOREN [_BIT2FUSE] ;copy separate bits to config word R1=0x3FFF R1[0]=R10[0] ;FOSC0 R1[1]=R10[1] ;FOSC1 R1[2]=R11[0] ;WDTE R1[3]=R12[0] ;PWRT R1[4]=R13[0] ;CP0 R1[5]=R13[1] ;CP1 R1[6]=R14[0] ;BOREN R1[8]=R13[0] ;CP0 R1[9]=R13[1] ;CP1 R1[10]=R13[0] ;CP0 R1[11]=R13[1] ;CP1 R1[12]=R13[0] ;CP0 R1[13]=R13[1] ;CP1 ;PRINT=("Configuration Word = %04lX",R1) [_READFUSES] _COMMAND(0) ;LDCONF _OUTWORD(0x3FFF) ; 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 _FUSE2BIT RE?!2{ GET=("Fuses",R10,R11,R12,R13,R14) } [_WRITEFUSES] ADR=0 R1=DATA _FUSE2BIT GET=("Fuses",R10,R11,R12,R13,R14) RA?0{EXIT} _BIT2FUSE ADR=0 DATA=R1 ADR=0 _COMMAND(0) ; LDCONF _OUTWORD(0x3FFF) ; dummy LOOP=(0,6){ ; goto adr 0x2007 _COMMAND(2) ; LDPROG _OUTWORD(0x3FFF) ; dummy data ;R0=8,_COMMAND ; BEGPRG - don't really programm ;P=10000 P=100 ADR=+1 _INCADD } _COMMAND(2) ;LDPROG _OUTWORD(R1) ;config _COMMAND(8) ; BEGPRG P=20000 ; check only if not code protected! R2?!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 } [INIT] VPP=0 MCLR=0,CLK=1,SDA=1,P=100 $VERSION=/65536 $VERSION?3{ P=150000 } CLK=0,SDA=0,P=25 MCLR=1 ;Programm/Verify Mode! VPP=13000,P=1000 ; min delay for O4! SDA=1,P=1000 R9=0 ;current address register [READ] $AREA?1{_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?1{_WRITEFUSES,EXIT} _INCADD _COMMAND(2) ;LDPROG _OUTWORD(DATA) LOOP(25){ _COMMAND(01000b) ;BEGPRG P=100 _COMMAND(01110b) ;ENDPRG } [END] MCLR=0 VPP=0 CLK=0,SDA=0