Nadgradnja (eeprom hack) multimetra UT210E

futuristic

geđet frik
Osebje foruma
13. jul 2007
7.845
604
113
Multimeter Uni-T UT210E ima čip DTM0660, ki ima objavljeno dokumentacijo o konfiguraciji preko eeproma.

Posledično se da ta multimeter in tiste z enakim čipom (UNI-T 139C, Velleman DV4100, Tekpower TP40, Victor VC921,ennoLogic eM860T) nadgraditi z določenimi opcijami, ki so sicer na voljo samo v veliko dražjih modelih.

Par stvari, ki jih spodnji postopek pofixa:
- Count 6200
- Power off po30min
- Backlight čas 3min
- Alarmi onemogočeni
- NCV prikaz v mV
- DC kot privzet način

Postopek je precej enostaven; rabimo samo en arduino in par žičk.

Najprej je potrebno odstraniti baterije in preklopiti vrteč gumb na "~V".
Potem lahko odstraniš zadnjo stranico.

Nato povežeš vezje z (izklopljenim) arduinotom takole:
2532171-i2c-pinout.jpg


Vštekaš arduinota v usb, odpreš serial port monitor v arduino IDE in poženeš kodo:

Koda:
 #include <Wire.h>
const int I2C_ADDR = 0x50;

void MODeeprom() {

  Serial.print("\n...Flashing EEPROM...\n");
 
  //Dotless mode calibration data, copied from 0x50, 0x51
  writeByte(I2C_ADDR, 0x56, (byte) 0x00);
  writeByte(I2C_ADDR, 0x57, (byte) 0x00);

  writeByte(I2C_ADDR, 0xFB, (byte) 0x1E); //Power off after 30min
  writeByte(I2C_ADDR, 0xFC, (byte) 0xB4); //Backlight time 3min

  //Count 6200
  writeByte(I2C_ADDR, 0x12, (byte) 0x38);
  writeByte(I2C_ADDR, 0x13, (byte) 0x18);

  //Alarms disabled
  writeByte(I2C_ADDR, 0x16, (byte) 0xFF);
  writeByte(I2C_ADDR, 0x17, (byte) 0xFF);
  writeByte(I2C_ADDR, 0x18, (byte) 0xFF);
  writeByte(I2C_ADDR, 0x19, (byte) 0xFF);
  writeByte(I2C_ADDR, 0x1C, (byte) 0xFF);

  //With selector in 2A order:
  writeByte(I2C_ADDR, 0x87, (byte) 0x1C);  //Dotless DCA
  writeByte(I2C_ADDR, 0x97, (byte) 0x1D);  //Dotless ACA
  writeByte(I2C_ADDR, 0xA7, (byte) 0x1C);  //Dot DCA
  writeByte(I2C_ADDR, 0xB7, (byte) 0x1D);  //Dot ACA

  //With selector in 20A order:
  writeByte(I2C_ADDR, 0x8B, (byte) 0x18);  //Dot DCA
  writeByte(I2C_ADDR, 0x9B, (byte) 0x19);  //Dot ACA

  //With selector in NCV Display in mV
  writeByte(I2C_ADDR, 0x9C, (byte) 0x02);
  writeByte(I2C_ADDR, 0xAC, (byte) 0x1D);

  //With selector in 100A order is: (DC)A - (AC)A
  writeByte(I2C_ADDR, 0x8D, (byte) 0x1A);
  writeByte(I2C_ADDR, 0x9D, (byte) 0x1B);
  
  //With selector in V range order is: V(DC) - V(AC) - V(DC mV) - V(AC mV)
  writeByte(I2C_ADDR, 0x8E, (byte) 0x03);
  writeByte(I2C_ADDR, 0x9E, (byte) 0x04);  
  writeByte(I2C_ADDR, 0xAE, (byte) 0x05);
  writeByte(I2C_ADDR, 0xBE, (byte) 0x06);
}

void printHex(int num, int precision) {
  char tmp[16];
  char format[128];

  sprintf(format, "%%.%dX", precision);

  sprintf(tmp, format, num);
  Serial.print(tmp);
}

