บทที่ 11: การเขียนโปรแกรมติดต่อกับไอซี EXTERNAL EEPROM

UTEN BOONLIAM Avatar
บทที่ 11 / 26

บทที่ 11: การเขียนโปรแกรมติดต่อกับไอซี EXTERNAL EEPROM

EEPROM (Electrical Erasable Programmable Read Only Memory) เป็นรอมที่ถูกพัฒนามาจาก EPROM แต่การใช้งานจะง่ายกว่าเนื่องจากเป็นการลงโปรแกรมและการเพิ่มโปรแกรมใหม่ด้วยกระแสไฟฟ้า ซึ่งการใช้งานจะง่ายกว่า ในปัจจุบันมีการใช้งาน EEPROM แทน EPROM อย่างแพร่หลายเพราะความสะดวกในการใช้งานพร้อมกันนั้นยังมีคุณสมบัติที่ไม่แตกต่างจาก EPROM เลยแม้แต่น้อย สิ่งที่ทำให้ EEROM โดดเด่นกว่า EPROM นั้นก็คือความสามารถในการลงโปรแกรมแก้ไขและลบโปรแกรมที่มีความเร็วและสะดวกกว่าแบบ EPROM แต่การลบข้อมูลของ EEPROM นั้นจะเป็นการลบข้อมูลทั้งหมดเราไม่สามารถเลือกลบโปรแกรมบางส่วนได้ โดยอายุการใช้งานของ EEPROM นั้นจะขึ้นอยู่กับข้อกำหนดของ EEPROM ตัวนั้นจะกำหนดให้สามารถลบและเขียนข้อมูลได้สูงสุดเท่าไร อาทิ 10 ครั้ง หรือ 100 ครั้ง ซึ่งความสามารถของ EEPROM อีกอย่างก็คือสามารถที่จะใช้ไฟฟ้าที่มีอยู่ในคอมพิวเตอร์ลบและลงโปรแกรมใหม่ได้ด้วย

ไมโครคอนโทรลเลอร์ Arduino จะมีจะมี EERPOM อยู่ภายในตัวอยู่แล้ว(Internal EEPROM) แต่ด้วยขีดจำกัดของเทคโนโลยีและสถาปัตยกรรมการออกแบบ ทำให้หน่วยความจำภายใน Arduino มีขนาดเพียง 1Kbyte ซึ่งบางครั้งอาจไม่เพียงพอกับการใช้งาน และปัญหาอีกอย่างคือ Internal EEPROM มีอายุการเขียนข้อมูลจำกัดอาจเกิดความเสียหายกับระบบได้ ดังนั้นวิธีเพิ่มหน่วยความจำแยกออกมาจึงเป็นอีกวิธีที่ช่วยแก้ปัญหาได้

บนบอร์ด Arduino Learning Kit ได้มีไอซี External EEPROM เบอร์ด 24LC64 ขนาดหน่วยความจำ 64Kbyte และบางบอร์ดใช้เบอร์ 24C04 หน่วยความจำ 4Kbyte เชื่อมต่อไว้บนบัส i2c ซึ่ง address จะถูกเซ็ตด้วยขา A0, A1 และ A3 ซึ่งใช้จั้มเปอร์ w1, w2, w3 เป็นตัวเซ็ต

A2 A1 A0 Address
0 0 0 50
0 0 1 51
0 1 0 52
0 1 1 53
1 0 0 54
1 0 1 54
1 1 0 56
1 1 1 57

ตารางที่ 11. 1 ตารางแสดงการเซ็ต Address ของไอซี External EEPROM

เขียนโปรแกรม Arduino Uno ติดต่อกับไอซี EXTERNAL EERPOM

11.1. ในการณีที่เป็น EEROM เบอร์ 24c04(บนตัวไอซีอาจเขียนเป็น ATMLU402) ให้ทำตามขั้นตอนด่านล่าง

11.1.1. ทำการดาวน์โหลดไลบรารี่ EEPROM24C04_16 ตามลิงค์ด้านล่าง

https://github.com/yazug/EEPROM24C04_16

11.1.2. เมื่อเข้ามาหน้า github แล้วให้ทำการคลิ๊กปุ่ม clone or download ตามรูปด้านล่าง แล้วคลิ๊กปุ่ม Download ZIP

11.1.3. ทำการแตกไฟล์ซิป จากนั้นนำโฟลเดอร์ที่แตกมาแล้วไปวางไว้ในห้อง library ตามรูปด้านล่าง

หรือจะทำอีกวิธีหนึ่งคือทำการ Add.Zip Library โดยไปที่ Sketch -> Include Libarry -> Add .Zip Library …

