Bu malzeme Nedir ?

Başlatan ByTEK, 02 Mayıs 2019, 20:12:13

ByTEK

Merhaba Arkadaşlar,

Elimde bir Toner Chip'i var üzerinde "4S+ 2001 724B1" ibaresi yazıyor. Bunu arduino ile okumak istiyorum. Ürün kılıfı aşağıdaki görseldeki gibi. DS2430 Lib ile sadece ilk 64 bitlik bir değer okudum. ama sadece elimde bu kadar bilgi var. Belki DS24xx eprom serisi ile aynıdır ama "ds.readpage fonksiyonu" ile hiç bir data okuyamadım.

sadece ilk 8 byte içinde aşağıdaki bilgiler yazıyor.

C5-D2-75-67-50-1B-0-2E


Ürün kılıfı

mustafa_cmbz

Bu tarz chipler yazılıp silinebiliyormu acaba kullanım şekli tam olarak nasıl ?

ByTEK

Bu chip içinde tonerin sayfa kapasitesi tutuluyor. Ve her çıktı alındığında yazıcı tarafından içine bilgi yazılıyor. Sayaç belli bir sayıya geldiğinde toner bitti ikazı veriyor. Aynı zamanda aynı chip olup 2500,12000,6000 gibi sayfa kapasiteleri chip içinde yazılı zaten.

Marka bu dataları paylaşmıyor ki herkes kopyalamasın. benim amacım 2500 Sayfa olan chipin içindeki sayacı bulup arttırmak. çünkü her dolumda harici olarak chip sadece tek başına 10$+KDV ye geliyor. Dolup yapıp resetleyim diye düşündüm.

ziyaretci

#3
Hocam, okuduğunuz değer kodlanmış olabilir. Eğer her çıktı aldığınızda söküp son veriyi bir kenera koyarsanız(çözünceye kadar) belki dekod yapabilirsiniz. Ona görede tazelersiniz içindeki veriyi.

Ya da data hattına paralel atıp algoritmayı çözebilirsiniz. Ona görede kendiniz bir crack devre tasarlayıp hiç arttırmamasınıda sağlayabilirsiniz.

Demek bu bellekte depolanıyormuş. İlk fırsatta  deneyeceğim. Tonerin içinde mi bu bellek yoksa ana kartta mı oluyor?

ByTEK

#4
Alıntı yapılan: erkantr67 - 03 Mayıs 2019, 03:38:10Hocam, okuduğunuz değer kodlanmış olabilir. Eğer her çıktı aldığınızda söküp son veriyi bir kenera koyarsanız(çözünceye kadar) belki dekod yapabilirsiniz. Ona görede tazelersiniz içindeki veriyi.

Ya da data hattına paralel atıp algoritmayı çözebilirsiniz. Ona görede kendiniz bir crack devre tasarlayıp hiç arttırmamasınıda sağlayabilirsiniz.

Demek bu bellekte depolanıyormuş. İlk fırsatta  deneyeceğim. Tonerin içinde mi bu bellek yoksa ana kartta mı oluyor?

Hocam bilgilendirme icin teşekkürler. Elimde birden fazla var ve dataları okudum. Excelde verileri tablo haline getirdim. 4 tane farklı CHIP icin okuma yaptım. İlk mesajda verdiğim sadece chip in değişmeyen adresiymiş. Asil data kısmı 160 Byte daha var. Suan icin ds2430 lib ile başarabildim. Demek ayni algoritmayı uygulamislar. İçine data yazma İşini henüz çözemedim.

Bu arada bu toner chipi oki mb471,mb451,es4191 model Yazıcının. Her marka model farklı çözümler farklı chipler üretmişler.

ORJ YARIM DOLU CHIP
-----------------------------------------------
|                  CHIP ADRES                 |
-----------------------------------------------
            C5 D2 75 67 50 1B 00 2E 
-----------------------------------------------
|                 CHIP DATA                   |
-----------------------------------------------
E0 C3 79 00 00 00 00 00 20 03 00 0F 00 00 09 C0 
12 3A 0F 01 B2 00 00 4E 00 00 00 00 00 00 00 00 
00 00 00 00 45 53 34 31 77 73 68 00 00 00 26 87 
18 05 02 96 36 02 01 10 44 02 66 45 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
FF FF FF FF FF FF FF FF 55 00 AA 55 00 55 00 00 
C5 D2 75 67 50 1B 00 2E 00 00 00 AA 00 00 00 00