void setup() {

  Serial.begin(9600);
  Wire.begin();
  Serial.print("\n...Before EEPROM Dump...\n");
  dumpEEPROM();
  delay(10);
  
  //MODeeprom();
  
  delay(10);
  Serial.print("\n...After EEPROM Dump...\n");
  dumpEEPROM();
}
void loop() {}

void dumpEEPROM()
{
  for (int i = 0; i < 256; i++) {
    byte b = readByte(I2C_ADDR, i);
    //Serial.print(b, HEX); Serial.print(" ");
    printHex(b, 2); Serial.print(" ");
    if ((i + 1) % 16 == 0) Serial.println();
  }
  Serial.println();
}

void writeByte(int i2cAddr, unsigned int addr, byte data) {
  Wire.beginTransmission(i2cAddr);
  Wire.write(addr);
  Wire.write(data);
  Wire.endTransmission();
  delay(5);
}

byte readByte(int i2cAddr, unsigned int addr) {
  byte data = 0x00;
  Wire.beginTransmission(i2cAddr);
  Wire.write(addr);
  Wire.endTransmission();
  Wire.requestFrom(i2cAddr, 1);
  while (!Wire.available()) ;
  data = Wire.read();
  return data;
}

Izpiše se ti vsebina eeproma (2x). Shrani si jo nekam na varno za backup...

Npr pri meni je bilo:
2532180-eeprom.PNG


Nato 1 in 2 byte v 6 vrstici vneseš v 9 in 10 vrtico kode v arduinotu.

Npr moj primer:
Na teh lokacijah imam "1B" in "8B", kar sem dal v arduino kodo takole:
writeByte(I2C_ADDR, 0x56, (byte) 0x1B);
writeByte(I2C_ADDR, 0x57, (byte) 0x8B);


Nato v 69 vrstici odkomentiraš //MODeeprom(); da postane: MODeeprom();

Sedaj ponovno poženeš kodo in arduino bo zapisal nove vrednosti v eeprom.

To je to.
wink-1.gif


Par fotk (uporabil sem diy pogo pins pripomoček, da mi ni bilo treba nič lotati...)

2532172-ut1.jpg

2532173-ut2.jpg

2532175-ut3.jpg

(pini so zviti namenoma, ker je 1.27mm razmika)
2532177-ut4.jpg


Več o tem hacku: http://www.eevblog.com/forum/testgear/a-look-at-the-uni-t-ut210e/
 

tony

Guru
23. jul 2007
9.395
1.356
113
Pazi se: zdaj zdaj bodo uletele Horde pravičnikov za zaščito svinjskih interesov Svinjskih korporacij, včlanjenih med oboževalce katalogov turističnih kapacitet s Kajmanskih OtokovTM, in ti začeli predavati, da tvoje početje krši pravice Svinjskih korporacij
grims-1.gif


APZ, na pomoč!!!
cool-1.gif
 

futuristic

geđet frik
Osebje foruma
13. jul 2007
7.845
604
113
Hja no jaz sem mnenja, da ko enkrat kupiš neko reč je tvoja. Torej jo lahko predelaš, uničiš ozr. narediš z rečjo kar ti srce poželi...
wink-1.gif
 

mercedes

Majstr
16. dec 2014
2.404
146
63
Citat:
Uporabnik futuristic pravi:
Multimeter Uni-T UT210E ima čip DTM0660, ki ima objavljeno dokumentacijo o konfiguraciji preko eeproma.

Posledično se da ta multimeter in tiste z enakim čipom (UNI-T 139C, Velleman DV4100, Tekpower TP40, Victor VC921,ennoLogic eM860T) nadgraditi z določenimi opcijami, ki so sicer na voljo samo v veliko dražjih modelih.

Par stvari, ki jih spodnji postopek pofixa:
- Count 6200
- Power off po30min
- Backlight čas 3min
- Alarmi onemogočeni
- NCV prikaz v mV
- DC kot privzet način

