; Orange programmer module v1.6 ; (c) 2010-2011 CnCLab ;PIC18F2XJ/4XJ with no EEPROM ; No Vpp on MCLR! ;CHIP=PIC18F45J10,32K,P18F4xj.hpl ;AREA=FLASH,32K(64),0 ;VCC=3250 ;IMAGE=pic18fjq44 ; ; ERASE algo not compatible with old PICs! ;Tested - PIC18F45J10 INFO="Special Adapter" ALLPINS=0 OPTIONS=fm,m PING=SDA,1 ;RB7 PINO=CLK,0 ;RB6 PINO=MCLR,2 ;/MCLR PING=GND,255,8 ;Vss PINO=VCC,254,20 ;Vcc CDELAY=1 R1=CONFIG,H [_CMD] ; R0 - CMD LOOP=(0,3){SDA=R0[I],CLK=P} [_CMD0] SDA=0,CLK=P4 [_OUT] LOOP=(0,7){SDA=R0[I],CLK=P} [_OUTW] LOOP=(0,15){SDA=R0[I],CLK=P} ; R1 - Hi, R0 - Lo [_OUT2] R1=&0xFF,R1=<<8 R0=&0xFF,R0=|R1 _OUTW [_IN] SDA=1 R1=0 LOOP=(0,7){CLK=1,R1[I]=SDA,CLK=0} ; Special cmd with delay [_CMDNOP] SDA=0,CLK=P3 CLK=1 P=3500 ;min 3.4ms CLK=0 P=1 _OUTW(0) [_INCADD] R8=ADR LOOP=(0,0xFFFF){ ;increment address to current value! R9?R8{BREAK} _CMD(6) ;INCADD R9=+1 } ;------------------------------------------------- ; Read all memory w/o EEPROM, return R1 ;R3 - full adr [_RDFL] ;PRINT=("%02X",R3) _CMD0,R1=0x0E,R0=R3,R0=>>16,_OUT2 _CMD0,_OUTW(0x6EF8) _CMD0,R1=0x0E,R0=R3,R0=>>8,_OUT2 _CMD0,_OUTW(0x6EF7) _CMD0,R1=0x0E,R0=R3,_OUT2 _CMD0,_OUTW(0x6EF6) _CMD(1001b),_OUT(0),P=1 _IN ; Read EEPROM, return R1 [_RDEE] ; Step 1: Direct access to data EEPROM _CMD0,_OUTW(0x9EA6) _CMD0,_OUTW(0x9CA6) ; Step 2: Set EEPROM address pointer _CMD0,R1=0x0E,R0=ADR,_OUT2 _CMD0,_OUTW(0x6EA9) _CMD0,R1=0x0E,R0=ADR,R0=/256,_OUT2 _CMD0,_OUTW(0x6EAA) ; Step 3: Initiate a memory read _CMD0,_OUTW(0x80A6) ; Step 4: Load data into the Serial Data Holding register _CMD0,_OUTW(0x50A8) _CMD0,_OUTW(0x6EF5) _CMD0,_OUTW(0x0000) ;need for PIC18F2xxx/4xxx (DS39622L) _CMD(0010b),_OUT(0),P=1 _IN [INIT] MCLR=0 CLK=0,SDA=0 P=2000 MCLR=1,P=100 ;Programm/Verify Mode! MCLR=0,P=100 R9=0 ;current address register ;Program/Verify Entry Code = 4D434850h R0=4D434850h LOOP=(31,0){SDA=R0[I],CLK=P} P=1 MCLR=1,P=500 ;Read ID for connect test R3=3FFFFEH,_RDFL,R9=R1 R3=3FFFFFH,_RDFL,R1=*256,R1=|R9 R1?0xFFFF{ PRINT=A("MCU not detected.\nContinue?") RA?0{EXIT} } ;------------------------------------------------- [READ] R3=ADR,R3=+RC _RDFL DATA=R1 ; not for EEPROM, Only FLASH,ID,CFG - For speed++ [READBLOCK] R4=ADR,R4=+RC _CMD0,R1=0x0E,R0=R4,R0=>>16,_OUT2 _CMD0,_OUTW(0x6EF8) _CMD0,R1=0x0E,R0=R4,R0=>>8,_OUT2 _CMD0,_OUTW(0x6EF7) LOOP($BLOCKSIZE){ _CMD0,R1=0x0E,R0=R4,_OUT2 _CMD0,_OUTW(0x6EF6) ;only low address _CMD(1001b),_OUT(0),P=1 _IN DATA=R1 R4=+1 ;ADR++ ADR=+1 } [_WRCFG] ;Enabling the write protection of config bits (WRTC = 0 in CONFIG6H) ;will prevent further writing of config bits. ;Always write all the config bits before enabling the write protection for config bits ;Step 1: Direct access to config memory ;PRINT=L("WRF") _CMD0,_OUTW(0x8EA6) _CMD0,_OUTW(0x8CA6) ;Step 2: Position the program counter _CMD0,_OUTW(0xEF00) _CMD0,_OUTW(0xF800) ;Step 3(2): Set Table Pointer for config byte to be written. Write even/odd addresses R3=ADR,R3=+RC _CMD0,R1=0x0E,R0=R3,R0=>>16,_OUT2 _CMD0,_OUTW(0x6EF8) _CMD0,R1=0x0E,R0=R3,R0=>>8,_OUT2 _CMD0,_OUTW(0x6EF7) _CMD0,R1=0x0E,R0=R3,_OUT2 _CMD0,_OUTW(0x6EF6) _CMD(1111b) R0=DATA,_OUT ; one of byte ignored R0=DATA,_OUT ; _CMDNOP [_WR1] ;Step 1: Enable writes. _CMD0,_OUTW(0x84A6) ;Step 2: Load write buffer R3=ADR,R3=+RC _CMD0,R1=0x0E,R0=R3,R0=>>16,_OUT2 _CMD0,_OUTW(0x6EF8) _CMD0,R1=0x0E,R0=R3,R0=>>8,_OUT2 _CMD0,_OUTW(0x6EF7) _CMD0,R1=0x0E,R0=R3,_OUT2 _CMD0,_OUTW(0x6EF6) _CMD(1111b) ;last R0=DATA,_OUT,ADR=+1 R0=DATA,_OUT,ADR=+1 ; _CMDNOP ;WITH DELAY ;[WRITE] ;$AREA?1{_WREE,RETURN} ;_WR1 ;$AREA?2{_WRCFG,RETURN} ; FLASH & ID [WRITEBLOCK] ;Step 1: Enable writes. _CMD0,_OUTW(0x84A6) ;Step 2: Load write buffer R3=ADR,R3=+RC _CMD0,R1=0x0E,R0=R3,R0=>>16,_OUT2 _CMD0,_OUTW(0x6EF8) _CMD0,R1=0x0E,R0=R3,R0=>>8,_OUT2 _CMD0,_OUTW(0x6EF7) _CMD0,R1=0x0E,R0=R3,_OUT2 _CMD0,_OUTW(0x6EF6) R2=$BLOCKSIZE,R2=/2,R2=-1 ;PRINT=L("R2=%u\n",R2) LOOP(R2){ _CMD(1101b) R0=DATA,_OUT,ADR=+1 R0=DATA,_OUT,ADR=+1 } ;_CMD(1101b) ;test?????? ;_OUT(0xAA) ;_OUT(0xBB) _CMD(1111b) ;last R0=DATA,_OUT,ADR=+1 R0=DATA,_OUT,ADR=+1 ; _CMDNOP ;WITH DELAY ;new [Erase] _CMD0,_OUTW(0x0E3C) _CMD0,_OUTW(0x6EF8) _CMD0,_OUTW(0x0E00) _CMD0,_OUTW(0x6EF7) _CMD0,_OUTW(0x0E05) _CMD0,_OUTW(0x6EF6) _CMD(1100b),_OUTW(0x0101) ;! _CMD0,_OUTW(0x0E3C) _CMD0,_OUTW(0x6EF8) _CMD0,_OUTW(0x0E00) _CMD0,_OUTW(0x6EF7) _CMD0,_OUTW(0x0E04) ;! _CMD0,_OUTW(0x6EF6) _CMD(1100b),_OUTW(0x8080) ;! _CMD0,_OUTW(0x0000) _CMD0 P=500000 _OUTW(0x0000) P=50000 [END] CLK=0,SDA=0 MCLR=0 P=100 ;VPP=0 ["Read ID"] R3=3FFFFEH,_RDFL,R9=R1 R3=3FFFFFH,_RDFL,R1=*256,R1=|R9 R2=R1 R2=&0FFE0H ;id mask R2?0480H{PRINT=("ID = %04lX - PIC18F242",R1),EXIT} R2?0400H{PRINT=("ID = %04lX - PIC18F252",R1),EXIT} R2?04A0H{PRINT=("ID = %04lX - PIC18F442",R1),EXIT} R2?0420H{PRINT=("ID = %04lX - PIC18F452",R1),EXIT} R2?0800H{PRINT=("ID = %04lX - PIC18F248",R1),EXIT} R2?0840H{PRINT=("ID = %04lX - PIC18F258",R1),EXIT} R2?0820H{PRINT=("ID = %04lX - PIC18F448",R1),EXIT} R2?0860H{PRINT=("ID = %04lX - PIC18F458",R1),EXIT} R2?2160H{PRINT=("ID = %04lX - PIC18F2221",R1),EXIT} R2?2120H{PRINT=("ID = %04lX - PIC18F2321",R1),EXIT} R2?1160H{PRINT=("ID = %04lX - PIC18F2410",R1),EXIT} R2?1140H{PRINT=("ID = %04lX - PIC18F2420",R1),EXIT} R2?1140H{PRINT=("ID = %04lX - PIC18F2423",R1),EXIT} R2?2420H{PRINT=("ID = %04lX - PIC18F2450",R1),EXIT} R2?1260H{PRINT=("ID = %04lX - PIC18F2455",R1),EXIT} R2?2A60H{PRINT=("ID = %04lX - PIC18F2458",R1),EXIT} R2?1AE0H{PRINT=("ID = %04lX - PIC18F2480",R1),EXIT} R2?1120H{PRINT=("ID = %04lX - PIC18F2510",R1),EXIT} R2?0CE0H{PRINT=("ID = %04lX - PIC18F2515",R1),EXIT} R2?1100H{PRINT=("ID = %04lX - PIC18F2520",R1),EXIT} R2?1100H{PRINT=("ID = %04lX - PIC18F2523",R1),EXIT} R2?0CC0H{PRINT=("ID = %04lX - PIC18F2525",R1),EXIT} R2?1240H{PRINT=("ID = %04lX - PIC18F2550",R1),EXIT} R2?2A40H{PRINT=("ID = %04lX - PIC18F2553",R1),EXIT} R2?1AC0H{PRINT=("ID = %04lX - PIC18F2580",R1),EXIT} R2?0EE0H{PRINT=("ID = %04lX - PIC18F2585",R1),EXIT} R2?0CA0H{PRINT=("ID = %04lX - PIC18F2610",R1),EXIT} R2?0C80H{PRINT=("ID = %04lX - PIC18F2620",R1),EXIT} R2?0EC0H{PRINT=("ID = %04lX - PIC18F2680",R1),EXIT} R2?2700H{PRINT=("ID = %04lX - PIC18F2682",R1),EXIT} R2?2720H{PRINT=("ID = %04lX - PIC18F2685",R1),EXIT} R2?2140H{PRINT=("ID = %04lX - PIC18F4221",R1),EXIT} R2?2100H{PRINT=("ID = %04lX - PIC18F4321",R1),EXIT} R2?10E0H{PRINT=("ID = %04lX - PIC18F4410",R1),EXIT} R2?10C0H{PRINT=("ID = %04lX - PIC18F4420",R1),EXIT} R2?10C0H{PRINT=("ID = %04lX - PIC18F4423",R1),EXIT} R2?2400H{PRINT=("ID = %04lX - PIC18F4450",R1),EXIT} R2?1220H{PRINT=("ID = %04lX - PIC18F4455",R1),EXIT} R2?2A20H{PRINT=("ID = %04lX - PIC18F4458",R1),EXIT} R2?1AA0H{PRINT=("ID = %04lX - PIC18F4480",R1),EXIT} R2?10A0H{PRINT=("ID = %04lX - PIC18F4510",R1),EXIT} R2?0C60H{PRINT=("ID = %04lX - PIC18F4515",R1),EXIT} R2?1080H{PRINT=("ID = %04lX - PIC18F4520",R1),EXIT} R2?1080H{PRINT=("ID = %04lX - PIC18F4523",R1),EXIT} R2?0C40H{PRINT=("ID = %04lX - PIC18F4525",R1),EXIT} R2?1200H{PRINT=("ID = %04lX - PIC18F4550",R1),EXIT} R2?2A00H{PRINT=("ID = %04lX - PIC18F4553",R1),EXIT} R2?1A80H{PRINT=("ID = %04lX - PIC18F4580",R1),EXIT} R2?0EA0H{PRINT=("ID = %04lX - PIC18F4585",R1),EXIT} R2?0C20H{PRINT=("ID = %04lX - PIC18F4610",R1),EXIT} PRINT=("ID = %04lX",R1)