ORJ BITIK CHIP İÇERİĞİ
-----------------------------------------------
|                  CHIP ADRES                 |
-----------------------------------------------
            C5 01 52 5F 50 1B 00 4E 
-----------------------------------------------
|                 CHIP DATA                   |
-----------------------------------------------
E0 C3 79 00 00 00 00 00 20 03 00 14 00 00 09 C0 
11 6A 14 01 B2 00 00 4E 00 00 00 00 00 00 00 00 
EF C7 04 92 ED 04 01 10 48 05 91 84 00 00 00 00 
40 2F 09 00 45 53 34 31 A6 2A 69 00 03 1D 03 83 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
FF FF FF FF FF FF FF FF 55 00 AA 55 00 55 00 00 
C5 01 52 5F 50 1B 00 4E 00 00 00 AA 00 00 00 00

YAN SAN CHIP
-----------------------------------------------
|                  CHIP ADRES                 |
-----------------------------------------------
            C5 B6 4F 10 50 1B 00 26 
-----------------------------------------------
|                 CHIP DATA                   |
-----------------------------------------------
00 00 00 00 00 00 00 00 0C 8A 0D 01 B2 25 00 4E 
10 03 00 0D 00 00 01 C1 24 5E 19 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
FF FF FF FF FF FF FF FF 55 00 00 55 00 55 00 00 
C5 B6 4F 10 50 1B 00 26 00 00 00 AA 00 00 00 00

ferit06

#5
Bizim kullandığımız yazıcılarda  (  Toner Dram ayrı Dramda)24C04 kullanmışlar. Bunlarda datalar 4 ayrı blokta yazılmış ve aynı 4 blok epromun iki yarısında tekrarlanmış. Biz az kullanılmış bir yazıcıdan kopyaladığımızı kapastesini tamamlamış olanlara yazarak tekrar kullanabiliyoruz.

Sizn kullandığınız ds.readpage fonksiyonu için başlangıç adresi 0 dır bu adresi değiştirerek sonraki adreslerdeki bilgileri de okuyabilirsiniz( Bu sizin fonsiyonu görmediğim için bir tahmin). Bizim 24C04 için okuma yazama için kullanılan açık kodlu programda da benzer bir fonksiyon var ve ilk olarak 16 byte lık veri okunuyor.  Aşağıda bizim üzerinde değişiklikler yaparak kullandığımız açık programın orjinali var;

/* 
  *  Use the I2C bus with small EEPROMs
  *  24C01, 20C02, 24C04, 24C08, 24C16
  *  Sketch:    I2C_EEPROM_Small.pde
  *  
  *  Derived from sketch for 24C64 devices posted on
  *     http://www.arduino.cc/playground/Code/I2CEEPROM
  *  From  hkhijhe   Date: 01/10/2010
  * 
  *  This one by davekw7x
  *  March, 2011
  *
  * For a single device, connect as follows:
  * EEPROM 4 (GND) to GND
  * EEPROM 8 (Vcc) to Vcc (5 Volts)
  * EEPROM 5 (SDA) to Arduino Analog Pin 4
  * EEPROM 6 (SCL) to Arduino Analog Pin 5
  * EEPROM 7 (WP)  to GND
  * EEPROM 1 (A0)  to GND
  * EEPROM 2 (A1)  to GND
  * EEPROM 3 (A2)  to GND
  */

#include <Wire.h>


// The seven-bit device address for EEPROMs
// I'll define it here rather than hard-code it inside all of the
// functions.
// EEPROM'lar için yedi bitlik cihaz adresi
// Tüm bunları içinde kodlamak yerine burada tanımlayacağım.
// işlevler.
//
const byte DEVADDR = 0x51;

