24lc256 ข้อมูลหายหลังจากตัดไฟเลี้ยง

  • 5 Replies
  • 1774 Views
*

Offline Tikki

  • **
  • 23
    • View Profile
ผมต่อ Arduino pro mini เข้ากับ 24lc256
การเขียนข้อมูลลงไปแล้วอ่านกลับขึ้นมาเป็นไปด้วยดี แต่พอตัดไฟเลี้ยงวงจรออก หรือกด reset ที่ arduino
ข้อมูลที่เก็บค้างไว้ใน 24lc256 จะหายเกลี้ยงเลย ใครพอจะทราบบ้างครับว่าเป็นที่อะไร เกิดจากต่อวงจรผิดรึเปล่า


PS.ผมต่อวงจรตามในรูปเลยครับ เห็นมีบางวงจรต่อ c 0.1 uf พ่วงที่ขาV+ ไปลง gnd ไม่รู้ว่าต่อไว้ทำไม หรือว่าต้องต่อแบบนั้นถึงจะถูกครับ

*

Offline RoLRoR

  • *****
  • 334
    • View Profile
ต่อ C ค่า 0.1uF เพื่อทำหน้าที่ decoupling
ผมเข้าใจว่า เป็น noise fillter ครับ

สายไฟจากบอร์ด arduino ถึง 24LC256 ยาว
ต่อ C ค่า 10uF คร่อมขา Vcc-Vss
ของ 24LC256 ด้วยอีกตัว ช่วยไฟนิ่งดี.

เพื่อคงสถานะลอจิกไว้.ที่ขา SCL และ SDA
ใส่ R อีก2ตัว ค่า 4.7k-10k ต่อ Pull-Up
ไปขา Vcc ของ 24LC256 ทั้งสองขาด้วย
เพราะตอนที่ Arduino เริ่มทำงาน
ขา Ax ที่ใช้ ยังไม่ได้เซ็ตเป็นขา output

และถ้ายังเป็นอยู่...
ดูที่รูปการต่อวงจรจริง กับ โปรแกรมอีกทีครับ

*

Offline Tikki

  • **
  • 23
    • View Profile
ขอบคุณครับ
ผมลองต่อตามที่ว่ามาแล้ว พอตัดไฟเลี้ยงก็ยังหายครับ มันเป็นไปได้ไหมว่าจังหวะที่เราตัดไฟ หรือเริ่มทำงาน Arduino มันไปรีเซตตัว 24lc256 หน่วยความจำเลยหายไป

อันนี้เป็นโค้ดที่ผมใช้อ่านและเขียนครับ

Quote
void writeEEPROM(int deviceaddress, unsigned int eeaddress, char* data)
{
   // Uses Page Write for 24LC256
   // Allows for 64 byte page boundary
   // Splits string into max 16 byte writes
   unsigned char i = 0, counter = 0;
   unsigned int  address;
   unsigned int  page_space;
   unsigned int  page = 0;
   unsigned int  num_writes;
   unsigned int  data_len = 0;
   unsigned char first_write_size;
   unsigned char last_write_size;
   unsigned char write_size;

   // Calculate length of data
   do{ data_len++; } while (data[data_len]);

   // Calculate space available in first page
   page_space = int(((eeaddress / 64) + 1) * 64) - eeaddress;

   // Calculate first write size
   if (page_space>16){
      first_write_size = page_space - ((page_space / 16) * 16);
      if (first_write_size == 0) first_write_size = 16;
   }
   else
      first_write_size = page_space;

   // calculate size of last write 
   if (data_len>first_write_size)
      last_write_size = (data_len - first_write_size) % 16;

   // Calculate how many writes we need
   if (data_len>first_write_size)
      num_writes = ((data_len - first_write_size) / 16) + 2;
   else
      num_writes = 1;

   i = 0;
   address = eeaddress;
   for (page = 0; page<num_writes; page++)
   {
      if (page == 0) write_size = first_write_size;
      else if (page == (num_writes - 1)) write_size = last_write_size;
      else write_size = 16;

      Wire.beginTransmission(deviceaddress);
      Wire.write((int)((address) >> 8));   // MSB
      Wire.write((int)((address)& 0xFF)); // LSB
      counter = 0;
      do{
         Wire.write((byte)data);
         i++;
         counter++;
      } while ((data) && (counter<write_size));
      Wire.endTransmission();
      address += write_size;   // Increment address for next write

      delay(6);  // needs 5ms for page write
   }
}
void readEEPROM(int deviceaddress, unsigned int eeaddress, unsigned char* data, unsigned int num_chars)
{
   unsigned char i = 0;
   Wire.beginTransmission(deviceaddress);
   Wire.write((int)(eeaddress >> 8));   // MSB
   Wire.write((int)(eeaddress & 0xFF)); // LSB
   Wire.endTransmission();

   Wire.requestFrom(deviceaddress, num_chars);

   while (Wire.available()) data[i++] = Wire.read();

}


*

Offline RoLRoR

  • *****
  • 334
    • View Profile
ถ้า write แล้ว read กลับออกมาได้
คงเป็นโปรแกรมส่วนอื่นครับ

*

Offline Tikki

  • **
  • 23
    • View Profile
รบกวนถามว่า ปกติการต่อใช้งาน 24lc256 เราต่อขา WP ลง GND เอาไว้เลยหรือเราควรจะต่อขาเข้า arduino เอาไว้เพื่อทำการสั่ง High ในตอนเริ่มต้นทำงานของบอร์ดรึเปล่าครับ

*

Offline RoLRoR

  • *****
  • 334
    • View Profile
มีบิต R/W บนคำสั่ง command
ขา WP ผมว่าใช้เป็นการป้องกันทาง HW
ต่อลงกราวด์ได้ เพื่ออ่านเขียนทาง command
จะใช้ขาควบคุมก็น่าทดลองดู ใส่ R Pull-Up เหมือนเดิม

ลองเขียนโค้ดทดสอบโดยรวมที่ไม่ซับซ้อน
และ เขียน อ่าน แค่ byte เดียว ก่อนครับ