; Orange programmer module v2.9 - Orange3,4,5,SE ; (c) 2000-2005 CnCLab ;CHIP=PIC16C84,1024x14,P16C84.hpl ;AREA=CODE,1024x14,0,0 ;AREA=DATA,64,0,0x4200,b ;AREA=CONFIG,1x14,0,0x400E ; 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 R1=CONFIG,H R2=CP,L,0:On,1:Off R3=PWRTE,L,0:Off,1:On R4=WDTE,L,0:Off,1:On R5=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],_PULSE} 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=(0xFFFF){ ;increment address to current value! R9?R8{BREAK} R0=6,_COMMAND ;INCADD R9=+1 } [_FUSE2BIT] ; unpack config word R2=0,R3=0,R4=0,R5=0 R2[0]=R1[4] ;CP R3[0]=R1[3] ;PWRT R4[0]=R1[2] ;WDTE R5[1]=R1[1] ;FOSC1 R5[0]=R1[0] ;FOSC0 [_BIT2FUSE] ;copy separate bits to config word R1=0x3FFF R1[4]=R2[0] ;CP R1[3]=R3[0] ;PWRT R1[2]=R4[0] ;WDTE R1[1]=R5[1] ;FOSC1 R1[0]=R5[0] ;FOSC0 ;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 [_WRITEFUSES] ADR=0 R1=DATA _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=0,SDA=0,P=100 $VERSION=/65536 $VERSION?3{ P=150000 } CLK=0,SDA=0,P=25 MCLR=1 ;Programm/Verify Mode! VPP=13000,P=20000 ; min delay for O4! SDA=1,P=1000 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?2{_WRITEFUSES,EXIT} _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 _COMMAND(8) ;BEGPRG P=11000 [~!#"Fuse Editor"] $AREA=2 ;FUSES R1=DATA _FUSE2BIT GET=("Edit Fuses",R2,R3,R4,R5) RA?0{EXIT} _BIT2FUSE DATA=R1 [Erase] _COMMAND(0) ;LDCONF _OUTWORD(03FFFH) R0=6,LOOP=(0,6){_COMMAND} ;INCADD _COMMAND(1) ;? _COMMAND(7) ;? _COMMAND(8) ;BEGPRG P=20000 _COMMAND(1) ;? _COMMAND(7) ;? P=20000 [END] MCLR=0 VPP=0 CLK=0,SDA=0