void setup()
{
    byte msg1[] = "Message 1.";   // data to write
    byte msg2[] = "Zaphod says yo";
    byte msg3[] = "Tttthat's all, folks!";
    byte msgf[16] = {
        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
    
   
    };
    
    
    Wire.begin();
    Serial.begin(9600);
/*
    //
    // Change #if 0 to #if 1 and it will erase the
    // EEPROM pages that we are going to write to:
    //
    #if 1
      eeprom_write_page(DEVADDR, 0x000, msgf, 16);
      eeprom_write_page(DEVADDR, 0x010, msgf, 16);
      eeprom_write_page(DEVADDR, 0x020, msgf, 16);
      eeprom_write_page(DEVADDR, 0x100, msgf, 16);
      eeprom_write_page(DEVADDR, 0x1f0, msgf, 16);
      Serial.println("After erasing pages starting at 0x000, 0x100, and 0x1f0:");
      eeprom_dump(DEVADDR, 0, 512);
    #endif

    //
    // Change #if 1 to #if 0 so that it won't write over the stuff next time
    //
    #if 1
    // Write some stuff to EEPROM 
    eeprom_write_page(DEVADDR, 0x000, msg1, sizeof(msg1));
    eeprom_write_page(DEVADDR, 0x100, msg2, sizeof(msg2));
    eeprom_write_page(DEVADDR, 0x1f0, msg3, 16);
    #endif

    Serial.println("Memory written");
    */
}

void loop()
{
    //
    // Read the first page in EEPROM memory, a byte at a time
    // EEPROM belleğindeki ilk sayfayı, her seferinde bir bayt oku
    //
    Serial.println("eeprom_read_byte, ggstarting at 0");
    for (int i = 0; i < 16; i++) {
        byte b = eeprom_read_byte(DEVADDR, i);
        Serial.print(b, HEX);
        Serial.print(' ');
    }

    for (int i = 0; i < 16; i++) {
//      eeprom_write_byte(byte deviceaddress, int eeaddress, byte data)
 //       eeprom_write_byte(DEVADDR, 0x000, 0xAC);
//        Serial.print(b, HEX);
        Serial.print(' ');
    }


    
    Serial.println();
    
    //
    // Read the first page using the read_buffer function
    // read_buffer işlevini kullanarak ilk sayfayı okuyun
    //
    Serial.println("eeprom_read_buffer, yystarting at 0");
    byte buffer[16];
    eeprom_read_buffer(DEVADDR, 0, buffer, sizeof(buffer));
    
    //
    //First print the hex bytes on this row
    // İlk önce bu satırdaki onaltılık baytı yazdır
    //
    for (int i = 0; i < sizeof(buffer); i++) {
        char outbuf[6];
        sprintf(outbuf, "%02X ",buffer[i]);
        Serial.print(outbuf);
    }
    Serial.println();

    //
    // Now print the char if printable ASCII
    // otherwise print '.'
    // Şimdi yazdırılabilir ASCII ise char yazdır   
    // aksi takdirde '.'
    //
    for (int i = 0; i < sizeof(buffer); i++) {
        if (isprint(buffer[i])) {
            Serial.print(buffer[i]);
        }
        else {
            Serial.print('.');
        }
    }
    Serial.println();
    
    // Now dump 512 bytes
    // Şimdi 512 bayt dökümü
    Serial.println("eeprom_dump(DEVADDR, 0, 256)");
    eeprom_dump(DEVADDR, 0, 4096);
   // eeprom_dump(DEVADDR, 0, 2048);
   // eeprom_dump(DEVADDR, 0, 256);
    Serial.println();
   // delay(5000);
   // eeprom_dump(DEVADDR, 0, 256);
   // Serial.println();

    delay(40000);
}
/*
void eeprom_write_byte(byte deviceaddress, int eeaddress, byte data)
{
    // Three lsb of Device address byte are bits 8-10 of eeaddress
    byte devaddr = deviceaddress | ((eeaddress >> 8) & 0x07);
    byte addr    = eeaddress;
    Wire.beginTransmission(devaddr);
    Wire.write(int(addr));
    Wire.write(int(data));
    Wire.endTransmission();
    delay(10);
}
*/
  // Pages are blocks of 16 bytes, starting at 0x000.
  // That is, pages start at 0x000, 0x010, 0x020, ...
  // For a device "page write", the last byte must be
  // on the same page as the first byte.
  //
  // No checking is done in this routine.
  //
  // TODO: Do some checking, or, better yet (maybe)
  // make length an int and do repeated device
  // page writes if necessary. (Then maybe rename to
  // eeprom_write_pages or some such thing.)
  //
  // Sayfalar, 0x000 ile başlayan 16 baytlık bloklardır.   
  // Sayfalar 0x000, 0x010, 0x020 
  // Bir "sayfa yazma" cihazı için, son bayt 
  // ilk bayt ile aynı sayfada.   // 
  // Bu rutinde kontrol yapılmamıştır.   //
  // TODO: Bazı kontroller yapın veya daha iyisi (belki)  
  // uzunluğu bir int yapın ve tekrarlanan bir cihaz yapın  
  // gerektiğinde sayfa yazar. (Sonra belki yeniden adlandırmak 
  // eeprom_write_pages veya benzeri bir şey.)   //

