; Orange programmer module v3.2 ; (c) 2000-2015 CnCLab ;CHIP=PIC16F72,2Kx14,P16F77.hpl ;AREA=CODE,2Kx14,0,0 ;AREA=CONFIG,1x14,0,0x400E ;IMAGE=pic16fs28 ;CHIP=PIC16F73,4Kx14,P16F77.hpl ;AREA=CODE,4Kx14,0,0 ;AREA=CONFIG,1x14,0,0x400E ;CHIP=PIC16F74,4Kx14,P16F77.hpl ;AREA=CODE,4Kx14,0,0 ;AREA=CONFIG,1x14,0,0x400E ;CHIP=PIC16F76,8Kx14,P16F77.hpl ;AREA=CODE,8Kx14,0,0 ;AREA=CONFIG,1x14,0,0x400E ;CHIP=PIC16F77,8Kx14,P16F77.hpl ;AREA=CODE,8Kx14,0,0 ;AREA=CONFIG,1x14,0,0x400E ; Tested PIC16F72,F73 ; Primary Tested PIC16LF73 ; DS30324 for : F73/74/76/77 ; DS39588A for : F72 ; 28 PIN: 73/76 ; 40 PIN: 874/77 ALLPINS=28 INFO="PIC Adapter" OPTIONS=f, ; PING=SDA,1,28 ;RB7 PINO=CLK,0,27 ;RB6 PINO=MCLR,5,1 ;/MCLR PING=GND,255,8 ;Vss CDELAY=2 R1=CONFIG,H R12=CP,L,0:All,1:Off R13=PWRTE,L,0:On,1:Off R14=WDTE,L,0:Off,1:On R15=FOSC,L,00:LP,01:XT,10:HS,11:RC R16=BODEN,L,0:Off,1:On [_PULSE] CLK=1,P=2,CLK=0,P=2 ; R0 - CMD [_COMMAND] 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=(0xFFFF){ ;increment address to current value! R9?R8{BREAK} _COMMAND(6) ;INCADD R9=+1 } [INIT] VPP=0 MCLR=0,CLK=0,SDA=0 PRINT=S("Power up...") $VERSION=/65536 $VERSION?3{ P=200000 ;charge MCLR cap! CLK=0,SDA=0 IDISABLE VCC=0 P=25000 ;no more time 25000! VCC=1 VPP=13000 MCLR=1 ;Vcc pulse for re-enter prg mode IENABLE ;Programm/Verify Mode! } $VERSION?!3{ CLK=0,SDA=0,P=200 VPP=13000 MCLR=1 ;Vcc pulse for re-enter prg mode } ;P=1000 ;SDA=1 P=100000 PRINT=S(" ") R9=0 ;current address register ;------------------------------------------------- [_FUSE2BIT] ; unpack config word ; 6 5 4 3 2 1 0 ; BODEN - CP0 PWRTE WDTE F0SC1 F0SC0 R12=0,R13=0,R14=0,R15=0,R16=0 R15[0]=R1[0],R15[1]=R1[1] ;FOSC R14[0]=R1[2] ;WDTE R13[0]=R1[3] ;PWRTE R12[0]=R1[4] ;CP R16[0]=R1[6] ;BODEN [_BIT2FUSE] ;copy separate bits to config word R1=0x3FFF R1[0]=R15[0],R1[1]=R15[1] ;FOSC R1[2]=R14[0] ;WDT R1[3]=R13[0] ;PWR R1[4]=R12[0] ;CP R1[6]=R16[0] ;BODEN ;PRINT=("Configuration Word = %04lX",R1) [_READFUSES] R0=0,_COMMAND ;LDCONF R0=0x3FFF,_OUTWORD ; dummy ADR=0 LOOP=(0,6){ ; goto adr 0x2007 R0=4,_COMMAND ;RDPROG SDA=1,_PULSE LOOP=(0,13){_PULSE} ;dummy read... SDA=0,_PULSE ADR=+1 _INCADD } R0=4,_COMMAND ;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) ADR=0 DATA=R1 ;_FUSE2BIT ;RE?!2{ ;GET=("Fuses",R12,R13,R14,R15,R16) ;} [_WRITEFUSES] ADR=0 R1=DATA ;_FUSE2BIT ;GET=("Write Fuses",R12,R13,R14,R15,R16) ;RA?0{EXIT} ;_BIT2FUSE ;copy separate bits to config world ADR=0 R0=0,_COMMAND ;LDCONF R0=0x3FFF,_OUTWORD ; dummy LOOP=(0,6){ ; goto adr 0x2007 R0=2,_COMMAND ; LDPROG R0=0x3FFF,_OUTWORD ; dummy data ;R0=8,_COMMAND ; BEGPRG - don't really programm ;P=10000 P=100 ADR=+1 _INCADD } R0=2,_COMMAND ;LDPROG R0=R1,_OUTWORD ;config R0=8,_COMMAND ; BEGPRG P=10000 ; check? R0=4,_COMMAND ;RDPROG SDA=0,_PULSE R2=0x3FFF LOOP=(0,13){_PULSE,SDA=1,R2[I]=SDA,SDA=0} SDA=1,_PULSE R1?!R2{PRINT=("Write error!")} ;------------------------------------------------- [READ] $AREA?1{_READFUSES,RETURN} _INCADD _COMMAND(4) ;RDPROG 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} R0=DATA,R0=&0x3FFF,R0?0x3FFF{RETURN} ;не пишем пустые во FLASH для ускорения _INCADD _COMMAND(2) ;LDPROG R0=DATA _OUTWORD _COMMAND(8) ;BEGPRG ;Programming cycle time tprog max 1 ms P=1500 _COMMAND(0xE) ;ENDPRG [Erase] ADR=0 P=10000 ;R0=2,_COMMAND ; ;R0=03FFFH,_OUTWORD _COMMAND(9) ;Bulk Erase Prg _COMMAND(8) ;begin P=500000 ;The erase sequence is self-timed and it is not necessary to ;issue an 'End Programming' command [END] MCLR=0,VPP=0,CLK=0,SDA=0 [~!#"Fuse Editor"] $AREA=2 ;FUSES ADR=0 R1=DATA ;PRINT=S("%04X",R1) _FUSE2BIT GET=("Edit Fuses",R12,R13,R14,R15,R16) RA?0{EXIT} _BIT2FUSE DATA=R1 ["Read ID"] R0=0,_COMMAND ;LDCONF R0=0x3FFF,_OUTWORD ; dummy ADR=0 LOOP=(0,5){ ; 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 R2=R1 R2=&0FE0H ;id mask VPP=0,MCLR=0,P=1000,VCC=0 R2?00A0H{PRINT=("ID = %04lX - PIC16F72",R1),EXIT} R2?0600H{PRINT=("ID = %04lX - PIC16F73",R1),EXIT} R2?0620H{PRINT=("ID = %04lX - PIC16F74",R1),EXIT} R2?0640H{PRINT=("ID = %04lX - PIC16F76",R1),EXIT} R2?0670H{PRINT=("ID = %04lX - PIC16F77",R1),EXIT} PRINT=("ID = %04lX",R1)