11.1.4. ทำการเปิดโปรแกรมตัวอย่างโดยไปที่ File -> Examples -> EEPROM24C04_16-master -> WriteReadByte

11.1.5. ทำการอัปโหลดโปรแกรมให้กับตัว Arduino แล้วดูผลการรันโปรแกรมที่หน้าต่าง Serial monitor

อธิบายการทำงานของโค้ดด้านบน

จากโค้ดตัวอย่างเป็นการทดลองเขียนข้อมูลให้กับ External EEPROM เมื่อเขียนเสร็จก็ให้ทำการอ่านค่าที่ได้เขียนไปเพื่อตรวจสอบว่าค่าที่เขียนไปถูกต้องหรือไม่ โดยจะทำการเขียนและอ่านภายในฟังก์ชั่น setup (ทำครั้งเดียวหลังจากทำการอัปโหลดโปรแกรม หรือหลังจากกดปุ่มรีเซต)

ฟังก์ชัน eepromwriteByte สำหรับเขียนข้อมูลให้กับ EEPROM โดยจะต้องระบุตำแหน่ง address และข้อมูลที่ต้องการจะเขียน และเรียกใช้ฟังก์ชัน eeprom.readByte สำหรับอ่านค่าจาก EEPROM โดยจะต้องระบุตำแหน่ง address ที่ต้องการอ่านข้อมูล

11.1.6. ทำการเปิดโปรแกรมอีกหนึ่งตัวอย่างอีกโดยไปที่ File -> Examples -> EEPROM24C04_16-master -> WriteReadBytes

11.1.7. ทำการอัปโหลดโปรแกรมให้กับตัว Arduino แล้วดูผลการรันโปรแกรมที่หน้าต่าง Serial monitor

อธิบายการทำงานของโค้ดด้านบน

จากโค้ดตัวอย่างด้านบนเป็นการทดลองเขียนข้อมูลให้กับ External EEPROM โดยจะเขียนชุดข้อมูลหรือข้อมูลจำนวนหลายไบต์ลงใน EEPROM พร้อมกันในคำสั่งเดียว

  • บรรทัดที่ 69-70 เป็นการประกาศตัวแปรชนิดอาเรย์ โดยกำหนดความจำในอาเรย์ไว้ 94 ตัว

  • บรรทัดที่ 74-77 เป็นการนำข้อมูลไปเก็บไว้ในตัวแปรอาเรย์ที่ได้ประกาศไว้ โดยจะเก็บเป็นค่า ascii (ดูจากตาราง ascii ด้านล่าง) โดยจะเก็บค่าตั้งแต่ 33 – 127 ไว้ในตัวแปร inputBytes

  • บรรทัดที่ 81 จะเป็นการเขียนค่าไปที่ EEPROM โดยใช้คำสั่ง eeprom.writeBytes โดยรูปแบบคำสั่งคือ eeprom.writeBytes(start address, stop address, data array);

    • Start address คือตำแหน่งแอดเดรสเริ่มต้นของ EERPOM ที่จะเริ่มเขียน

    • Stop address คือตำแหน่งแอดเดรสที่จะหยุดเขียน EEPROM

    • Data array คือตัวแปรอาเรย์ที่ต้องการนำค่าไปเก็บไว้ใน EEPROM

Data Array EEPROM [Address]
inputBytes[0] = 33 EEPROM[0] = 33
inputBytes[1] = 35 EEPROM[1] = 33
inputBytes[2] = 36 EEPROM[2] = 33
… …
inputBytes[93] = EEPROM[93] = 126

ตารางที่ 11. 2 ค่าที่ถูกเก็บไว้ใน EXTERNAL EEPROM

  • บรรทัดที่ 85 จะเป็นการอ่านค่าจาก EEPROM โดยใช้คำสั่ง eeprom.readBytes โดยรูปแบบคำสั่งคือ eeprom.readBytes(start address, stop address, data array);

    • Start address คือตำแหน่งแอดเดรสเริ่มต้นของ EERPOM ที่จะเริ่มอ่าน

    • Stop address คือตำแหน่งแอดเดรสที่จะหยุดอ่าน EEPROM

    • Data array คือตัวแปรอาเรย์ที่ต้องการเก็บค่าที่ได้จากการอ่าน EEPROM

  • บรรทัดที่ 89-93 เป็นการรันลูป for เพื่ออ่านค่าที่อยู่ในตัวแปรอาเรย์ทั้ง 93 ค่า โดยจะอ่านออกมาในรูปแบบ character หรือตัวอักษร ซึ่งดูได้จากผลการรันโปรแกรมด้านบน

