Page 22 - The Journal of the Royal Society of Thailand
P. 22
วารสารราชบััณฑิิตยสภา
ปีที� ๔๙ ฉบับที� ๑ มกราคม-เมษายน ๒๕๖๗
12 การต่่อประสานแผงวงจรไมโครคอนโทรลเลอร์เพื่่�อการเรียนร้�กับหน่วยความจำอีอีพื่ร็อมแบบอนุกรมต่ามเกณฑ์์วิธีี I2C
ซอฟต่์แวร์สำหรับแผงวงจรไมโครคอนโทรลเลอร์ 8088
ซึ่อฟต่์แวร์สำหรับต่ัวควบคุมหร่อไมโครคอนโทรลเลอร์แม่ขี่ายเท่าที�ป็รากฏในเอกสารเกี�ยวกับระบบ
I2C นั�น ส่วนใหญ่จะเขีียนด�วยภาษัาซึ่ี (C) แต่่ในบทความนี� ไมโครคอนโทรลเลอร์แม่ขี่ายใช�หน่วยป็ระมวล
ผลกลางหร่อ ซึ่ีพื่ีย้ (central processing unit: CPU) ที�เป็็นวงจรรวม 8088 ขีองบริษััท Intel และรับซึ่อฟต่์แวร์
ในร้ป็ขีองแฟ้มขี�อม้ลฐานสอง (binary file) ที�แป็ลงมาจากโป็รแกรมภาษัาแอสเซึ่มบลี (Assembly) สำหรับ
วงจรรวม 8088 เท่านั�น ผ้�เขีียนจ่งต่�องเขีียนซึ่อฟต่์แวร์ขี่�นมาใหม่ในร้ป็ขีองภาษัาแอสเซึ่มบลีดังกล่าว โดยอาศััย
ซึ่อฟต่์แวร์ภาษัาซึ่ี (อย่างเช่นที�มีใน Robot Electronics, 2017) เป็็นแนวทาง
ในหัวขี�อนี�ผ้�เขีียนจะนำเสนอและแสดงรายละเอียดขีองกระบวนคำสั�ง (procedure) ภาษัาแอสเซึ่มบลี
ที�เป็็นส่วนสำคัญขีองซึ่อฟต่์แวร์สำหรับแผงวงจรไมโครคอนโทรลเลอร์ที�ใช� กระบวนคำสั�งดังกล่าวได�แก่ i2cstr
(สำหรับ “ลำดับเริ�ม”), i2cstp (สำหรับ “ลำดับหยุด”), i2c_wr (สำหรับการเขีียนขี�อม้ล ๑ ไบต่์ลงในอีอีพื่ร็อม
แบบอนุกรม), i2c_rd (สำหรับการอ่านขี�อม้ล ๑ ไบต่์จากอีอีพื่ร็อมแบบอนุกรม), prewr (สำหรับการเต่รียมความ
พื่ร�อมก่อนเขีียนขี�อม้ล) และ prerd (สำหรับการเต่รียมความพื่ร�อมก่อนอ่านขี�อม้ล) ซึ่อฟต่์แวร์โดยรวมจะทำงาน
ร่วมกับช่องทางเขี�า-ออก PC (ppi_port2c) ขีองวงจรรวม 8255 (2) ต่ามภาพื่ที� ๒ เท่านั�น ทั�งนี�เพื่่�อป็ระหยัด
วงจรรวม 8255 (1) ไว�ใช�งานอย่างอ่�น
๑. กิระบวนคุำส่�ง i2cstr (ลำดับเริ�ม) : อ�างอิงวงจรในภาพื่ที� ๔ และภาพื่คล่�นสัญญาณในภาพื่ที� ๕
i2cstr proc ;(I2C start sequence)
push ax ;save ax on stack
mov al,01h ;al = 01h = 00000001b
out ppi_port2c,al ;use port PC of 8255 (2); SCL=PC1=0, SDA=PC0=1
jmp $+2 ;jump to next instruction: I/O delay
mov al,03h ;al = 03h = 00000011b
out ppi_port2c,al ;use port PC of 8255 (2); SCL=PC1=0->1, SDA=PC0=1
jmp $+2 ;I/O delay
call delay0 ;short delay during SCL=SDA=1
mov al,02h ;al = 02h = 00000010b
out ppi_port2c,al ;use PC of 8255 (2); SCL=PC1=1, SDA=PC0=1->0
jmp $+2 ;I/O delay
mov al,00h ;al = 00h = 00000000b
out ppi_port2c,al ;use port PC of 8255 (2); SCL=PC1=1->0, SDA=PC0=0
jmp $+2 ;I/O delay
pop ax ;retrieve ax from stack
ret ;return to calling procedure
i2cstr endp