summaryrefslogtreecommitdiffstats
path: root/progP16.c
diff options
context:
space:
mode:
Diffstat (limited to 'progP16.c')
-rw-r--r--progP16.c243
1 files changed, 205 insertions, 38 deletions
diff --git a/progP16.c b/progP16.c
index be9f5a0..2f5f5f9 100644
--- a/progP16.c
+++ b/progP16.c
@@ -1,6 +1,6 @@
/**
* \file progP16.c - algorithms to program the PIC16 (14 bit word) family of microcontrollers
- * Copyright (C) 2009-2023 Alberto Maccioni
+ * Copyright (C) 2009-2025 Alberto Maccioni
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -175,6 +175,7 @@ struct ID16{
{0x2AE>>1,"16LF1784 rev%d\r\n",0x1F}, //10 1010 111x xxxx
{0x2B0>>1,"16LF1786 rev%d\r\n",0x1F}, //10 1011 000x xxxx
{0x2B2>>1,"16LF1787 rev%d\r\n",0x1F}, //10 1011 001x xxxx
+ {0x2BC>>1,"12LF1552 rev%d\r\n",0x1F}, //10 1011 110x xxxx
{0x2C0>>1,"16LF1903 rev%d\r\n",0x1F}, //10 1100 000x xxxx
{0x2C2>>1,"16LF1902 rev%d\r\n",0x1F}, //10 1100 001x xxxx
{0x2C4>>1,"16LF1907 rev%d\r\n",0x1F}, //10 1100 010x xxxx
@@ -225,6 +226,8 @@ struct ID16{
{0x3043,"16F1704\r\n",0},
{0x3044,"16LF1708\r\n",0},
{0x3045,"16LF1704\r\n",0},
+ {0x3046,"16LF1566\r\n",0},
+ {0x3047,"16LF1567\r\n",0},
{0x3048,"16F1716\r\n",0},
{0x3049,"16F1713\r\n",0},
{0x304A,"16LF1716\r\n",0},
@@ -417,6 +420,15 @@ struct ID16{
{0x3104,"16F17175\r\n",0},
{0x3105,"16F17156\r\n",0},
{0x3106,"16F17176\r\n",0},
+ {0x3121,"16F13113\r\n",0},
+ {0x3122,"16F13123\r\n",0},
+ {0x3123,"16F13143\r\n",0},
+ {0x3124,"16F13114\r\n",0},
+ {0x3125,"16F13124\r\n",0},
+ {0x3126,"16F13144\r\n",0},
+ {0x3127,"16F13115\r\n",0},
+ {0x3128,"16F13125\r\n",0},
+ {0x3129,"16F13145\r\n",0},
};
static bool PIC16_ID(int id)
@@ -597,6 +609,7 @@ void Read16Fxxx(int dim,int dim2,int dim3,int vdd)
PacketIO(vdd?55:5);
//****************** read code ********************
PrintMessage(strings[S_CodeReading1]); //read code ...
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_CodeReading1]); //read code ...
PrintStatusSetup();
for(i=0,j=0;i<dim;i++){
@@ -628,6 +641,7 @@ void Read16Fxxx(int dim,int dim2,int dim3,int vdd)
for(i=k;i<0x2000;i++) memCODE_W[i]=0x3fff;
//****************** read config area ********************
PrintMessage(strings[S_Read_CONFIG_A]); //read config ...
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_Read_CONFIG_A]); //read config ...
bufferU[j++]=LOAD_CONF; //counter at 0x2000
bufferU[j++]=0xFF; //fake config
@@ -661,6 +675,7 @@ void Read16Fxxx(int dim,int dim2,int dim3,int vdd)
//****************** read eeprom ********************
if(dim2){
PrintMessage(strings[S_ReadEE]); //Read EEPROM ...
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_ReadEE]); //Read EEPROM ...
PrintStatusSetup();
if(ee2200){ //eeprom a 0x2200
@@ -875,6 +890,7 @@ void Read16F1xxx(int dim,int dim2,int dim3,int options)
PacketIO(2);
//****************** read code ********************
PrintMessage(strings[S_CodeReading1]); //read code ...
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_CodeReading1]); //read code ...
PrintStatusSetup();
for(i=0,j=0;i<dim;i++){
@@ -905,6 +921,7 @@ void Read16F1xxx(int dim,int dim2,int dim3,int options)
else PrintMessage(strings[S_Compl]);
//****************** read config area ********************
PrintMessage(strings[S_Read_CONFIG_A]); //read config ...
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_Read_CONFIG_A]); //read config ...
bufferU[j++]=LOAD_CONF; //counter at 0x8000
bufferU[j++]=0xFF;
@@ -965,6 +982,7 @@ void Read16F1xxx(int dim,int dim2,int dim3,int options)
//****************** read eeprom ********************
if(dim2&&!F18x){ //16F1xxx
PrintMessage(strings[S_ReadEE]); //Read EEPROM ...
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_ReadEE]); //Read EEPROM ...
bufferU[j++]=CUST_CMD;
bufferU[j++]=0x16; //Reset address
@@ -998,6 +1016,7 @@ void Read16F1xxx(int dim,int dim2,int dim3,int options)
}
else if(dim2&&F18x){ //16F18xxx
PrintMessage(strings[S_ReadEE]); //Read EEPROM ...
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_ReadEE]); //Read EEPROM ...
bufferU[j++]=LOAD_PC; //counter at 0xF000
bufferU[j++]=0xF0;
@@ -1215,6 +1234,7 @@ void Read16F18xxx(int dim,int dim2,int dim3,int options)
PacketIO(2);
//****************** read code ********************
PrintMessage(strings[S_CodeReading1]); //read code ...
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_CodeReading1]); //read code ...
PrintStatusSetup();
for(i=0,j=0;i<dim;i++){
@@ -1245,6 +1265,7 @@ void Read16F18xxx(int dim,int dim2,int dim3,int options)
else PrintMessage(strings[S_Compl]);
//****************** read config area ********************
PrintMessage(strings[S_Read_CONFIG_A]); //read config ...
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_Read_CONFIG_A]); //read config ...
bufferU[j++]=ICSP8_LOAD; //counter at 0x8000
bufferU[j++]=LOAD_PC_ADDR;
@@ -1278,6 +1299,7 @@ void Read16F18xxx(int dim,int dim2,int dim3,int options)
else PrintMessage(strings[S_Compl]);
//****************** read device info area ********************
if(useDCI){ //if not disabled
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"Read device info area @0x8100\n");
bufferU[j++]=ICSP8_LOAD; //counter at 0x8000
bufferU[j++]=LOAD_PC_ADDR;
@@ -1309,6 +1331,7 @@ void Read16F18xxx(int dim,int dim2,int dim3,int options)
PrintMessage2(strings[S_ConfigErr],0x20,k2); //"Error reading config area, requested %d words, read %d\r\n"
}
//****************** read calibration area (Device Configuration Information) ********************
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"Read Device Configuration Information @0x8200\n");
bufferU[j++]=ICSP8_LOAD; //counter at 0x8200
bufferU[j++]=LOAD_PC_ADDR;
@@ -1352,6 +1375,7 @@ void Read16F18xxx(int dim,int dim2,int dim3,int options)
memEE=(unsigned char*)malloc(sizeEE); //EEPROM
for(i=0;i<sizeEE;i++) memEE[i]=0xFF;
PrintMessage(strings[S_ReadEE]); //Read EEPROM ...
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_ReadEE]); //Read EEPROM ...
bufferU[j++]=ICSP8_LOAD; //counter at 0xF000
bufferU[j++]=LOAD_PC_ADDR;
@@ -1551,6 +1575,8 @@ void Write12F6xx(int dim,int dim2)
}
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erase ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
j=0;
bufferU[j++]=EN_VPP_VCC; //VPP
bufferU[j++]=0x4;
@@ -1599,6 +1625,8 @@ void Write12F6xx(int dim,int dim2)
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
for(w=i=k=0,j=0;i<dim;i++){
if(memCODE_W[i]<0x3fff){
bufferU[j++]=LOAD_DATA_PROG;
@@ -1648,6 +1676,8 @@ void Write12F6xx(int dim,int dim2)
int err_e=0;
PrintMessage(strings[S_EEAreaW]); //"Writing EEPROM ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_EEAreaW]);
j=0;
bufferU[j++]=SET_PARAMETER;
bufferU[j++]=SET_T3;
@@ -1709,6 +1739,8 @@ void Write12F6xx(int dim,int dim2)
}
//****************** write ID, CONFIG, CALIB ********************
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
int ICDgoto=0x2800+(ICDaddr&0x7FF); //GOTO ICD routine (0x28xx)
bufferU[j++]=SET_PARAMETER;
@@ -1936,6 +1968,8 @@ void Write16F8x (int dim,int dim2)
PrintMessage1(strings[S_ConfigWord],config); //"Config word: 0x%04X\r\n"
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erase ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
j=0;
bufferU[j++]=SET_PARAMETER;
bufferU[j++]=SET_T3;
@@ -2035,6 +2069,8 @@ void Write16F8x (int dim,int dim2)
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
for(w=i=k=0,j=0;i<dim;i++){
if(memCODE_W[i]<0x3fff){
bufferU[j++]=LOAD_DATA_PROG;
@@ -2083,6 +2119,8 @@ void Write16F8x (int dim,int dim2)
if(dim2){
PrintMessage(strings[S_EEAreaW]); //"Writing EEPROM ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_EEAreaW]);
j=0;
bufferU[j++]=LOAD_CONF; //counter at 0x2000
bufferU[j++]=0xFF; //fake config
@@ -2137,6 +2175,8 @@ void Write16F8x (int dim,int dim2)
}
//****************** write ID, CONFIG ********************
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
bufferU[j++]=LOAD_CONF; //counter at 0x2000
bufferU[j++]=0xFF; //fake config
@@ -2300,6 +2340,8 @@ void Write16F62x (int dim,int dim2)
PrintMessage1(strings[S_ConfigWord],config); //"Config word: 0x%04X\r\n"
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erase ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
j=0;
bufferU[j++]=SET_PARAMETER;
bufferU[j++]=SET_T3;
@@ -2363,6 +2405,8 @@ void Write16F62x (int dim,int dim2)
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
for(w=i=k=0,j=0;i<dim;i++){
if(memCODE_W[i]<0x3fff){
bufferU[j++]=LOAD_DATA_PROG;
@@ -2411,6 +2455,8 @@ void Write16F62x (int dim,int dim2)
if(dim2){
PrintMessage(strings[S_EEAreaW]); //"Writing EEPROM ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_EEAreaW]);
j=0;
bufferU[j++]=LOAD_CONF; //counter at 0x2000
bufferU[j++]=0xFF; //fake config
@@ -2467,6 +2513,8 @@ void Write16F62x (int dim,int dim2)
}
//****************** write ID, CONFIG ********************
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
bufferU[j++]=LOAD_CONF; //counter at 0x2000
bufferU[j++]=0xFF; //fake config
@@ -2632,6 +2680,8 @@ void Write12F62x(int dim,int dim2)
if (!PIC16_ID(devID)) return;
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erase ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
j=0;
bufferU[j++]=EN_VPP_VCC; //enter program mode
bufferU[j++]=0x0;
@@ -2671,6 +2721,8 @@ void Write12F62x(int dim,int dim2)
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
if(!load_osccal) memCODE_W[dim-1]=osccal; //backup osccal
for(w=i=k=0,j=0;i<dim;i++){
if(memCODE_W[i]<0x3fff){
@@ -2720,6 +2772,8 @@ void Write12F62x(int dim,int dim2)
if(dim2){
PrintMessage(strings[S_EEAreaW]); //"Writing EEPROM ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_EEAreaW]);
j=0;
bufferU[j++]=SET_PARAMETER;
bufferU[j++]=SET_T3;
@@ -2781,6 +2835,8 @@ void Write12F62x(int dim,int dim2)
}
//****************** write ID, CONFIG, CALIB ********************
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
bufferU[j++]=LOAD_CONF; //counter at 0x2000
bufferU[j++]=0xFF; //fake config
@@ -2946,6 +3002,8 @@ void Write16F87x (int dim,int dim2)
PrintMessage1(strings[S_ConfigWord],config); //"Config word: 0x%04X\r\n"
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erase ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
j=0;
bufferU[j++]=SET_PARAMETER;
bufferU[j++]=SET_T3;
@@ -3039,6 +3097,8 @@ void Write16F87x (int dim,int dim2)
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
for(w=i=k=0,j=0;i<dim;i++){
if(memCODE_W[i]<0x3fff){
bufferU[j++]=LOAD_DATA_PROG;
@@ -3088,6 +3148,8 @@ void Write16F87x (int dim,int dim2)
int err_e=0;
PrintMessage(strings[S_EEAreaW]); //"Writing EEPROM ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_EEAreaW]);
j=0;
bufferU[j++]=LOAD_CONF; //counter at 0x2000
bufferU[j++]=0xFF; //fake config
@@ -3149,6 +3211,8 @@ void Write16F87x (int dim,int dim2)
}
//****************** write ID, CONFIG, CALIB ********************
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
int ICDgoto=0x2800+(ICDaddr&0x7FF); //GOTO ICD routine (0x28xx)
bufferU[j++]=SET_PARAMETER;
@@ -3330,6 +3394,8 @@ void Write16F87xA (int dim,int dim2,int seq)
PrintMessage1(strings[S_ConfigWord],config); //"Config word: 0x%04X\r\n"
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erase ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
j=0;
bufferU[j++]=SET_PARAMETER;
bufferU[j++]=SET_T3;
@@ -3363,6 +3429,8 @@ void Write16F87xA (int dim,int dim2,int seq)
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
for(w=i=k=0,j=0;i<dim;i++){
if(memCODE_W[i]<0x3fff){
bufferU[j++]=LOAD_DATA_PROG;
@@ -3414,6 +3482,8 @@ void Write16F87xA (int dim,int dim2,int seq)
int err_e=0;
PrintMessage(strings[S_EEAreaW]); //"Writing EEPROM ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_EEAreaW]);
j=0;
bufferU[j++]=SET_PARAMETER;
bufferU[j++]=SET_T3;
@@ -3473,6 +3543,8 @@ void Write16F87xA (int dim,int dim2,int seq)
}
//****************** write ID, CONFIG, CALIB ********************
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
int ICDgoto=0x2800+(ICDaddr&0x7FF); //GOTO ICD routine (0x28xx)
bufferU[j++]=SET_PARAMETER;
@@ -3672,6 +3744,8 @@ void Write16F81x (int dim,int dim2)
PrintMessage1(strings[S_ConfigWord],config); //"Config word: 0x%04X\r\n"
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erase ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
j=0;
bufferU[j++]=SET_PARAMETER;
bufferU[j++]=SET_T3;
@@ -3717,6 +3791,8 @@ void Write16F81x (int dim,int dim2)
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
for(w=i=k=0,j=0;i<dim;i++){
if(memCODE_W[i]<0x3fff){
bufferU[j++]=LOAD_DATA_PROG;
@@ -3768,6 +3844,8 @@ void Write16F81x (int dim,int dim2)
int err_e=0;
PrintMessage(strings[S_EEAreaW]); //"Writing EEPROM ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_EEAreaW]);
j=0;
bufferU[j++]=EN_VPP_VCC;
bufferU[j++]=0x1;
@@ -3840,6 +3918,8 @@ void Write16F81x (int dim,int dim2)
}
//****************** write ID, CONFIG, CALIB ********************
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
int ICDgoto=0x2800+(ICDaddr&0x7FF); //GOTO ICD routine (0x28xx)
bufferU[j++]=LOAD_CONF; //counter at 0x2000
@@ -4046,6 +4126,8 @@ void Write12F61x(int dim, int d, int d2)
if(calib2<0x3fff) PrintMessage1(strings[S_CalibWord2],calib2); //"Calib2: 0x%04X\r\n"
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erase ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
j=0;
bufferU[j++]=EN_VPP_VCC; //enter program mode
bufferU[j++]=0x0;
@@ -4089,6 +4171,8 @@ void Write12F61x(int dim, int d, int d2)
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
for(w=i=k=0,j=0;i<dim;i++){
if(memCODE_W[i]<0x3fff){
bufferU[j++]=LOAD_DATA_PROG;
@@ -4137,6 +4221,8 @@ void Write12F61x(int dim, int d, int d2)
PrintMessage1(strings[S_ComplErr],err); //"completed, %d errors\r\n"
//****************** write ID, CONFIG, CALIB ********************
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
bufferU[j++]=LOAD_CONF; //counter at 0x2000
bufferU[j++]=0xFF; //fake config
@@ -4329,6 +4415,8 @@ void Write16F88x(int dim,int dim2)
}
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erase ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
j=0;
bufferU[j++]=EN_VPP_VCC; //enter program mode
bufferU[j++]=0x0;
@@ -4370,6 +4458,8 @@ void Write16F88x(int dim,int dim2)
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
for(w=i=k=0,j=0;i<dim;i++){
if(memCODE_W[i]<0x3fff){
bufferU[j++]=LOAD_DATA_PROG;
@@ -4418,6 +4508,8 @@ void Write16F88x(int dim,int dim2)
if(dim2){
PrintMessage(strings[S_EEAreaW]); //"Writing EEPROM ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_EEAreaW]);
j=0;
bufferU[j++]=SET_PARAMETER;
bufferU[j++]=SET_T3;
@@ -4478,6 +4570,8 @@ void Write16F88x(int dim,int dim2)
}
//****************** write ID, CONFIG, CALIB ********************
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
int ICDgoto=0x2800+(ICDaddr&0x7FF); //GOTO ICD routine (0x28xx)
bufferU[j++]=SET_PARAMETER;
@@ -4675,6 +4769,8 @@ void Write16F7x(int dim,int vdd)
if (!PIC16_ID(devID)) return;
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erase ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
j=0;
//enter program mode
bufferU[j++]=EN_VPP_VCC; //VDD
@@ -4722,6 +4818,8 @@ void Write16F7x(int dim,int vdd)
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
for(w=i=k=0,j=0;i<dim;i++){
if(memCODE_W[i]<0x3fff){
bufferU[j++]=LOAD_DATA_PROG;
@@ -4769,6 +4867,8 @@ void Write16F7x(int dim,int vdd)
PrintMessage1(strings[S_ComplErr],err); //"completed, %d errors\r\n"
//****************** write ID, CONFIG, CALIB ********************
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
bufferU[j++]=LOAD_CONF; //counter at 0x2000
bufferU[j++]=0xFF; //fake config
@@ -4939,6 +5039,8 @@ void Write16F71x(int dim,int vdd)
if (!PIC16_ID(devID)) return;
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erase ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
j=0;
//enter program mode
bufferU[j++]=EN_VPP_VCC; //VDD
@@ -4989,6 +5091,8 @@ void Write16F71x(int dim,int vdd)
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
for(w=i=k=0,j=0;i<dim;i++){
if(memCODE_W[i]<0x3fff){
bufferU[j++]=LOAD_DATA_PROG;
@@ -5037,6 +5141,8 @@ void Write16F71x(int dim,int vdd)
PrintMessage1(strings[S_ComplErr],err); //"completed, %d errors\r\n"
//****************** write ID, CONFIG, CALIB ********************
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
bufferU[j++]=LOAD_CONF; //counter at 0x2000
bufferU[j++]=0xFF; //fake config
@@ -5206,6 +5312,8 @@ void Write16F72x(int dim, int d, int d2)
if (!PIC16_ID(devID)) return;
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erase ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
j=0;
if(programID||ICDenable){
bufferU[j++]=LOAD_CONF; //counter at 0x2000
@@ -5229,6 +5337,8 @@ void Write16F72x(int dim, int d, int d2)
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
for(w=i=k=0,j=0;i<dim;i++){
if(memCODE_W[i]<0x3fff){
bufferU[j++]=LOAD_DATA_PROG;
@@ -5275,6 +5385,8 @@ void Write16F72x(int dim, int d, int d2)
PrintMessage1(strings[S_ComplErr],err); //"completed, %d errors\r\n"
//****************** write ID, CONFIG, CALIB ********************
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
+ if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
int ICDgoto=0x2800+(ICDaddr&0x7FF); //GOTO ICD routine (0x28xx)
bufferU[j++]=SET_PARAMETER;
@@ -5568,6 +5680,7 @@ void Write16F1xxx(int dim,int dim2,int options)
}
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erasing ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
int dly=8;
j=0;
@@ -5613,6 +5726,7 @@ void Write16F1xxx(int dim,int dim2,int options)
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
fflush(logfile);
int valid,inc;
@@ -5705,6 +5819,7 @@ void Write16F1xxx(int dim,int dim2,int options)
//****************** verify code ********************
PrintMessage(strings[S_CodeV]); //"Verifying code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_CodeV]);
j=0;
if(!F18x){
@@ -5775,6 +5890,7 @@ void Write16F1xxx(int dim,int dim2,int options)
int errEE=0;
PrintMessage(strings[S_EEAreaW]); //"Writing EEPROM ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_EEAreaW]);
j=0;
bufferU[j++]=SET_PARAMETER;
@@ -5838,6 +5954,7 @@ void Write16F1xxx(int dim,int dim2,int options)
int errEE=0;
PrintMessage(strings[S_EEAreaW]); //"Writing EEPROM ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_EEAreaW]);
j=0;
bufferU[j++]=SET_PARAMETER;
@@ -5904,6 +6021,7 @@ void Write16F1xxx(int dim,int dim2,int options)
//****************** write ID, CONFIG, CALIB ********************
if(max_err&&err<max_err){
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
bufferU[j++]=SET_PARAMETER;
@@ -5968,7 +6086,7 @@ void Write16F1xxx(int dim,int dim2,int options)
PacketIO(18+j);
for(i=0,z=0;programID&&i<4;i++){
for(;z<DIMBUF-2&&bufferI[z]!=READ_DATA_PROG;z++);
- if (memCODE_W[0x8000+i]!=(bufferI[z+1]<<8)+bufferI[z+2]){
+ if(memCODE_W[0x8000+i]!=(bufferI[z+1]<<8)+bufferI[z+2]){
PrintMessage("\r\n");
PrintMessage3(strings[S_IDErr],i,memCODE_W[0x8000+i],(bufferI[z+1]<<8)+bufferI[z+2]); //"Error writing ID%d: written %04X, read %04X\r\n"
err_c++;
@@ -6046,13 +6164,15 @@ void Write16F18xxx(int dim,int dim2,int options)
// bit0=1 -> vdd before vpp
// bit1=1 -> LVP programming
// bit4=1 -> do not use DIA&DCI
+// bit5=1 -> Bulk erase with bit field payload
+// bit6=1 -> workaround for 16F152XX: turn-off/on after bulk erase
// DevREV@0x8005 DevID@0x8006
// Config@0x8007-800B
// Device info area @0x8100
// Device configuration info area @0x8200
-// erase: BULK_ERASE_PROGRAM_MEM (0x18) +14ms
+// erase: BULK_ERASE_PROGRAM_MEM (0x18) +14ms or 20ms
// EEPROM erase: idem
-// write flash: LOAD_NVM (0x0/2) + BEGIN_INT_PROG (0xE0) + 2.8ms (32 word algorithm)
+// write flash: LOAD_NVM (0x0/2) + BEGIN_INT_PROG (0xE0) + 2.8ms/7ms (32 word algorithm)
// EEPROM write: one word, 6ms
// config write: one word, 10ms
// verify after write
@@ -6061,6 +6181,8 @@ void Write16F18xxx(int dim,int dim2,int options)
WORD devID=0x3fff,devREV=0x3fff;
int k=0,k2=0,z=0,i,j,w;
int useDCI=(options&0x10)==0?1:0;
+ int bulkEraseField=(options&0x20)?1:0;
+ int reboot=(options&0x40)?1:0;
int rowN=32; //32 word algorithm
if(FWVersion<0xB00){
PrintMessage1(strings[S_FWver2old],"0.11.0"); //"This firmware is too old. Version %s is required\r\n"
@@ -6141,8 +6263,14 @@ void Write16F18xxx(int dim,int dim2,int options)
bufferU[j++]=READ_NVM_INC; //DevID
bufferU[j++]=SET_PARAMETER;
bufferU[j++]=SET_T3;
- bufferU[j++]=2800>>8;
- bufferU[j++]=2800&0xff;
+ if(!bulkEraseField){
+ bufferU[j++]=2800>>8;
+ bufferU[j++]=2800&0xff;
+ }
+ else{ //max delay for devices with bulk erase bit field (only 131xx require 7ms)
+ bufferU[j++]=7000>>8;
+ bufferU[j++]=7000&0xff;
+ }
bufferU[j++]=FLUSH;
for(;j<DIMBUF;j++) bufferU[j]=0x0;
PacketIO(5);
@@ -6157,6 +6285,7 @@ void Write16F18xxx(int dim,int dim2,int options)
if(memCODE_W[0x8006]<0x3FFF&&devID!=memCODE_W[0x8006]) PrintMessage(strings[S_DevMismatch]); //"Warning: the device is different from what specified in source data"
//****************** DIA-DCI ********************
if(useDCI){ //if not disabled
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"Device Information Area @0x8100\n");
WORD DIA[0x20];
bufferU[j++]=ICSP8_LOAD; //counter at 0x8100
@@ -6240,44 +6369,78 @@ void Write16F18xxx(int dim,int dim2,int options)
}
//****************** erase memory ********************
PrintMessage(strings[S_StartErase]); //"Erasing ... "
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_StartErase]);
j=0;
- bufferU[j++]=ICSP8_LOAD;
- bufferU[j++]=LOAD_PC_ADDR;
- if(programID){ //0x8000 to erase UserID
- bufferU[j++]=0x80;
- bufferU[j++]=0x00;
+ if(!bulkEraseField){ //bulk erase various regions depending on memory address
+ bufferU[j++]=ICSP8_LOAD;
+ bufferU[j++]=LOAD_PC_ADDR;
+ if(programID){ //0x8000 to erase UserID
+ bufferU[j++]=0x80;
+ bufferU[j++]=0x00;
+ }
+ else{ //only flash and config
+ bufferU[j++]=0x00;
+ bufferU[j++]=0x00;
+ }
+ bufferU[j++]=ICSP8_SHORT;
+ bufferU[j++]=BULK_ERASE_PROGRAM_MEM;
+ bufferU[j++]=WAIT_T3; // wait ~14ms
+ bufferU[j++]=WAIT_T3;
+ bufferU[j++]=WAIT_T3;
+ bufferU[j++]=WAIT_T3;
+ bufferU[j++]=WAIT_T3;
+ if(dim2){ //separate EEPROM erase (undocumented on 16F184xx devices)
+ bufferU[j++]=ICSP8_LOAD;
+ bufferU[j++]=LOAD_PC_ADDR;
+ bufferU[j++]=0xF0;
+ bufferU[j++]=0x00;
+ bufferU[j++]=ICSP8_SHORT;
+ bufferU[j++]=BULK_ERASE_PROGRAM_MEM;
+ bufferU[j++]=WAIT_T3; // wait ~14ms
+ bufferU[j++]=WAIT_T3;
+ bufferU[j++]=WAIT_T3;
+ bufferU[j++]=WAIT_T3;
+ bufferU[j++]=WAIT_T3;
+ }
}
- else{
+ else{ //bulk erase with bit field
+ bufferU[j++]=ICSP8_LOAD;
+ bufferU[j++]=LOAD_PC_ADDR;
+ bufferU[j++]=0x00;
bufferU[j++]=0x00;
+ bufferU[j++]=ICSP8_LOAD;
+ bufferU[j++]=BULK_ERASE_PROGRAM_MEM;
bufferU[j++]=0x00;
+ bufferU[j++]=programID?0x0F:0x0B;
+ bufferU[j++]=WAIT_T3; //3x7ms
+ bufferU[j++]=WAIT_T3;
+ bufferU[j++]=WAIT_T3;
}
- bufferU[j++]=ICSP8_SHORT;
- bufferU[j++]=BULK_ERASE_PROGRAM_MEM;
- bufferU[j++]=WAIT_T3; // wait ~14ms
- bufferU[j++]=WAIT_T3;
- bufferU[j++]=WAIT_T3;
- bufferU[j++]=WAIT_T3;
- bufferU[j++]=WAIT_T3;
- //separate EEPROM erase (undocumented on 16F184xx devices)
- bufferU[j++]=ICSP8_LOAD;
- bufferU[j++]=LOAD_PC_ADDR;
- bufferU[j++]=0xF0;
- bufferU[j++]=0x00;
- bufferU[j++]=ICSP8_SHORT;
- bufferU[j++]=BULK_ERASE_PROGRAM_MEM;
- bufferU[j++]=WAIT_T3; // wait ~14ms
- bufferU[j++]=WAIT_T3;
- bufferU[j++]=WAIT_T3;
- bufferU[j++]=WAIT_T3;
- bufferU[j++]=WAIT_T3;
bufferU[j++]=FLUSH;
for(;j<DIMBUF;j++) bufferU[j]=0x0;
PacketIO(30);
PrintMessage(strings[S_Compl]); //"completed\r\n"
+//**************** Workaround for 152xx: apparently it does not return from bulk erase
+ if(reboot){
+ j=0;
+ bufferU[j++]=EN_VPP_VCC; //enter program mode
+ bufferU[j++]=0x0;
+ bufferU[j++]=SET_CK_D;
+ bufferU[j++]=0x0;
+ bufferU[j++]=WAIT_T3;
+ bufferU[j++]=EN_VPP_VCC;
+ bufferU[j++]=4; //VPP
+ bufferU[j++]=EN_VPP_VCC;
+ bufferU[j++]=0x5; //VDD+VPP
+ bufferU[j++]=FLUSH;
+ for(;j<DIMBUF;j++) bufferU[j]=0x0;
+ PacketIO(2);
+ }
//****************** write code ********************
PrintMessage(strings[S_StartCodeProg]); //"Write code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_StartCodeProg]);
fflush(logfile);
int valid;
@@ -6306,7 +6469,7 @@ void Write16F18xxx(int dim,int dim2,int options)
}
if(i<dim){
bufferU[j++]=ICSP8_SHORT;
- bufferU[j++]=BEGIN_INT_PROG; //internally timed, T=2.8ms
+ bufferU[j++]=BEGIN_INT_PROG; //internally timed, T=2.8ms or 7ms
bufferU[j++]=WAIT_T3;
bufferU[j++]=FLUSH;
for(;j<DIMBUF;j++) bufferU[j]=0x0;
@@ -6323,6 +6486,7 @@ void Write16F18xxx(int dim,int dim2,int options)
//****************** verify code ********************
PrintMessage(strings[S_CodeV]); //"Verifying code ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_CodeV]);
j=0;
bufferU[j++]=ICSP8_LOAD;
@@ -6379,6 +6543,7 @@ void Write16F18xxx(int dim,int dim2,int options)
int errEE=0;
PrintMessage(strings[S_EEAreaW]); //"Writing EEPROM ... "
PrintStatusSetup();
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_EEAreaW]);
j=0;
bufferU[j++]=SET_PARAMETER;
@@ -6449,12 +6614,14 @@ void Write16F18xxx(int dim,int dim2,int options)
char t[256];
PrintMessage(strings[S_ConfigAreaW]); //"Writing CONFIG area ... "
PrintMessage("\r\n");
+ if(saveLog) fprintf(logfile,strings[S_sepLine]);
if(saveLog) fprintf(logfile,"%s\n",strings[S_ConfigAreaW]);
int err_c=0;
+ j=0;
bufferU[j++]=SET_PARAMETER;
bufferU[j++]=SET_T3;
- bufferU[j++]=10000>>8; //5.6ms in datasheet, but requires more in practice
- bufferU[j++]=10000&0xff;
+ bufferU[j++]=12000>>8; //some require 5.6ms, others up to 12ms
+ bufferU[j++]=12000&0xff;
if(programID){
bufferU[j++]=ICSP8_LOAD;
bufferU[j++]=LOAD_PC_ADDR; //load address
@@ -6467,13 +6634,13 @@ void Write16F18xxx(int dim,int dim2,int options)
bufferU[j++]=memCODE_W[i]&0xff; //LSB
bufferU[j++]=ICSP8_SHORT;
bufferU[j++]=BEGIN_INT_PROG; //internally timed
- bufferU[j++]=WAIT_T3; //Tprogram 10ms
+ bufferU[j++]=WAIT_T3; //Tprogram 12ms
bufferU[j++]=ICSP8_READ;
bufferU[j++]=READ_NVM_INC;
}
bufferU[j++]=FLUSH;
for(;j<DIMBUF;j++) bufferU[j]=0x0;
- PacketIO(45);
+ PacketIO(50);
for(i=0,z=0;i<4;i++){
for(;z<DIMBUF-2&&bufferI[z]!=ICSP8_READ;z++);
if (memCODE_W[0x8000+i]!=(bufferI[z+1]<<8)+bufferI[z+2]){
@@ -6495,13 +6662,13 @@ void Write16F18xxx(int dim,int dim2,int options)
bufferU[j++]=memCODE_W[i]&0xff; //LSB
bufferU[j++]=ICSP8_SHORT;
bufferU[j++]=BEGIN_INT_PROG; //internally timed
- bufferU[j++]=WAIT_T3; //Tprogram 10ms
+ bufferU[j++]=WAIT_T3; //Tprogram 12ms
bufferU[j++]=ICSP8_READ;
bufferU[j++]=READ_NVM_INC;
}
bufferU[j++]=FLUSH;
for(;j<DIMBUF;j++) bufferU[j]=0x0;
- PacketIO(55);
+ PacketIO(60);
for(i=0,z=0;i<5;i++){
for(;z<DIMBUF-2&&bufferI[z]!=ICSP8_READ;z++);
if (~memCODE_W[0x8007+i]&((bufferI[z+1]<<8)+bufferI[z+2])){ //error if written 0 and read 1 (~W&R)