/*
void eeprom_write_page(byte deviceaddress, unsigned eeaddr,
                       const byte * data, byte length)
{
    // Three lsb of Device address byte are bits 8-10 of eeaddress
    // Aygıt adres baytının üç lsb'si, adresin 8-10 bitidir.
    byte devaddr = deviceaddress | ((eeaddr >> 8) & 0x07);
    byte addr    = eeaddr;
    Wire.beginTransmission(devaddr);
    Wire.write(int(addr));
    for (int i = 0; i < length; i++) {
        Wire.write(data[i]);
    }
    Wire.endTransmission();
    delay(10);
}
*/
// TODO: Change to integer data type and return -1 if can't
// read.
//
// TODO: Tamsayı veri türüne geçin ve yapamazsanız -1 döndürün// oku.
int eeprom_read_byte(byte deviceaddress, unsigned eeaddr)
{
    byte rdata = -1;

    // Three lsb of Device address byte are bits 8-10 of eeaddress
    byte devaddr = deviceaddress | ((eeaddr >> 8) & 0x07);
    byte addr    = eeaddr;

    Wire.beginTransmission(devaddr);
    Wire.write(int(addr));
    Wire.endTransmission();
    Wire.requestFrom(int(devaddr), 1);
    if (Wire.available()) {
        rdata = Wire.read();
    }
    return rdata;
}

//
// Returns number of bytes read from device
//
// Due to buffer size in the Wire library, don't read more than 30 bytes
// at a time!  No checking is done in this function.
//
// TODO: Change length to int and make it so that it does repeated
// EEPROM reads for length greater than 30.
// Aygıttan okunan bayt sayısını döndürür//
// Wire kitaplığındaki arabellek boyutu nedeniyle, 30 bayttan fazla okuma
// zamanında! Bu fonksiyonda kontrol yapılmaz.//
// TODO: uzunluğu int olarak değiştir ve tekrar etmesini sağla
// EEPROM uzunluğu 30'dan büyük olanları okur.

int eeprom_read_buffer(byte deviceaddr, unsigned eeaddr,
                        byte * buffer, byte length)
{
    // Three lsb of Device address byte are bits 8-10 of eeaddress
    byte devaddr = deviceaddr | ((eeaddr >> 8) & 0x07);
    byte addr    = eeaddr;
    
    Wire.beginTransmission(devaddr);
    Wire.write(int(addr));
    Wire.endTransmission();

    Wire.requestFrom(devaddr, length);
    int i;
    for (i = 0; i < length && Wire.available(); i++) {
        buffer[i] = Wire.read();
    }
    return i;
}

//
// The display is like hexdump -C.  It will always
// begin and end on a 16-byte boundary.
// Ekran hexdump -C gibidir. Her zaman olacak
// 16 baytlık bir sınırda başlar ve biter.
//

void eeprom_dump(byte devaddr, unsigned addr, unsigned length)
{
    // Start with the beginning of 16-bit page that contains the first byte
    unsigned startaddr = addr & (~0x0f);

    // stopaddr is address of next page after the last byte
    unsigned stopaddr  = (addr + length + 0x0f) & (~0x0f);

    for (unsigned i = startaddr; i < stopaddr; i += 16) {
        byte buffer[16]; // Hold a page of EEPROM
        char outbuf[6];  //Room for three hex digits and ':' and ' ' and '\0'
        sprintf(outbuf, "%03x: ", i);
        Serial.print(outbuf);
        eeprom_read_buffer(devaddr, i, buffer, 16);
        for (int j = 0; j < 16; j++) {
            if (j == 8) {
                Serial.print(" ");
            }
            sprintf(outbuf, "%02x ", buffer[j]);
            Serial.print(outbuf);            
        }
        Serial.print(" |");
        for (int j = 0; j < 16; j++) {
            if (isprint(buffer[j])) {
                Serial.print(buffer[j]);
            }
            else {
                Serial.print('.');
            }
        }
        Serial.println("|");
    }
}

ziyaretci

64 bitlik çip adresi muhtemelen birkez programlanabilen bölümde. Bu ID' nin ilk 8 biti family code, sonraki 48 bit seri numarası, son 8 bit CRC kod(ilk 56 bitin).


Data memory, application register ve status register olarak haritalandırılmış içerisi.