Postopek je precej enostaven; rabimo samo en arduino in par žičk.

Najprej je potrebno odstraniti baterije in preklopiti vrteč gumb na "~V".
Potem lahko odstraniš zadnjo stranico.

Nato povežeš vezje z (izklopljenim) arduinotom takole:
2532171-i2c-pinout.jpg


Vštekaš arduinota v usb, odpreš serial port monitor v arduino IDE in poženeš kodo:

Koda:
 #include <Wire.h>
const int I2C_ADDR = 0x50;

void MODeeprom() {

  Serial.print("\n...Flashing EEPROM...\n");
 
  //Dotless mode calibration data, copied from 0x50, 0x51
  writeByte(I2C_ADDR, 0x56, (byte) 0x00);
  writeByte(I2C_ADDR, 0x57, (byte) 0x00);

  writeByte(I2C_ADDR, 0xFB, (byte) 0x1E); //Power off after 30min
  writeByte(I2C_ADDR, 0xFC, (byte) 0xB4); //Backlight time 3min

  //Count 6200
  writeByte(I2C_ADDR, 0x12, (byte) 0x38);
  writeByte(I2C_ADDR, 0x13, (byte) 0x18);

  //Alarms disabled
  writeByte(I2C_ADDR, 0x16, (byte) 0xFF);
  writeByte(I2C_ADDR, 0x17, (byte) 0xFF);
  writeByte(I2C_ADDR, 0x18, (byte) 0xFF);
  writeByte(I2C_ADDR, 0x19, (byte) 0xFF);
  writeByte(I2C_ADDR, 0x1C, (byte) 0xFF);

  //With selector in 2A order:
  writeByte(I2C_ADDR, 0x87, (byte) 0x1C);  //Dotless DCA
  writeByte(I2C_ADDR, 0x97, (byte) 0x1D);  //Dotless ACA
  writeByte(I2C_ADDR, 0xA7, (byte) 0x1C);  //Dot DCA
  writeByte(I2C_ADDR, 0xB7, (byte) 0x1D);  //Dot ACA

  //With selector in 20A order:
  writeByte(I2C_ADDR, 0x8B, (byte) 0x18);  //Dot DCA
  writeByte(I2C_ADDR, 0x9B, (byte) 0x19);  //Dot ACA

  //With selector in NCV Display in mV
  writeByte(I2C_ADDR, 0x9C, (byte) 0x02);
  writeByte(I2C_ADDR, 0xAC, (byte) 0x1D);

  //With selector in 100A order is: (DC)A - (AC)A
  writeByte(I2C_ADDR, 0x8D, (byte) 0x1A);
  writeByte(I2C_ADDR, 0x9D, (byte) 0x1B);
  
  //With selector in V range order is: V(DC) - V(AC) - V(DC mV) - V(AC mV)
  writeByte(I2C_ADDR, 0x8E, (byte) 0x03);
  writeByte(I2C_ADDR, 0x9E, (byte) 0x04);  
  writeByte(I2C_ADDR, 0xAE, (byte) 0x05);
  writeByte(I2C_ADDR, 0xBE, (byte) 0x06);
}

void printHex(int num, int precision) {
  char tmp[16];
  char format[128];

  sprintf(format, "%%.%dX", precision);

  sprintf(tmp, format, num);
  Serial.print(tmp);
}

void setup() {

  Serial.begin(9600);
  Wire.begin();
  Serial.print("\n...Before EEPROM Dump...\n");
  dumpEEPROM();
  delay(10);
  
  //MODeeprom();
  
  delay(10);
  Serial.print("\n...After EEPROM Dump...\n");
  dumpEEPROM();
}
void loop() {}

void dumpEEPROM()
{
  for (int i = 0; i < 256; i++) {
    byte b = readByte(I2C_ADDR, i);
    //Serial.print(b, HEX); Serial.print(" ");
    printHex(b, 2); Serial.print(" ");
    if ((i + 1) % 16 == 0) Serial.println();
  }
  Serial.println();
}

