; Orange programmer module v1.5 ; (c) 2010-2011 CnCLab ;PIC18 with no EEPROM! ; CHIP=PIC18F2410,16K,P18F4x1x.HPL ; AREA=FLASH,16K(8),0,m ; AREA=ID,8(8),200000h,m ; AREA=CONFIG,14,300000h ; CHIP=PIC18F2450,16K,P18F4x1x.HPL ; AREA=FLASH,16K(8),0,m ; AREA=ID,8(8),200000h,m ; AREA=CONFIG,14,300000h ; CHIP=PIC18F2510,32K,P18F4x1x.HPL ; AREA=FLASH,32K(8),0,m ; AREA=ID,8(8),200000h,m ; AREA=CONFIG,14,300000h ; CHIP=PIC18F2515,48K,P18F4x1x.HPL ; AREA=FLASH,48K(8),0,m ; AREA=ID,8(8),200000h,m ; AREA=CONFIG,14,300000h ; CHIP=PIC18F2610,64K,P18F4x1x.HPL ; AREA=FLASH,64K(8),0,m ; AREA=ID,8(8),200000h,m ; AREA=CONFIG,14,300000h ; CHIP=PIC18F4410,16K,P18F4x1x.HPL ; AREA=FLASH,16K(8),0,m ; AREA=ID,8(8),200000h,m ; AREA=CONFIG,14,300000h ; CHIP=PIC18F4450,16K,P18F4x1x.HPL ; AREA=FLASH,16K(8),0,m ; AREA=ID,8(8),200000h,m ; AREA=CONFIG,14,300000h ; CHIP=PIC18F4510,32K,P18F4x1x.HPL ; AREA=FLASH,32K(8),0,m ; AREA=ID,8(8),200000h,m ; AREA=CONFIG,14,300000h ; CHIP=PIC18F4515,48K,P18F4x1x.HPL ; AREA=FLASH,48K(8),0,m ; AREA=ID,8(8),200000h,m ; AREA=CONFIG,14,300000h ; CHIP=PIC18F4610,64K,P18F4x1x.HPL ; AREA=FLASH,64K(8),0,m ; AREA=ID,8(8),200000h,m ; AREA=CONFIG,14,300000h ; ; DS39622L for PIC18F2410, 2450, 2510 2515, 2610, 4410, 4450, 4510, 4515, 4610 ; ERASE algo not compatible with p18f258.hpl! ;Tested - PIC18F2520 ALLPINS=28 INFO="PIC Adapter" PING=SDA,1,28 ;RB7 PINO=CLK,0,27 ;RB6 PINO=MCLR,5,1 ;/MCLR PING=GND,255,8 ;Vss PINO=VCC,254,20 ;Vcc CDELAY=1 R1=CONFIG,H [_CMD] ; R0 - CMD ;P=1 LOOP=(0,3){SDA=R0[I],CLK=P} ;P=1 [_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=1100,CLK=0 P=200 ;min 100 _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 $VERSION=/65536 $VERSION?3{P=100000} P=20000 MCLR=1,VPP=12500,P=20000 ;Programm/Verify Mode! SDA=1,P=100 R9=0 ;current address register ;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 } ;Data EEPROM Programming [_WREE] _CMD0,_OUTW(0x9EA6) _CMD0,_OUTW(0x9CA6) _CMD0,R1=0x0E,R0=ADR,_OUT2 _CMD0,_OUTW(0x6EA9) _CMD0,R1=0x0E,R0=ADR,R0=/256,_OUT2 _CMD0,_OUTW(0x6EAA) _CMD0,R1=0x0E,R0=DATA,_OUT2 _CMD0,_OUTW(0x6EA8) _CMD0,_OUTW(0x84A6) _CMD0,_OUTW(0x0E55) ;pass _CMD0,_OUTW(0x6EA7) _CMD0,_OUTW(0x0EAA) _CMD0,_OUTW(0x6EA7) _CMD0,_OUTW(0x82A6) _CMD0,_OUTW(0x50A6) _CMD0,_OUTW(0x6EF5) _CMD(0010b),_OUT(0),SDA=1 _IN P=10000 ;todo _CMD0,_OUTW(0x94A6) [_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 [WRITE] ;$AREA?1{_WREE,RETURN} $AREA?2{_WRCFG,RETURN} ; FLASH & ID [WRITEBLOCK] ;Step 1: Direct access to config memory ;PRINT=L("WRF") _CMD0,_OUTW(0x8EA6) _CMD0,_OUTW(0x8CA6) _CMD0,_OUTW(0x86A6) ;Step 2: Configure device for multi-panel writes. _CMD0,_OUTW(0x0E3C) _CMD0,_OUTW(0x6EF8) _CMD0,_OUTW(0x0E00) _CMD0,_OUTW(0x6EF7) _CMD0,_OUTW(0x0E06) _CMD0,_OUTW(0x6EF6) _CMD(1100b),_OUTW(0x0000) ;single panel writes ;Step 3: Direct access to code memory. _CMD0,_OUTW(0x8EA6) _CMD0,_OUTW(0x9CA6) ;Step 4: Load write buffer for Panel 1. 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) LOOP(3){ _CMD(1101b) R0=DATA,_OUT,ADR=+1 R0=DATA,_OUT,ADR=+1 } _CMD(1111b) ;last panel!!! R0=DATA,_OUT,ADR=+1 R0=DATA,_OUT,ADR=+1 ; _CMDNOP [Erase] _CMD0,_OUTW(0x0E3C) _CMD0,_OUTW(0x6EF8) _CMD0,_OUTW(0x0E00) _CMD0,_OUTW(0x6EF7) _CMD0,_OUTW(0x0E05) ;! _CMD0,_OUTW(0x6EF6) _CMD(1100b),_OUTW(0x3F3F) ;! _CMD0,_OUTW(0x0E3C) _CMD0,_OUTW(0x6EF8) _CMD0,_OUTW(0x0E00) _CMD0,_OUTW(0x6EF7) _CMD0,_OUTW(0x0E04) ;! _CMD0,_OUTW(0x6EF6) _CMD(1100b),_OUTW(0x8F8F) ;! _CMD0,_OUTW(0x0000) _CMD0 P=50000 _OUTW(0x0000) P=50000 [END] MCLR=0 VPP=0 CLK=0,SDA=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)