; Orange programmer module v3.1 ; (c) 2010-2015 CnCLab ;CHIP=PIC16F610,1Kx14,P16F616.hpl ;AREA=CODE,1Kx14,0 ;AREA=USER_ID,4x14,0x4000 ;AREA=CONFIG,1x14,0x400E ;CHIP=PIC16F616,2Kx14,P16F616.hpl ;AREA=CODE,2Kx14,0 ;AREA=USER_ID,4x14,0x4000 ;AREA=CONFIG,1x14,0x400E ; Primary Tested 16F616 ALLPINS=14 INFO="PIC Adapter" PING=SDA,1,13 ;RA0 PINO=CLK,0,12 ;RA1 PINO=MCLR,5,4 ;/MCLR PINO=VDD,254,1 PING=GSS,255,14 ;Vss CDELAY=2 R10=FOSC,L,000:LP,001:XT,010:HS,011:EC(GP4-IO),100:intOSCIO,101:intOSC,110:extRCIO,111:extRC R11=WDTE,L,0:On,1:Off R12=PWRTE,L,0:On,1:Off R13=MCLRE,L,0:Off,1:On R14=CP,L,0:Protect,1:Off R15=IOSCFS,L,0:4MHz,1:8MHz R16=BOREN,L,00,01,10,11 [_PULSE] CLK=1,P=1,CLK=0,P=1 [_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 ;,R0=RC,R0=/2,R8=+R0 LOOP=(0xFFFF){ ;increment address to current value! R9?R8{BREAK} _COMMAND(6) ;INCADD R9=+1 } [INIT] ;VDD-FIRST PROGRAM/VERIFY MODE ENTRY VPP=0,MCLR=0,CLK=0,SDA=0 $VERSION=/65536 $VERSION?3{ P=150000 } CLK=0,SDA=0,P=20 MCLR=1 ;Programm/Verify Mode! VPP=13000,P=30000 ; min delay for O4! SDA=1,P=500 R9=0 ;current address register P=1000 ;Hold time after MCLR^ TPPDP min 5 us R9=0 ;current address register ;------------------------------------------------- [_FUSE2BIT] ; unpack config word ;13 12 11 10 9 8 7 6 5 4 3 2 1 0 ; BOREN1 BOREN0 IOSCFS CP MCLRE PWRTE WDTE FOSC2 FOSC1 FOSC0 R10=0,R11=0,R12=0,R13=0,R14=0,R15=0,R16=0 R10[0]=R1[0] ;FOSC0 R10[1]=R1[1] ;FOSC1 R10[2]=R1[2] ;FOSC2 R11[0]=R1[3] ;WDTE R12[0]=R1[4] ;PWRTE R13[0]=R1[5] ;MCLRE R14[0]=R1[6] ;CP R15[0]=R1[7] ;IOSCFS R16[0]=R1[8] ;BOREN0 R16[1]=R1[9] ;BOREN1 [_BIT2FUSE] ;copy separate bits to config word R1=0x3FFF ; Unimplemented bit, read as '1' R1[0]=R10[0] ;FOSC0 R1[1]=R10[1] ;FOSC1 R1[2]=R10[2] ;FOSC2 R1[3]=R11[0] ;WDTE R1[4]=R12[0] ;PWRTE R1[5]=R13[0] ;MCLRE R1[6]=R14[0] ;CP R1[7]=R15[0] ;IOSCFS R1[8]=R16[0] ;BOREN0 R1[9]=R16[1] ;BOREN1 ;------------------------------------------------- [READ] $AREA?0{ _INCADD } $AREA?>0{ _COMMAND(0) ;LDCONF _OUTWORD(0x3FFF) ; dummy $AREA?1{R1=ADR} ;USERID $AREA?2{R1=7} ;CONFIG R1?!0{ LOOP(R1){_COMMAND(6)} ;INCADD to 2000...2007h } } _COMMAND(4) ;RDPROG SDA=1,_PULSE R0=0 LOOP=(0,13){_PULSE,R0[I]=SDA} SDA=1,_PULSE DATA=R0 ;For Orange5 только через регистр! [WRITE] $AREA?0{ R3=DATA,R3=&0x3FFF,R3?0x3FFF{RETURN} ; skip empty code word _INCADD } $AREA?>0{ _COMMAND(0) ;LDCONF _OUTWORD(0x3FFF) ; dummy $AREA?1{R1=ADR} ;USERID $AREA?2{R1=7} ;CONFIG R1?!0{ LOOP(R1){_COMMAND(6)} ;INCADD to 2000...2007h } } _COMMAND(2) ;LDPROG SDA=0,CLK=1,CLK=0 LOOP=(0,13){SDA=DATA[I],_PULSE} SDA=0,CLK=1,CLK=0 _COMMAND(0x18) ;BEGPRG P=5000 ;min 3ms _COMMAND(0x0A) ;ENDPRG [~!#"Fuse Editor"] $AREA=2 ;FUSES R1=DATA _FUSE2BIT GET=("Edit Fuses",R10,R11,R12,R13,R14,R15,R16) RA?0{EXIT} _BIT2FUSE DATA=R1 [Erase] ADR=0 P=50000 ;1. Perform Load Configuration with dummy data to point the PC to 0x2000. ;2. Perform a Bulk Erase Program Memory command _COMMAND(0) ;LDCONF _OUTWORD(0x3FFF) ; dummy _COMMAND(9) ;Bulk Erase Prg P=500000 [END] MCLR=0 VPP=0 CLK=0,SDA=0 VCC=0 ["Read ID"] _COMMAND(0) ;LDCONF _OUTWORD(0x3FFF) ; dummy!!! ADR=0 LOOP(6){ ;goto adr 0x2007 _COMMAND(6) ;INCADD } _COMMAND(4) ;RDPROG ;2006h SDA=0,_PULSE SDA=1 R1=0 LOOP=(0,13){_PULSE,R1[I]=SDA} SDA=1,_PULSE R2=R1 MCLR=0,VPP=0,CLK=0,SDA=0,VCC=0 R2=&3FE0H ;id mask R2?1240H{PRINT=("ID = %04lX - PIC16F616",R1),RETURN} R2?1260H{PRINT=("ID = %04lX - PIC16HV616",R1),RETURN} R2?2260H{PRINT=("ID = %04lX - PIC16F610",R1),RETURN} R2?22A0H{PRINT=("ID = %04lX - PIC16HV610",R1),RETURN} PRINT=("ID = %04lX",R1)