diff options
Diffstat (limited to 'progP16.c')
-rw-r--r-- | progP16.c | 243 |
1 files changed, 205 insertions, 38 deletions
@@ -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) |