บทที่ 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> ตามรูปด้านล่าง

-
ในการณีที่เป็น EEROM เบอร์ 24LC64 ให้ทำตามขั้นตอนด่านล่าง
11.2. ในการณีที่เป็น EEROM เบอร์ 24LC64 ให้ทำตามขั้นตอนด่านล่าง
-
เปิดโปรแกรม Arduino IDE แล้วทำการเขียนโค้ดตามตามตัวอย่างโค้ดด้านล่าง
หมายเหตุ: สามารถนำโค้ดนี้ไปรันบน ESP32(ESP-WROM-32) ได้เลย



-
เมื่อเขียนโปรแกรมตามตัวอย่างด้านบนเสร็จแล้วให้ทดลองคอไพล์และ 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 ที่มีค่าเท่ากับตัวแปร ⅰ
แบบฝึกหัดสำหรับทบทวนความเข้าใจ
-
ทดลองเปลี่ยนค่า Address ของไอซี External EEPROM โดยเข้าไปเปลี่ยนในโค้ดและบนตัวบอร์ด ซึ่งดูค่าได้จากตารางแสดงการเซ็ต Address ของไอซี External EEPROM ด้านบน
-
จากตัวอย่างโค้ดที่ผ่านมา ทำการทดลองเขียนข้อมูลจำนวน 30 ตำแหน่งลงบน Address 0-30 จากนั้นอ่านค่าที่ได้เขียนไป แล้วแสดงค่าทาง Serial Monitor




Leave a Reply