void COpenProgDlg::Read18Fx(int dim,int dim2,int options){ // read 16 bit PIC 18Fxxxx // dim=program size dim2=eeprom size // options: // 0 = vdd before vpp (12V) // 1 = vdd before vpp (9V) // 2 = low voltage entry with 32 bit key CString str,aux; int k=0,k2=0,z=0,i,j; int entry=options&0xF; if(dim>0x1FFFFF||dim<0){ PrintMessage(strings[S_CodeLim]); //"Code size out of limits\r\n" return; } if(dim2>0x800||dim2<0){ PrintMessage(strings[S_EELim]); //"EEPROM size out of limits\r\n" return; } if(entry>0&&!CheckV33Regulator()){ PrintMessage(strings[S_noV33reg]); //Can't find 3.3V expansion board return; } double vpp=entry<2?(entry==0?12:8.5):-1; if(!StartHVReg(vpp)){ PrintMessage(strings[S_HVregErr]); //"HV regulator error\r\n" return; } if(saveLog){ OpenLogFile(); //"log.txt" fprintf(logfile,"Read18F(%d,%d,%d) (0x%X,0x%X,0x%X)\n",dim,dim2,options,dim,dim2,options); } memCODE.RemoveAll(); memCODE.SetSize(dim); //CODE memEE.RemoveAll(); memEE.SetSize(dim2); //EEPROM memID.RemoveAll(); memID.SetSize(8); //ID+CONFIG memCONFIG.RemoveAll(); memCONFIG.SetSize(14); //CONFIG unsigned int start=GetTickCount(); bufferU[0]=0; j=1; bufferU[j++]=SET_PARAMETER; bufferU[j++]=SET_T1T2; bufferU[j++]=1; //T1=1u bufferU[j++]=100; //T2=100u bufferU[j++]=SET_PARAMETER; bufferU[j++]=SET_T3; bufferU[j++]=2000>>8; bufferU[j++]=2000&0xff; bufferU[j++]=EN_VPP_VCC; //enter program mode bufferU[j++]=0x0; bufferU[j++]=SET_CK_D; bufferU[j++]=0x0; bufferU[j++]=EN_VPP_VCC; //VDD bufferU[j++]=0x1; bufferU[j++]=NOP; bufferU[j++]=EN_VPP_VCC; //VDD+VPP bufferU[j++]=0x5; if(entry==2){ //LV entry with key bufferU[j++]=EN_VPP_VCC; //VDD bufferU[j++]=0x1; bufferU[j++]=WAIT_T3; bufferU[j++]=WAIT_T3; bufferU[j++]=TX16; bufferU[j++]=2; bufferU[j++]=0x4D; bufferU[j++]=0x43; bufferU[j++]=0x48; bufferU[j++]=0x50; bufferU[j++]=EN_VPP_VCC; //VDD+VPP bufferU[j++]=0x5; bufferU[j++]=WAIT_T3; } bufferU[j++]=WAIT_T3; bufferU[j++]=CORE_INS; bufferU[j++]=0x0E; //3F bufferU[j++]=0x3F; bufferU[j++]=CORE_INS; bufferU[j++]=0x6E; //-> TBLPTRU bufferU[j++]=0xF8; bufferU[j++]=CORE_INS; bufferU[j++]=0x0E; //FF bufferU[j++]=0xFF; bufferU[j++]=CORE_INS; bufferU[j++]=0x6E; //-> TBLPTRH bufferU[j++]=0xF7; bufferU[j++]=CORE_INS; bufferU[j++]=0x0E; //FE bufferU[j++]=0xFE; bufferU[j++]=CORE_INS; bufferU[j++]=0x6E; //-> TBLPTRL bufferU[j++]=0xF6; bufferU[j++]=TBLR_INC_N; //DevID1-2 0x3FFFFE-F bufferU[j++]=2; bufferU[j++]=CORE_INS; bufferU[j++]=0x6A; //TBLPTRU bufferU[j++]=0xF8; //TBLPTRU bufferU[j++]=CORE_INS; bufferU[j++]=0x6A; //TBLPTRH bufferU[j++]=0xF7; //TBLPTRH bufferU[j++]=CORE_INS; bufferU[j++]=0x6A; //TBLPTRL bufferU[j++]=0xF6; //TBLPTRL bufferU[j++]=FLUSH; for(;j<DIMBUF;j++) bufferU[j]=0x0; write(); msDelay(3); if(entry==2) msDelay(7); read(); if(saveLog)WriteLogIO(); for(z=1;bufferI[z]!=TBLR_INC_N&&z<DIMBUF;z++); if(z<DIMBUF-3){ PrintMessage2(strings[S_DevID2],bufferI[z+3],bufferI[z+2]); //"DevID: 0x%02X%02X\r\n" PIC18_ID(bufferI[z+2]+(bufferI[z+3]<<8)); } //****************** read code ******************** PrintMessage(strings[S_CodeReading1]); //code read ... for(i=0,j=1;i<dim;i+=DIMBUF-4){ bufferU[j++]=TBLR_INC_N; bufferU[j++]=i<dim-(DIMBUF-4)?DIMBUF-4:dim-i; bufferU[j++]=FLUSH; for(;j<DIMBUF;j++) bufferU[j]=0x0; write(); msDelay(2); read(); if(bufferI[1]==TBLR_INC_N){ for(z=3;z<bufferI[2]+3&&z<DIMBUF;z++) memCODE[k++]=bufferI[z]; } PrintStatus(strings[S_CodeReading2],i*100/(dim+dim2),i); //"Read: %d%%, addr. %05X" j=1; if(saveLog){ fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d(0x%X), k=%d(0x%X)\n" WriteLogIO(); } } if(k!=dim){ PrintMessage("\r\n"); PrintMessage2(strings[S_ReadCodeErr2],dim,k); //"Error reading code area, requested %d bytes, read %d\r\n" } else PrintMessage(strings[S_Compl]); //****************** read config area ******************** bufferU[j++]=CORE_INS; bufferU[j++]=0x0E; //TBLPTRU ID 0x200000 bufferU[j++]=0x20; //TBLPTRU ID 0x200000 bufferU[j++]=CORE_INS; bufferU[j++]=0x6E; //TBLPTRU bufferU[j++]=0xF8; //TBLPTRU bufferU[j++]=CORE_INS; bufferU[j++]=0x6A; //TBLPTRH bufferU[j++]=0xF7; //TBLPTRH bufferU[j++]=CORE_INS; bufferU[j++]=0x6A; //TBLPTRL bufferU[j++]=0xF6; //TBLPTRL bufferU[j++]=TBLR_INC_N; bufferU[j++]=8; bufferU[j++]=CORE_INS; bufferU[j++]=0x0E; //TBLPTRU CONFIG 0x300000 bufferU[j++]=0x30; //TBLPTRU CONFIG 0x300000 bufferU[j++]=CORE_INS; bufferU[j++]=0x6E; //TBLPTRU bufferU[j++]=0xF8; //TBLPTRU bufferU[j++]=CORE_INS; bufferU[j++]=0x6A; //TBLPTRH bufferU[j++]=0xF7; //TBLPTRH bufferU[j++]=CORE_INS; bufferU[j++]=0x6A; //TBLPTRL bufferU[j++]=0xF6; //TBLPTRL bufferU[j++]=TBLR_INC_N; bufferU[j++]=14; bufferU[j++]=FLUSH; for(;j<DIMBUF;j++) bufferU[j]=0x0; write(); msDelay(8); read(); for(z=1;bufferI[z]!=TBLR_INC_N&&z<DIMBUF-28;z++); if(z<DIMBUF-28){ for(i=0;i<8;i++) memID[k2++]=bufferI[z+i+2]; for(;i<14+8;i++) memCONFIG[-8+k2++]=bufferI[z+i+8]; } j=1; if(saveLog){ fprintf(logfile,strings[S_Log7],i,i,k2,k2); //"i=%d(0x%X), k=%d(0x%X)\n" WriteLogIO(); } if(k2!=22){ PrintMessage2(strings[S_ReadConfigErr],22,k2); //"Error reading config area, requested %d bytes, read %d\r\n" } //****************** read eeprom ******************** if(dim2){ PrintMessage(strings[S_ReadEE]); //read eeprom ... bufferU[j++]=CORE_INS; bufferU[j++]=0x9E; //EEPGD=0 bufferU[j++]=0xA6; bufferU[j++]=CORE_INS; bufferU[j++]=0x9C; //CFGS=0 bufferU[j++]=0xA6; for(k2=0,i=0;i<dim2;i++){ bufferU[j++]=CORE_INS; bufferU[j++]=0x0E; bufferU[j++]=i&0xFF; bufferU[j++]=CORE_INS; bufferU[j++]=0x6E; //ADDR bufferU[j++]=0xA9; //ADDR bufferU[j++]=CORE_INS; bufferU[j++]=0x0E; bufferU[j++]=(i>>8)&0xFF; bufferU[j++]=CORE_INS; bufferU[j++]=0x6E; //ADDRH bufferU[j++]=0xAA; //ADDRH bufferU[j++]=CORE_INS; bufferU[j++]=0x80; //RD=1 :Read bufferU[j++]=0xA6; bufferU[j++]=CORE_INS; bufferU[j++]=0x50; //MOVF EEDATA,W bufferU[j++]=0xA8; bufferU[j++]=CORE_INS; bufferU[j++]=0x6E; //MOVWF TABLAT bufferU[j++]=0xF5; bufferU[j++]=CORE_INS; bufferU[j++]=0x00; //NOP bufferU[j++]=0x00; bufferU[j++]=SHIFT_TABLAT; if(j>DIMBUF-26||i==dim2-1){ bufferU[j++]=FLUSH; for(;j<DIMBUF;j++) bufferU[j]=0x0; write(); msDelay(10); read(); for(z=1;z<DIMBUF-1;z++){ if(bufferI[z]==SHIFT_TABLAT){ memEE[k2++]=bufferI[z+1]; z+=8; } } PrintStatus(strings[S_CodeReading],(i+dim)*100/(dim+dim2),i); //"Read: %d%%, addr. %03X" j=1; if(saveLog){ fprintf(logfile,strings[S_Log7],i,i,k2,k2); //"i=%d(0x%X), k=%d(0x%X)\n" WriteLogIO(); } } } if(k2!=dim2){ PrintMessage("\r\n"); PrintMessage2(strings[S_ReadEEErr],dim2,k2); //"Error reading EEPROM area, requested %d bytes, read %d\r\n" } else PrintMessage(strings[S_Compl]); } PrintMessage("\r\n"); //****************** exit ******************** bufferU[j++]=EN_VPP_VCC; //VDD bufferU[j++]=1; bufferU[j++]=EN_VPP_VCC; //0 bufferU[j++]=0x0; bufferU[j++]=SET_CK_D; bufferU[j++]=0x0; bufferU[j++]=FLUSH; for(;j<DIMBUF;j++) bufferU[j]=0x0; write(); msDelay(1); read(); unsigned int stop=GetTickCount(); StatusBar.SetWindowText(""); //****************** visualize ******************** for(i=0;i<8;i+=2){ PrintMessage4(strings[S_ChipID2],i,memID[i],i+1,memID[i+1]); //"ID%d: 0x%02X ID%d: 0x%02X\r\n" } for(i=0;i<7;i++){ PrintMessage2(strings[S_ConfigWordH],i+1,memCONFIG[i*2+1]); //"CONFIG%dH: 0x%02X\t" PrintMessage2(strings[S_ConfigWordL],i+1,memCONFIG[i*2]); //"CONFIG%dL: 0x%02X\r\n" } PrintMessage(strings[S_CodeMem]); //"\r\nCode memory:\r\n" char s[256],t[256]; s[0]=0; int valid=0,empty=1; for(i=0;i<dim;i+=COL*2){ valid=0; for(j=i;j<i+COL*2&&j<dim;j++){ sprintf(t,"%02X ",memCODE[j]); strcat(s,t); if(memCODE[j]<0xff) valid=1; } if(valid){ sprintf(t,"%04X: %s\r\n",i,s); aux+=t; empty=0; } s[0]=0; } if(empty) PrintMessage(strings[S_Empty]); //empty else PrintMessage(aux); if(dim2){ DisplayEE(); //visualize } PrintMessage1(strings[S_End],(stop-start)/1000.0); //"\r\nEnd (%.2f s)\r\n" if(saveLog) CloseLogFile(); }
void COpenProgDlg::Read12F5xx(int dim, int dim2) // read 12 bit PIC // dim=program size dim2=config size // vdd before vpp // CONFIG @ 0x7FF (upon entering in program mode) // OSCCAL in last memory location // 4 ID + reserved area beyond code memory { CString str,aux; int size; int k=0,z=0,i,j; char s[256],t[256]; if(dim2<4) dim2=4; size=0x1000; dati_hex.RemoveAll(); dati_hex.SetSize(size); if(saveLog){ OpenLogFile(); //"Log.txt" fprintf(logfile,"Read12F5xx(%d,%d)\n",dim,dim2); } unsigned int start=GetTickCount(); bufferU[0]=0; j=1; bufferU[j++]=SET_PARAMETER; bufferU[j++]=SET_T1T2; bufferU[j++]=1; //T1=1u bufferU[j++]=100; //T2=100u bufferU[j++]=SET_PARAMETER; bufferU[j++]=SET_T3; bufferU[j++]=2000>>8; bufferU[j++]=2000&0xff; bufferU[j++]=EN_VPP_VCC; //enter program mode bufferU[j++]=0x0; bufferU[j++]=SET_CK_D; bufferU[j++]=0x0; bufferU[j++]=EN_VPP_VCC; //VDD bufferU[j++]=0x1; bufferU[j++]=EN_VPP_VCC; //VDD+VPP bufferU[j++]=0x5; bufferU[j++]=NOP; bufferU[j++]=READ_DATA_PROG; //configuration word bufferU[j++]=INC_ADDR; // 7FF->000 bufferU[j++]=FLUSH; for(;j<DIMBUF;j++) bufferU[j]=0x0; write(); msDelay(2); read(); if(saveLog)WriteLogIO(); for(z=0;z<DIMBUF-2&&bufferI[z]!=READ_DATA_PROG;z++); if(z<DIMBUF-2){ dati_hex[0xfff]=(bufferI[z+1]<<8)+bufferI[z+2]; PrintMessage("\r\n"); PrintMessage1(strings[S_ConfigWord],dati_hex[0xfff]); //"\r\nConfiguration word: 0x%03X\r\n" switch(dati_hex[0xfff]&0x03){ case 0: PrintMessage(strings[S_LPOsc]); //"LP oscillator\r\n" break; case 1: PrintMessage(strings[S_XTOsc]); //"XT oscillator\r\n" break; case 2: PrintMessage(strings[S_IntOsc]); //"Internal osc.\r\n" break; case 3: PrintMessage(strings[S_RCOsc]); //"RC oscillator\r\n" break; } if(dati_hex[0xfff]&0x04) PrintMessage(strings[S_WDTON]); //"WDT ON\r\n" else PrintMessage(strings[S_WDTOFF]); //"WDT OFF\r\n" if(dati_hex[0xfff]&0x08) PrintMessage(strings[S_CPOFF]); //"Code protection OFF\r\n" else PrintMessage(strings[S_CPON]); //"Code protection ON\r\n" if(dati_hex[0xfff]&0x10) PrintMessage(strings[S_MCLRON]); //"Master clear ON\r\n" else PrintMessage(strings[S_MCLROFF]); //"Master clear OFF\r\n" } else PrintMessage(strings[S_NoConfigW]); //"Impossibile leggere la config word\r\n" //****************** read code ******************** PrintMessage(strings[S_CodeReading1]); //lettura codice ... for(i=0,j=1;i<dim+dim2;i++){ bufferU[j++]=READ_DATA_PROG; bufferU[j++]=INC_ADDR; if(j>DIMBUF*2/4-2||i==dim+dim2-1){ //2 istruzioni -> 4 risposte bufferU[j++]=FLUSH; for(;j<DIMBUF;j++) bufferU[j]=0x0; write(); msDelay(5); read(); for(z=1;z<DIMBUF-2;z++){ if(bufferI[z]==READ_DATA_PROG){ dati_hex[k++]=(bufferI[z+1]<<8)+bufferI[z+2]; z+=2; } } PrintStatus(strings[S_CodeReading],i*100/(dim+dim2),i); //"Read: %d%%, addr. %03X" j=1; if(saveLog){ fprintf(logfile,strings[S_Log7],i,i,k,k); //"i=%d(0x%X), k=%d(0x%X)\n" WriteLogIO(); } } } bufferU[j++]=NOP; //uscita program mode bufferU[j++]=EN_VPP_VCC; bufferU[j++]=0x1; bufferU[j++]=EN_VPP_VCC; bufferU[j++]=0x0; bufferU[j++]=SET_CK_D; bufferU[j++]=0x0; bufferU[j++]=WAIT_T3; bufferU[j++]=FLUSH; for(;j<DIMBUF;j++) bufferU[j]=0x0; write(); msDelay(1); read(); unsigned int stop=GetTickCount(); if(saveLog)CloseLogFile(); for(i=k;i<0xfff;i++) dati_hex[i]=0xfff; if(k!=dim+dim2){ PrintMessage2(strings[S_ReadErr],dim+dim2,k); //"Errore in lettura: word richieste=%d, lette=%d\r\n" } else PrintMessage1(strings[S_Compl],k); //"completed\n" //****************** visualize ******************** for(i=0;i<4;i+=2){ PrintMessage4(strings[S_ChipID],i,dati_hex[dim+i],i+1,dati_hex[dim+i+1]); //"ID%d: 0x%03X ID%d: 0x%03X\r\n" } if(dim2>4){ PrintMessage1(strings[S_BKOsccal],dati_hex[dim+4]); //"Backup OSCCAL: 0x%03X\r\n" } PrintMessage("\r\n"); PrintMessage(strings[S_CodeMem]); //"\r\nMemoria programma:\r\n" s[0]=0; int valid=0,empty=1; for(i=0;i<dim;i+=COL){ valid=0; for(j=i;j<i+COL&&j<dim;j++){ sprintf(t,"%03X ",dati_hex[j]); strcat(s,t); if(dati_hex[j]<0xfff) valid=1; } if(valid){ sprintf(t,"%04X: %s\r\n",i,s); empty=0; aux+=t; } s[0]=0; } if(empty) PrintMessage(strings[S_Empty]); //empty else PrintMessage(aux); aux.Empty(); if(dim2>5){ PrintMessage(strings[S_ConfigResMem]); //"\r\nMemoria configurazione e riservata:\r\n" empty=1; for(i=dim;i<dim+dim2;i+=COL){ valid=0; for(j=i;j<i+COL&&j<dim+64;j++){ sprintf(t,"%03X ",dati_hex[j]); strcat(s,t); if(dati_hex[j]<0xfff) valid=1; } if(valid){ sprintf(t,"%04X: %s\r\n",i,s); empty=0; aux+=t; } s[0]=0; } if(empty) PrintMessage(strings[S_Empty]); //empty else PrintMessage(aux); } StatusBar.SetWindowText(""); PrintMessage("\r\n"); PrintMessage1(strings[S_End],(stop-start)/1000.0); //"\r\nEnd (%.2f s)\r\n" }