Datasheette 5-6 sayfalarında yazıyor nasıl yazılacağı. Tabi elinizdeki kontrolcüde bu nasıl yapılır bilmiyorum, deneyimli değilim.


Sayfa bilgisini tutan yeri tespit edebildiniz mi?


ByTEK

Alıntı yapılan: ferit06 - 03 Mayıs 2019, 10:09:16Bizim kullandığımız yazıcılarda 24C04 kullanmışlar. Bunlarda datalar 4 ayrı blokta yazılmış ve aynı 4 blok epromun iki yarısında tekrarlanmış. Biz az kullanılmış bir yazıcıdan kopyaladığımızı kapastesini tamamlamış olanlara yazarak tekrar kullanabiliyoruz.

Sizn kullandığınız ds.readpage fonksiyonu için başlangıç adresi 0 dır bu adresi değiştirerek sonraki adreslerdeki bilgileri de okuyabilirsiniz( Bu sizin fonsiyonu görmediğim için bir tahmin). Bizim 24C04 için okuma yazama için kullanılan açık kodlu programda da benzer bir fonksiyon var ve ilk olarak 16 byte lık veri okunuyor.  Aşağıda bizim üzerinde değişiklikler yaparak kullandığımız açık programın orjinali var;

/* 
  *  Use the I2C bus with small EEPROMs
  *  24C01, 20C02, 24C04, 24C08, 24C16
  *  Sketch:    I2C_EEPROM_Small.pde
  *  
  *  Derived from sketch for 24C64 devices posted on
  *     http://www.arduino.cc/playground/Code/I2CEEPROM
  *  From  hkhijhe   Date: 01/10/2010
  * 
  *  This one by davekw7x
  *  March, 2011
  *
  * For a single device, connect as follows:
  * EEPROM 4 (GND) to GND
  * EEPROM 8 (Vcc) to Vcc (5 Volts)
  * EEPROM 5 (SDA) to Arduino Analog Pin 4
  * EEPROM 6 (SCL) to Arduino Analog Pin 5
  * EEPROM 7 (WP)  to GND
  * EEPROM 1 (A0)  to GND
  * EEPROM 2 (A1)  to GND
  * EEPROM 3 (A2)  to GND
  */

#include <Wire.h>


// The seven-bit device address for EEPROMs
// I'll define it here rather than hard-code it inside all of the
// functions.
// EEPROM'lar için yedi bitlik cihaz adresi
// Tüm bunları içinde kodlamak yerine burada tanımlayacağım.
// işlevler.
//
const byte DEVADDR = 0x51;

void setup()
{
    byte msg1[] = "Message 1.";   // data to write
    byte msg2[] = "Zaphod says yo";
    byte msg3[] = "Tttthat's all, folks!";
    byte msgf[16] = {
        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
        0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
    
   
    };
    
    
    Wire.begin();
    Serial.begin(9600);
/*
    //
    // Change #if 0 to #if 1 and it will erase the
    // EEPROM pages that we are going to write to:
    //
    #if 1
      eeprom_write_page(DEVADDR, 0x000, msgf, 16);
      eeprom_write_page(DEVADDR, 0x010, msgf, 16);
      eeprom_write_page(DEVADDR, 0x020, msgf, 16);
      eeprom_write_page(DEVADDR, 0x100, msgf, 16);
      eeprom_write_page(DEVADDR, 0x1f0, msgf, 16);
      Serial.println("After erasing pages starting at 0x000, 0x100, and 0x1f0:");
      eeprom_dump(DEVADDR, 0, 512);
    #endif

    //
    // Change #if 1 to #if 0 so that it won't write over the stuff next time
    //
    #if 1
    // Write some stuff to EEPROM 
    eeprom_write_page(DEVADDR, 0x000, msg1, sizeof(msg1));
    eeprom_write_page(DEVADDR, 0x100, msg2, sizeof(msg2));
    eeprom_write_page(DEVADDR, 0x1f0, msg3, 16);
    #endif

    Serial.println("Memory written");
    */
}