void writeByte(int i2cAddr, unsigned int addr, byte data) {
  Wire.beginTransmission(i2cAddr);
  Wire.write(addr);
  Wire.write(data);
  Wire.endTransmission();
  delay(5);
}

byte readByte(int i2cAddr, unsigned int addr) {
  byte data = 0x00;
  Wire.beginTransmission(i2cAddr);
  Wire.write(addr);
  Wire.endTransmission();
  Wire.requestFrom(i2cAddr, 1);
  while (!Wire.available()) ;
  data = Wire.read();
  return data;
}

Izpiše se ti vsebina eeproma (2x). Shrani si jo nekam na varno za backup...

Npr pri meni je bilo:
2532180-eeprom.PNG


Nato 1 in 2 byte v 6 vrstici vneseš v 9 in 10 vrtico kode v arduinotu.

Npr moj primer:
Na teh lokacijah imam "1B" in "8B", kar sem dal v arduino kodo takole:
writeByte(I2C_ADDR, 0x56, (byte) 0x1B);
writeByte(I2C_ADDR, 0x57, (byte) 0x8B);


Nato v 69 vrstici odkomentiraš //MODeeprom(); da postane: MODeeprom();

Sedaj ponovno poženeš kodo in arduino bo zapisal nove vrednosti v eeprom.

To je to.
wink-1.gif


Par fotk (uporabil sem diy pogo pins pripomoček, da mi ni bilo treba nič lotati...)

2532172-ut1.jpg

2532173-ut2.jpg

2532175-ut3.jpg

(pini so zviti namenoma, ker je 1.27mm razmika)
2532177-ut4.jpg


Več o tem hacku: http://www.eevblog.com/forum/testgear/a-look-at-the-uni-t-ut210e/


aplauz.gif

Complimenti...

Super si tole uštimal...Samo zaradi tega bom nabavil tele klešče..da damo mal živčke na pašo..hehe

Lp
 

tony

Guru
23. jul 2007
9.395
1.356
113
Citat:
Uporabnik futuristic pravi:
Hja no jaz sem mnenja, da ko enkrat kupiš neko reč je tvoja. Torej jo lahko predelaš, uničiš ozr. narediš z rečjo kar ti srce poželi...
wink-1.gif

Jaz tudi, ampak, še čakam sralce, ki bodo povedali, da se motim kolikor sem dolg in širok
aplauz.gif
 

futuristic

geđet frik
Osebje foruma
13. jul 2007
7.845
604
113
Citat:
Uporabnik XSIDE pravi:
Odlično
cheer.gif

Čas kako dolgo je backlight vklopljen in po kolikšnem času naj se multimeter ugasne lahko nastaviš tudi po lastnih potrebah...

Trenutno je:

writeByte(I2C_ADDR, 0xFB, (byte) 0x1E); //Power off after 30min

1E v hexu je 30 v dec. Pomeni 30 minut. Če bi tam dal npr 0F potem bi se ugasnil po 15min.

writeByte(I2C_ADDR, 0xFC, (byte) 0xB4); //Backlight time 3min

B4 v hexu je 180 v dec. Pomeni 180sekund. Lahko daš npr F0 pa bo vključen 4 minute (240sec).
 

Roberto

Majstr
19. jul 2007
12.057
154
63
Doma
Da ne boste pametni...
Kupili ste strojno opremo (glupo gajbo) ki je v vaši lasti. Programsko opremo ki teče na njej ste pa najeli in se strinjali, da je ne boste spreminjali kakorkoli. Programska oprema je intelektualna lastnina in plačali ste licenčnino za uporabo.
Če ne verjamete, preberite dokumentacijo.
Isto velja za multimeter, OS na PCju ali programsko opremo v avtu (vklapljane nelicenciranih funkcionalnosti).

Zgolj v vednost.
 

tony

Guru
23. jul 2007
9.395
1.356
113
a) Lažja varianta: Hja, na Balkanu smo, je6iga
smile-1.gif


