; Orange programmer module v3.01 ; Orange3,4,SE only ; (c) 2000-2011 CnCLab,EugenOS ;CHIP=PIC16C710,512x14,P16C711.hpl ;AREA=CODE,512x14,0,0 ;AREA=CONFIG,1x14,0,0x400E ;CHIP=PIC16C711,1024x14,P16C711.hpl ;AREA=CODE,1024x14,0,0 ;AREA=CONFIG,1x14,0,0x400E ; PIC16C710  PIC16C711 ; Primary Tested by EugenOS 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 R10=FOSC,L,LP,XT,HS,RC R11=WDTE,L,Off,On R12=PWRTE,L,On,Off R13=CP,L,On,Off R14=BODEN,L,Off,On [_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 ;CP0 CP0 CP0 CP0 CP0 CP0 CP0 BODEN CP0 CP0 PWTRE WDTE 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] ;PWRTE R13[0]=R1[4] ;CP0 R14[0]=R1[6] ;BODEN [_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] ;PWRTE R1[4]=R13[0] ;CP0 R1[5]=R13[0] ;CP0 R1[6]=R14[0] ;BODEN R1[7]=R13[0] ;CP0 R1[8]=R13[0] ;CP0 R1[9]=R13[0] ;CP0 R1[10]=R13[0] ;CP0 R1[11]=R13[0] ;CP0 R1[12]=R13[0] ;CP0 R1[13]=R13[0] ;CP0 ;PRINT=("Config 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