void loop()
{
    //
    // Read the first page in EEPROM memory, a byte at a time
    // EEPROM belleğindeki ilk sayfayı, her seferinde bir bayt oku
    //
    Serial.println("eeprom_read_byte, ggstarting at 0");
    for (int i = 0; i < 16; i++) {
        byte b = eeprom_read_byte(DEVADDR, i);
        Serial.print(b, HEX);
        Serial.print(' ');
    }

    for (int i = 0; i < 16; i++) {
//      eeprom_write_byte(byte deviceaddress, int eeaddress, byte data)
 //       eeprom_write_byte(DEVADDR, 0x000, 0xAC);
//        Serial.print(b, HEX);
        Serial.print(' ');
    }


    
    Serial.println();
    
    //
    // Read the first page using the read_buffer function
    // read_buffer işlevini kullanarak ilk sayfayı okuyun
    //
    Serial.println("eeprom_read_buffer, yystarting at 0");
    byte buffer[16];
    eeprom_read_buffer(DEVADDR, 0, buffer, sizeof(buffer));
    
    //
    //First print the hex bytes on this row
    // İlk önce bu satırdaki onaltılık baytı yazdır
    //
    for (int i = 0; i < sizeof(buffer); i++) {
        char outbuf[6];
        sprintf(outbuf, "%02X ",buffer[i]);
        Serial.print(outbuf);
    }
    Serial.println();

    //
    // Now print the char if printable ASCII
    // otherwise print '.'
    // Şimdi yazdırılabilir ASCII ise char yazdır   
    // aksi takdirde '.'
    //
    for (int i = 0; i < sizeof(buffer); i++) {
        if (isprint(buffer[i])) {
            Serial.print(buffer[i]);
        }
        else {
            Serial.print('.');
        }
    }
    Serial.println();
    
    // Now dump 512 bytes
    // Şimdi 512 bayt dökümü
    Serial.println("eeprom_dump(DEVADDR, 0, 256)");
    eeprom_dump(DEVADDR, 0, 4096);
   // eeprom_dump(DEVADDR, 0, 2048);
   // eeprom_dump(DEVADDR, 0, 256);
    Serial.println();
   // delay(5000);
   // eeprom_dump(DEVADDR, 0, 256);
   // Serial.println();

    delay(40000);
}
/*
void eeprom_write_byte(byte deviceaddress, int eeaddress, byte data)
{
    // Three lsb of Device address byte are bits 8-10 of eeaddress
    byte devaddr = deviceaddress | ((eeaddress >> 8) & 0x07);
    byte addr    = eeaddress;
    Wire.beginTransmission(devaddr);
    Wire.write(int(addr));
    Wire.write(int(data));
    Wire.endTransmission();
    delay(10);
}
*/
  // Pages are blocks of 16 bytes, starting at 0x000.
  // That is, pages start at 0x000, 0x010, 0x020, ...
  // For a device "page write", the last byte must be
  // on the same page as the first byte.
  //
  // No checking is done in this routine.
  //
  // TODO: Do some checking, or, better yet (maybe)
  // make length an int and do repeated device
  // page writes if necessary. (Then maybe rename to
  // eeprom_write_pages or some such thing.)
  //
  // Sayfalar, 0x000 ile başlayan 16 baytlık bloklardır.   
  // Sayfalar 0x000, 0x010, 0x020 
  // Bir "sayfa yazma" cihazı için, son bayt 
  // ilk bayt ile aynı sayfada.   // 
  // Bu rutinde kontrol yapılmamıştır.   //
  // TODO: Bazı kontroller yapın veya daha iyisi (belki)  
  // uzunluğu bir int yapın ve tekrarlanan bir cihaz yapın  
  // gerektiğinde sayfa yazar. (Sonra belki yeniden adlandırmak 
  // eeprom_write_pages veya benzeri bir şey.)   //

/*
void eeprom_write_page(byte deviceaddress, unsigned eeaddr,
                       const byte * data, byte length)
{
    // Three lsb of Device address byte are bits 8-10 of eeaddress
    // Aygıt adres baytının üç lsb'si, adresin 8-10 bitidir.
    byte devaddr = deviceaddress | ((eeaddr >> 8) & 0x07);
    byte addr    = eeaddr;
    Wire.beginTransmission(devaddr);
    Wire.write(int(addr));
    for (int i = 0; i < length; i++) {
        Wire.write(data[i]);
    }
    Wire.endTransmission();
    delay(10);
}
*/
// TODO: Change to integer data type and return -1 if can't
// read.
//
// TODO: Tamsayı veri türüne geçin ve yapamazsanız -1 döndürün// oku.
int eeprom_read_byte(byte deviceaddress, unsigned eeaddr)
{
    byte rdata = -1;

    // Three lsb of Device address byte are bits 8-10 of eeaddress
    byte devaddr = deviceaddress | ((eeaddr >> 8) & 0x07);
    byte addr    = eeaddr;

    Wire.beginTransmission(devaddr);
    Wire.write(int(addr));
    Wire.endTransmission();
    Wire.requestFrom(int(devaddr), 1);
    if (Wire.available()) {
        rdata = Wire.read();
    }
    return rdata;
}

