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
   17   18   19   20   21   22   23   24   25   26   27