From: Matt H. <mh...@me...> - 2011-02-20 11:17:05
|
diff -rupN firmware-0.4.2-beta-orig/prog.c firmware-0.4.2-beta/prog.c --- firmware-0.4.2-beta-orig/prog.c 2011-01-22 11:24:58.000000000 -0500 +++ firmware-0.4.2-beta/prog.c 2011-02-16 02:02:58.050744634 -0500 @@ -182,14 +182,26 @@ char bulk_erase(PICFAMILY picfamily,PICT pic_send(4,0x00,0x94A6); //BCF EECON1, WREN break; case P18F2XXX: //also valid for 18F4XXX + case P18F4XK22: + case P18LF4XK22: set_address(picfamily, 0x3C0005); - pic_send(4,0x0C,0x3F3F); //Write 3F3Fh to 3C0005h + if(pictype == P18F2XXX) + { + pic_send(4,0x0C,0x3F3F); //Write 3F3Fh to 3C0005h + } else { // // P18LF/F4XK22 + pic_send(4,0x0C,0x0F0F); //Write 0F0Fh to 3C0005h + } set_address(picfamily, 0x3C0004); pic_send(4,0x0C,0x8F8F); //Write 8F8Fh to 3C0004h pic_send(4,0x00,0x0000); //NOP lasttick=tick; pic_send(4,0x00,0x0000); //hold PGD low until erase completes - DelayMs(P11); + if(pictype==P18F2XXX) + { + DelayMs(P11); + } else { // P18LF/F4XK22 + DelayMs(P11K); + } break; case P18FX220: case P18FXX31: @@ -582,8 +594,12 @@ char write_code(PICFAMILY picfamily, PIC //} break; case P18F2XXX: + case P18F4XK22: + case P18LF4XK22: pic_send(4,0x00,0x8EA6); //BSF EECON1, EEPGD pic_send(4,0x00,0x9CA6); //BCF EECON1, CFGS + if((pictype == P18F4XK22)||(pictype == P18LF4XK22)) + pic_send(4,0x00,0x84A6); //BSF EECON1, WREN set_address(picfamily, address); for(blockcounter=0;blockcounter<(blocksize-2);blockcounter+=2) { @@ -967,6 +983,11 @@ char write_data(PICFAMILY picfamily, PIC pic_send(4,0,0x6EA7); //MOVWF EECON2 } pic_send(4,0x00,0x82A6); //BSF EECON1, WR + if((pictype==P18F4XK22)||(pictype==P18LF4XK22)) + { + pic_send(4,0x00,0x0000); //NOP, two NOPs required before polling + pic_send(4,0x00,0x0000); //NOP, write starts on 4th clock of this instruction + } //pic_send(4,0x00,0x0000); //NOP, when not polling for the WR bit, the PIC still needs at least 4 clocks lasttick=tick; do @@ -1114,8 +1135,12 @@ char write_config_bits(PICFAMILY picfami case P18F6X2X: case P18FXX2: case P18F2XXX: + case P18F4XK22: + case P18LF4XK22: pic_send(4,0x00,0x8EA6); //BSF EECON1, EEPGD pic_send(4,0x00,0x8CA6); //BSF EECON1, CFGS + if((pictype==P18F4XK22)||(pictype==P18LF4XK22)) + pic_send(4,0x00,0x84A6); //BSF EECON1, WREN if((pictype==P18FXX2)||(pictype==P18FXX31)||(pictype==P18FXX31)) { //goto 0x100000 @@ -1130,8 +1155,13 @@ char write_config_bits(PICFAMILY picfami //LSB first pic_send(4,0x0F,((unsigned int)*(data+blockcounter))|(((unsigned int)*(data+blockcounter))<<8)); pic_send_n_bits(3, 0); - PGC=1; //hold PGC high for P9 - DelayMs(P9); + PGC=1; //hold PGC high for P9 (or P9A for 4XF/LFK22 config word) + if((pictype==P18F4XK22)||(pictype==P18LF4XK22)) + { + DelayMs(P9A); + } else { + DelayMs(P9); + } PGC=0; //hold PGC low for time P10 DelayMs(P10); pic_send_word(0x0000); //last part of the nop @@ -1142,8 +1172,13 @@ char write_config_bits(PICFAMILY picfami set_address(picfamily, address+((unsigned int)blockcounter)+1); pic_send(4,0x0F, ((unsigned int)*(data+1+blockcounter))|(((unsigned int)*(data+1+blockcounter))<<8)); //load MSB and start programming pic_send_n_bits(3, 0); - PGC=1; //hold PGC high for P9 - DelayMs(P9); + PGC=1; //hold PGC high for P9 (or P9A for 4XF/LFK22 config word) + if((pictype==P18F4XK22)||(pictype==P18LF4XK22)) + { + DelayMs(P9A); + } else { + DelayMs(P9); + } PGC=0; //hold PGC low for time P10 DelayMs(P10); pic_send_word(0x0000); //last part of the nop diff -rupN firmware-0.4.2-beta-orig/prog.h firmware-0.4.2-beta/prog.h --- firmware-0.4.2-beta-orig/prog.h 2010-12-13 10:33:41.000000000 -0500 +++ firmware-0.4.2-beta/prog.h 2011-02-16 01:28:31.474548425 -0500 @@ -35,7 +35,7 @@ typedef enum _PICTYPE{ P16F7X,P16F7X7,P16F87X,P16F72,P16F87,P16F54,P16F57,P16F785,P16F59,P16F91X,P16F88X, P16C6XX,P16C55X,P16C7XX,P16C64x,P14000,P16C50X,P16C432,P17CXX,P17C7XX, P18FXX39,P18F6X2X,P18FXX80,P18F8410,P18F6XJXX,P18F45J10,P18F97J60,P18F1X30,P18FXX23,P18FXXK20, - P24FJXXXGA0XX,P24FJXXXGA1,dsP30F,dsP33F,P24H,P10F200,P10F202,P12F61X,P16F716,P18FXX31,P18FX220, + P24FJXXXGA0XX,P24FJXXXGA1,dsP30F,dsP33F,P24H,P10F200,P10F202,P12F61X,P16F716,P18FXX31,P18FX220,P18F4XK22,P18LF4XK22, I2C_EE_1,I2C_EE_2,P12F508,P24FXXKAXXX, UPP_INVALID_PICTYPE }PICTYPE; @@ -61,9 +61,11 @@ unsigned char read_data(PICFAMILY picfam // delay times according to programming specification for PIC18F: #define P9 2 +#define P9A 6 #define P10 1 #define P11 10 #define P11A 5 +#define P11K 16 // delay times according to programming specification for PIC16F: #define Tera 10 diff -rupN firmware-0.4.2-beta-orig/upp.c firmware-0.4.2-beta/upp.c --- firmware-0.4.2-beta-orig/upp.c 2011-01-07 06:43:16.000000000 -0500 +++ firmware-0.4.2-beta/upp.c 2011-02-04 01:59:53.576524142 -0500 @@ -522,7 +522,9 @@ unsigned char set_pictype(unsigned char* case P16F716: case P17C7XX:picfamily=PIC16;break; case P18F2XXX: - case P18FXX2:picfamily=PIC18;break; + case P18F4XK22: + case P18LF4XK22: + case P18FXX2: case P18FXX39: case P18F6X2X: case P18FXX80: |