; Orange programmer module v2.8 ; (c) 2000-2010 CnCLab ; CHIP=PIC16F818,1Kx14 ; CHIP=PIC16F619,2Kx14 ; 39603a.pdf Primary Tested ; ENDPRG required! ; Для старых версий адаптеров соединить 9 вывод панельки PIC18 с P2 ;Orange 3,4,5,SE ; LOW VOLTAGE ICSP PROGRAMMING MODE not tested. ;When LVP bit is set to '1', the low voltage ICSP programming ;entry is enabled. Since the LVP configuration ;bit allows low voltage ICSP programming entry in ;its erased state, an erased device will have the LVP bit ;enabled at the factory. While LVP is '1', RB3 is dedicated ;to low voltage ICSP programming. ;Bring RB3 and then, MCLR to VDD to enter Programming mode. ;All other specifications for high voltage ICSP apply. ALLPINS=18 INFO="PIC Adapter" PING=SDA,1,13 ;RB7 PINO=CLK,0,12 ;RB6 PINO=MCLR,5,4 ;/MCLR PINO=PGM,2,9 ;RB3/PGM PING=GND,255,5 ;Vss CDELAY=2 R1=CONFIG,H R2=CP,L,0:On,1:Off R3=PWRT,L,0:On,1:Off R4=WDT,L,0:Off,1:On R5=FOSC,L,000:LP,001:XT,010:HS,011:extCLK,100:intRC(RA6-I/O),101:intRC(RA6-CLK),110:extRC(RA6-I/O),111:extRC(RA6-CLK) R6=BOREN,L,0:Off,1:On R7=CPD,L,0:On,1:Off RB=LVP,L,0:Off,1:On RC=MCLRE,L,0:RA5=IO.MCLR=VDD,1:RA5=MCLR R11=DEBUG,L,0:On,1:Off R12=CCPMX,L,0:RB3,1:RB2 R13=WRT,L,00,01,10,11 R1A=Erase,L,Off,Code,Data,All [_PULSE] CLK=1,P=2,CLK=0,P=2 [_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=(0xFFFF){ ;increment address to current value! R9?R8{BREAK} _COMMAND(6) ;INCADD R9=+1 } ;The MCLR pin should be raised from below VIL to above the minimum VIHH(VPP), ;within 250 us of VDD rise. ;This ensures that the device always enters ;Programming mode before any instructions that may be in program ;memory can be executed. Otherwise, unintended instruction execution could ;occur when the INTRC clock source is configured as the primary clock. [INIT] R1A=0 PGM=0 MCLR=0,CLK=0,SDA=0 $VERSION=/65536 $VERSION?3{ P=120000 CLK=0,SDA=0,P=20,MCLR=1 ;Programm/Verify Mode! P=20000 } $VERSION?!3{ VCC=0 P=200000 CLK=0,SDA=0,P=20,MCLR=1,VPP=12500 ;Programm/Verify Mode! VCC=1 P=50000 } R9=0 ;current address register ;------------------------------------------------- [_FUSE2BIT] ; unpack config word ;13 12 11 10 9 8 7 6 5 4 3 2 1 0 ;CP CCPMX DEBUG WRT1 WRT0 CPD LVP BOREN MCLRE FOSC2 PWRTE WDTE F0SC1 F0SC0 R2=0,R3=0,R4=0,R5=0,R6=0,R7=0,RB=0,RC=0,R11=0,R12=0,R13=0 R5[0]=R1[0],R5[1]=R1[1],R5[2]=R1[4] ;FOSC R4[0]=R1[2] ;WDT R3[0]=R1[3] ;PWR RC[0]=R1[5] ;MCLRE R6[0]=R1[6] ;BOREN ; also bit 3 RB[0]=R1[7] ;LVP R7[0]=R1[8] ;CPD R13[0]=R1[9],R13[1]=R1[10] ;WRT R11[0]=R1[11] ;DEBUG R12[0]=R1[12] ;CCPMX R2[0]=R1[13] ;CP [_BIT2FUSE] ;copy separate bits to config word R1=0x3FFF R1[0]=R5[0],R1[1]=R5[1],R1[4]=R5[2] ;FOSC R1[2]=R4[0] ;WDT R1[3]=R3[0] ;PWR R1[5]=RC[0] ;MCLRE R1[6]=R6[0] ;BODEN ; also bit 3 R1[7]=RB[0] ;LVP R1[8]=R7[0] ;CPD R1[9]=R13[0],R1[10]=R13[1] ;WRT R1[11]=R11[0] ;DEBUG R1[12]=R12[0] ;CCPMX R1[13]=R2[0] ;CP ;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) ADR=0 DATA=R1 [_WRITEFUSES] ADR=0 R1=DATA ;_FUSE2BIT ADR=0 _COMMAND(0) ; LDCONF _OUTWORD(0x3FFF) ; dummy LOOP=(0,6){ ; goto adr 0x2007 _COMMAND(2) ; LDPROG _OUTWORD(0x3FFF) ; dummy data P=100 ADR=+1 _INCADD } _COMMAND(2) ;LDPROG R0=R1,_OUTWORD ;config _COMMAND(8) ; BEGPRG P=20000 ; верификаци fuses не всегда работает [_CHKF] ; check only if not code protected!!! 16F818/819 R0=0,R0[0]=R1[13],R0[1]=R1[8] ; mask CP&CPD bits R0?011B{ _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 [%04X]!",R2)} } ;------------------------------------------------- [READ] $AREA?2{_READFUSES,RETURN} _INCADD $AREA?0{ _COMMAND(4) ;RDPROG SDA=1,_PULSE R0=0 LOOP=(0,13){_PULSE,R0[I]=SDA} SDA=1,_PULSE } $AREA?1{ _COMMAND(5) ;RDDATA SDA=1,_PULSE R0=0 LOOP=(0,13){_PULSE,R0[I]=SDA} ;LOOP=(0,19){_PULSE,R5[I]=SDA} ;PRINT("%04X",R5) _PULSE } DATA=R0 ;For Orange5 только через регистр! [WRITE] $AREA?0{R0=DATA,R0=&0x3FFF,R0?0x3FFF{RETURN}} $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 R0=0x18,_COMMAND ;BEGPRG P=10000 R0=0x17,_COMMAND ;ENDPRG [~!#"Fuse Editor"] $AREA=2 ;FUSES ADR=0 R1=DATA ;PRINT=S("%04X",R1) _FUSE2BIT GET=("Edit Fuses",R2,R3,R4,R5,R6,R7,RB,RC,R11,R12) RA?0{EXIT} _BIT2FUSE DATA=R1 [_EraseAll] ADR=0 P=30000 _COMMAND(0) ;LDCONF _OUTWORD(0x3FFF) ; dummy P=1000 _COMMAND(0x1F) ;Chip Erase ;_COMMAND(8) ;begin P=50000 ;R0=0x17,_COMMAND ;ENDPRG [_EraseCode] _COMMAND(9) ;Bulk Erase Prg _COMMAND(8) ;begin P=50000 R0=0x17,_COMMAND ;ENDPRG [_EraseData] ADR=0 P=50000 _COMMAND(0xB) ;Bulk Erase Data _COMMAND(8) ;begin P=50000 R0=0x17,_COMMAND ;ENDPRG [Erase] ;R1A=Erase,L,Off,Code,Data,All GET=("Erase",R1A) RA?0{EXIT} R1A?0{EXIT} ;Off _COMMAND(0) ;LDCONF _OUTWORD(03FFFH) R1A?1{_EraseCode} ;Code R1A?2{_EraseData} ;Data R1A?3{_EraseAll} ;All [END] MCLR=0 VPP=0 CLK=0,SDA=0 ;[ReadID] ;ADR=0x2000 ;R7=0 ;LOOP=(0,3){ ;_INCADD ;R0=4,_COMMAND ;RDPROG ;SDA=0 ;CLK=1,CLK=0 ;R0=0 ;LOOP=(0,13){_PULSE,SDA=1,R0[I]=SDA,SDA=0} ;CLK=1,CLK=0 ;R0=&0xF ;R7=|R0 ;R7=<<4 ;} ;R7=/16 ;PRINT=("ID = %04lX",R7) ["Read ID"] _COMMAND(0) ;LDCONF _OUTWORD(0x3FFF) ; dummy!!! ADR=0 LOOP=(0,5){ ;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,CLK=0,SDA=0,VCC=0 R2=&0FF0H ;id mask R2?04C0H{PRINT=("ID = %04lX - PIC16F818",R1),EXIT} R2?04E0H{PRINT=("ID = %04lX - PIC16F819",R1),EXIT} PRINT=("ID = %04lX",R1)