//
// Returns number of bytes read from device
//
// Due to buffer size in the Wire library, don't read more than 30 bytes
// at a time!  No checking is done in this function.
//
// TODO: Change length to int and make it so that it does repeated
// EEPROM reads for length greater than 30.
// Aygıttan okunan bayt sayısını döndürür//
// Wire kitaplığındaki arabellek boyutu nedeniyle, 30 bayttan fazla okuma
// zamanında! Bu fonksiyonda kontrol yapılmaz.//
// TODO: uzunluğu int olarak değiştir ve tekrar etmesini sağla
// EEPROM uzunluğu 30'dan büyük olanları okur.

int eeprom_read_buffer(byte deviceaddr, unsigned eeaddr,
                        byte * buffer, byte length)
{
    // Three lsb of Device address byte are bits 8-10 of eeaddress
    byte devaddr = deviceaddr | ((eeaddr >> 8) & 0x07);
    byte addr    = eeaddr;
    
    Wire.beginTransmission(devaddr);
    Wire.write(int(addr));
    Wire.endTransmission();

    Wire.requestFrom(devaddr, length);
    int i;
    for (i = 0; i < length && Wire.available(); i++) {
        buffer[i] = Wire.read();
    }
    return i;
}

//
// The display is like hexdump -C.  It will always
// begin and end on a 16-byte boundary.
// Ekran hexdump -C gibidir. Her zaman olacak
// 16 baytlık bir sınırda başlar ve biter.
//

void eeprom_dump(byte devaddr, unsigned addr, unsigned length)
{
    // Start with the beginning of 16-bit page that contains the first byte
    unsigned startaddr = addr & (~0x0f);

    // stopaddr is address of next page after the last byte
    unsigned stopaddr  = (addr + length + 0x0f) & (~0x0f);

    for (unsigned i = startaddr; i < stopaddr; i += 16) {
        byte buffer[16]; // Hold a page of EEPROM
        char outbuf[6];  //Room for three hex digits and ':' and ' ' and '\0'
        sprintf(outbuf, "%03x: ", i);
        Serial.print(outbuf);
        eeprom_read_buffer(devaddr, i, buffer, 16);
        for (int j = 0; j < 16; j++) {
            if (j == 8) {
                Serial.print(" ");
            }
            sprintf(outbuf, "%02x ", buffer[j]);
            Serial.print(outbuf);            
        }
        Serial.print(" |");
        for (int j = 0; j < 16; j++) {
            if (isprint(buffer[j])) {
                Serial.print(buffer[j]);
            }
            else {
                Serial.print('.');
            }
        }
        Serial.println("|");
    }
}

Hocam kullandığım Lib aşağıdaki gibi.

https://www.arduinolibraries.info/libraries/ds2431

Data Okurken sorun olmasa da yazarken hata veriyor maalesef.

ByTEK

OKI nin farklı bir modelinde 2 kontaklı farklı bir chip kullanılmış. Benim okuduğumda 2 kontaklı ve One wire ile okuyabiliyorum. Fakat diğer modeldeki chip okunmuyor. "one wire" mantığı ile çalışan başka bir protokol var mı ?

Burak B

"... a healthy dose of paranoia leads to better systems." Jack Ganssle

ilyas KAYA

Bir tane sıfır çip 'i okuyun sonra bitmiş çip e aynı veriyi yazın :) tabi yazabiliyorsanız.

ByTEK

Alıntı yapılan: Burak B - 10 Mayıs 2019, 23:24:48https://www.microchip.com/design-centers/memory/serial-eeprom/single-wire-and-uni-o-serial-eeprom

Teşekkürler. Datasheetleri inceleceğim.


Alıntı yapılan: cezeri - 11 Mayıs 2019, 01:20:19Bir tane sıfır çip 'i okuyun sonra bitmiş çip e aynı veriyi yazın :) tabi yazabiliyorsanız.

okumada sıkıntı yok. Ama Yazmada Sorun oluyordu. kenara kaldırdım boş zamanda tekrar uğraşacağım.