ตารางที่ 11. 3 ASCII CODE TABLE

Note: ถ้าผู้อ่านต้องการนำตัว ESP-32 โมดูลมาใช้ในการทดลองนี้ จำเป็นที่จะต้องแก้ไขไลบรารี่เล็กน้อย โดยแก้ไขที่ไฟล์ Eeprom24C04_16.cpp ซึ่งจะอยู่ในพาทโฟลเดอร์ของ Arduino IDE Library

โดยทำการเพิ่มคำสั่ง #define BUFFER_LENGTH 32 ใต้คำสั่ง #include <Wire.h> ตามรูปด้านล่าง

  1. ในการณีที่เป็น EEROM เบอร์ 24LC64 ให้ทำตามขั้นตอนด่านล่าง

11.2. ในการณีที่เป็น EEROM เบอร์ 24LC64 ให้ทำตามขั้นตอนด่านล่าง

  1. เปิดโปรแกรม Arduino IDE แล้วทำการเขียนโค้ดตามตามตัวอย่างโค้ดด้านล่าง

หมายเหตุ: สามารถนำโค้ดนี้ไปรันบน ESP32(ESP-WROM-32) ได้เลย

  1. เมื่อเขียนโปรแกรมตามตัวอย่างด้านบนเสร็จแล้วให้ทดลองคอไพล์และ upload โปรแกรมให้กับ Arduino Uno จากนั้นดูผลการรันโปรแกรมผ่านทาง Serial Monitor

อธิบายการทำงานของโค้ดด้านบน

จากโค้ดตัวอย่างด้านบนเป็นการทดลองเขียนข้อมูลให้กับ External EEPROM เมื่อเขียนเสร็จก็ให้ทำการอ่านค่าที่ได้เขียนไปเพื่อตรวจสอบว่า ค่าที่เขียนไปถูกต้องหรือไม่ โดยภายในฟังก์ชัน loop จะเรียกใช้

ฟังก์ชัน writeAddress สำหรับเขียนข้อมูลให้กับ EEPROM โดยจะต้องระบุตำแหน่ง address และข้อมูลที่ต้องการจะเขียน และเรียกใช้ฟังก์ชัน readAddress สำหรับอ่านค่าจาก EEPROM โดยจะต้องระบุตำแหน่ง address ที่ต้องการอ่านข้อมูล

  • บรรทัดที่ 4 เป็นค่า address i2c bus ของตัวไอซี External EEPROM

  • บรรทัดที่ 6-7 เป็นการประกาศ Pre-define Function เพื่อให้ฟังก์ชัน loop มองเห็นฟังก์ชันดังกล่าวในการเรียกไปใช้งาน

  • บรรทัดที่ 36-44 เป็นฟังก์ชัน writeAddress สำหรับเขียนข้อมูลให้กับ EEPROM โดยจะต้องระบุตำแหน่ง address และข้อมูลที่ต้องการจะเขียน

  • บรรทัดที่ 44-57 เป็นฟังก์ชัน readAddress สำหรับอ่านค่าจาก EEPROM โดยจะต้องระบุตำแหน่ง address ที่ต้องการอ่านข้อมูล

  • ในฟังก์ชัน loop เริ่มต้นจะทำการเขียนข้อมูลให้กับ EEPROM โดยจะเขียนข้อมูลจำนวน 10 ค่าโดยจะทำใน For-loop โดยนำค่าจากตัวแปร ⅰ x11 จากนั้นทำการเขียนไปยังตำแหน่ง address ที่มีค่าเท่ากับตัวแปร ⅰ

  • จากนั้นทำการอ่านข้อมูลที่เขียนมา โดยจะทำใน for-loop และอ่านข้อมูลจากตำแหน่ง address ที่มีค่าเท่ากับตัวแปร ⅰ

แบบฝึกหัดสำหรับทบทวนความเข้าใจ

  1. ทดลองเปลี่ยนค่า Address ของไอซี External EEPROM โดยเข้าไปเปลี่ยนในโค้ดและบนตัวบอร์ด ซึ่งดูค่าได้จากตารางแสดงการเซ็ต Address ของไอซี External EEPROM ด้านบน

 

 

 

  1. จากตัวอย่างโค้ดที่ผ่านมา ทำการทดลองเขียนข้อมูลจำนวน 30 ตำแหน่งลงบน Address 0-30 จากนั้นอ่านค่าที่ได้เขียนไป แล้วแสดงค่าทาง Serial Monitor

 

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *