ZMCP23016.TXT - โปรแกรมตัวอย่างสำหรับชิพ MCP23016 16-BIT I/O Port (กันยายน 2550 โดย เกรียงศักดิ์ บุญเสริมสุวงศ์) ชิพ MCP23016 คือชิพขนาด 28 Pin (SMD) สำหรับขยายเป็น 16-BIT I/O Port โดยจะสื่อสารกับ MCU ด้วยขาสัญญานเพียง 2 เส้น แบบ I2C (SCL,SDA) ช่วยเพิ่ม I/O ให้กับ MCU ได้อย่างสะดวก สามารถ ต่อพ่วงกันได้หลายตัวด้วยสายสัญญาน 2 เส้นเท่าเดิม กำหนดให้เป็น In หรือ Out ได้อย่างอิสระ มีขา Interrupt สำหรับส่งสัญญานให้กับ MCU ที่สามารถตั้งให้ใช้กับ I/O ขาใดก็ได้ และที่สำคัญ ... ราคาถูก โปรแกรมตัวอย่างนี้จะต่อทดลองด้วยบอร์ด SLAB-51 พร้อมกับชิพ MCP23016 ที่ต่อลงโปรโตบอร์ดอีกที เนื้อหาของโปรแกรมจะกระทำเป็น 2 ส่วน คือกำหนดให้เป็น Output ก่อน และส่งค่าให้เป็น Low,High สลับบิทกัน ถ้าต่อขา I/O ทั้ง 16 BIT เข้ากับ LED ในแบบ Active Low ก็จะเห็นเป็นไฟสลับกันไปมา จำนวน 10 รอบ และต่อจากนั้นก็จะกำหนดให้เป็น Input และจะอ่านค่าจาก I/O มาแสดงบนจอ PC (คือผ่าน RS232 และใช้โปรแกรมสื่อสาร Sterm บน PC เพื่อดูผลการทำงาน) เป็นตัวอย่างแบบพอสังเขป และไม่มีประเด็นเรื่อง Interrupt การต่อชิพ MCP23016 กับ MCU จะใช้ขาสัญญานดังนี้ ขา SCL ต่อกับ MCU P1.5 ขา SDA ต่อกับ MCU P1.6 ขา A0,A1,A2 จะต่อลง GND ทั้งหมด ขา CLK ต่อ R3.3K กับไฟ +5V และต่อ C 30PF ลง GND (สำหรับกำเนิดสัญญาน Clock ให้กับตัวชิพ) Function ต่าง ๆ ในช่วงต้นของโปรแกรม จะเป็นพื้นฐานทั่วไปสำหรับการสื่อสารแบบ I2C (ไอ สแควร์ ซี) กับเรื่องการหน่วงเวลา ส่วน function ชื่อ ip23016wrw (unsigned char addr,com,unsigned int dat) จะเป็นการส่งคำสั่งไปยังชิพโดย addr จะอ้างอิงตามขาสัญญาน A0,A1,A2 ที่กำหนดไว้ คือถ้าจะส่งคำสั่งไปยัง ชิพตัวใด (กรณีต่อพ่วงกันหลายตัว) ก็ต้องใส่ค่า addr ให้ตรงกับ Hardware ที่ต่ออยู่จริง ซึ่งจะมีค่าใดตั้งแต่ 0-7 ตัวแปร com คือหมายเลขของ Register ภายในของ MCP23016 (ดูรายละเอียดจาก Data Sheet) Register แต่ละตัวจะเป็นการกำหนดคุณสมบัติต่าง ๆ รวมทั้งสถานะของ I/O ด้วย สำหรับ function นี้ จะครอบคลุม Register 2 ค่าต่อเนื่องกัน เช่นถ้ากำหนดที่ 0x02 จะหมายถึงทั้ง 0x02 และ 0x03 ไปด้วย และสุดท้ายตัวแปร dat คือข้อมูลขนาด 16 Bit (Word) ที่จะส่งไปยัง Register นั้น ๆ ส่วน function ชื่อ unsigned int ip23016rdw (unsigned char addr,com) ก็จะเป็นขบวนการอ่านค่ากับมายัง MCU รวมไปถึงการอ่านค่าจาก Input Port ด้วย ... ทำความเข้าใจโดยละเอียดจากตัวโปรแกรมอีกทีครับ ... ชิพ MCP23016 จะทำงานคล้าย ๆ กับ MCP23008 เพียงแต่จะมีจำนวน Port เป็น 16 บิท ซึ่งมากกว่า MCP23008 ที่มีเพียง 8 บิท และจากการทดลอง MCP23016 จะทำงานช้าหน่อย จึงต้องหน่วงเวลาที่ ipdel มากขึ้นกว่าเดิมด้วย