b) Težja varianta: potrošniki moramo svoje pravice iztožiti na sodišču. Tako je npr. prišla v veljavo odločitev Švabskega sodišča, ki je odločilo, da je MSjeva določba, da kište z OEM Windowsi (ali nekaj takega) prvotni lastnik ne sme prodati, nezakonita.
 

Roberto

Majstr
19. jul 2007
12.057
154
63
Doma
Sem bral. Kaj bo ista država potem uredila ko bo nastopil audit in BSA pa še ne veš. Ampak to še zmeraj ne pomeni da si kupil OEM winse ampak samo da si kupil pravico do uporabe winsow... Torej originalni pogoji še zmeraj veljajo. Ni dovoljeno poseganje v kodo.

Meni je vseeno kaj počneš, samo povem ti kaj pomeni "nakup programske opreme"...
Mimogrede, a to veš, da če pri HPS ali IBM nimaš sklenjene pogodbe o vzdrževanju ne moreš nadgraditi programske opreme (mikrokode)?
In si v prekršku če jo kakorkoli pridobiš preko "standardnih" kanalov?
 

tony

Guru
23. jul 2007
9.395
1.356
113
Vem, kar pa ne pomeni, da se na (zasebni) ravni s tem tudi strinjam. Tole s HPjevim serverskim firmwarom sem doživel zadnjič v živo in preklel oba, tako Hja kot Pja, da se še zdaj v grobu obračata.
redface-1.gif
Firmware sem potem dobil prek nestandardnih kanalov (na HPjevem webu me niti zraven niso spustili do download pejdža).

(Mimogrede bi še opozoril na nekonsistetno politiko HPja: pri omrežnih napravah, kjer je očitno konkurence več kot pri serverjih, se pa hvalijo, kako delajo po standardih, in imajo vso dokumentacijo in ves softver na voljo brezplačno na netu. Potrebna ni niti registracija...
wink-1.gif
).

Prišel sem do sklepa, da od HPja ne kupim več niti svinčnika.
zmaga.gif
 
13. jul 2011
2.677
625
113
KSZ

Evo, to pa lahko samo jaz naredim. Sem flashal svojega UT210E in ko sem končal sem populil ven žičke (v luknje sem zalotal pine) in avtomatsko sem izpulil tudi tisto, ki je bila prilotana na kondenzator. Seveda sem uničil kondenzator. Ve mogoče kdo njegovo vrednost?
 

boc

Majstr
1. avg 2007
2.366
432
83
Citat:
Uporabnik Roberto pravi:
Če ne verjamete, preberite dokumentacijo.
Lahko kakšen link za konkretno ali podobno napravo?
Kako pa ce naložim svoj SW?
 

tony

Guru
23. jul 2007
9.395
1.356
113
Citat:
Uporabnik boc pravi:
Citat:
Uporabnik Roberto pravi:
Če ne verjamete, preberite dokumentacijo.
Lahko kakšen link za konkretno ali podobno napravo?
Kako pa ce naložim svoj SW?

Kdo bi vedel, morda bi šlo pravno skozi, če bi odlotal tovarniški flash in fizično nalotal svojega. Vse je odvisno od EULE, ki je prišla zraven z napravo. Kot je napisal Robert, običajno s programsko opremo te ne dobiš v last, ampak ti dajo le omejeno pravico do uporabe le-te, običajno pa zraven tudi določijo, da je ni dovoljeno razstavljati in spreminjati. Dokler se ne bo našel nek norec in milijardne koroporacije iztožil do zadnjih gat, bo tako tudi ostalo...
 

Numy

Majstr
1. jan 2008
9.833
371
83
Citat:
Uporabnik Roberto pravi:
Programsko opremo ki teče na njej ste pa najeli in se strinjali, da je ne boste spreminjali kakorkoli.
Saj jo nisem jaz, ampak sosedov Francelj, on ni nič podpisal.
evil.gif
 
13. jul 2011
2.677
625
113
Hvala! Kot kaže je to C8 100n - ta ki je na pinu 55
Sicer multimeter deluje, ampak verjetno ne bo meril pravilno vsega. Zaenkrat sem testiral V= in dela.