; Orange programmer module v1.3 ; (c) 2010-2011 CnCLab ;CHIP=PIC18F242,16K,P18F258.HPL ;AREA=FLASH,16K(8),0,m ;AREA=EEPROM,256,0F00000h ;AREA=ID,8(8),200000h,m ;AREA=CONFIG,14,300000h ;CHIP=PIC18F248,16K,P18F258.HPL ;AREA=FLASH,16K(8),0,m ;AREA=EEPROM,256,0F00000h ;AREA=ID,8(8),200000h,m ;AREA=CONFIG,14,300000h ;CHIP=PIC18F252,32K,P18F258.HPL ;AREA=FLASH,32K(8),0,m ;AREA=EEPROM,256,0F00000h ;AREA=ID,8(8),200000h,m ;AREA=CONFIG,14,300000h ;CHIP=PIC18F258,32K,P18F258.HPL ;AREA=FLASH,32K(8),0,m ;AREA=EEPROM,256,0F00000h ;AREA=ID,8(8),200000h,m ;AREA=CONFIG,14,300000h ;CHIP=PIC18F442,16K,P18F258.HPL ;AREA=FLASH,16K(8),0,m ;AREA=EEPROM,256,0F00000h ;AREA=ID,8(8),200000h,m ;AREA=CONFIG,14,300000h ;CHIP=PIC18F452,32K,P18F258.HPL ;AREA=FLASH,32K(8),0,m ;AREA=EEPROM,256,0F00000h ;AREA=ID,8(8),200000h,m ;AREA=CONFIG,14,300000h ;CHIP=PIC18F458,32K,P18F258.HPL ;AREA=FLASH,32K(8),0,m ;AREA=EEPROM,256,0F00000h ;AREA=ID,8(8),200000h,m ;AREA=CONFIG,14,300000h ; DS39576C for PIC18F242, F248, F252, F258, F442, F448, F452, F458 ;Tested - PIC18F258 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 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 _OUTW(0) ; 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 ;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] ;$AREA?0{_RDFL,RETURN} $AREA?1{_RDEE,DATA=R1,RETURN} ;$AREA?2{_RDFL,RETURN} ;$AREA?3{_RDFL,RETURN} 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?3{_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(0x0E04) _CMD0,_OUTW(0x6EF6) _CMD(1100b),_OUTW(0x0080) _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} PRINT=("ID = %04lX",R1)