Z82E54AD.TXT - โปรแกรมตัวอย่างการใช้ A/D ของชิพ 82E54AE2 (Megawin 28 Pin) (กันยายน 2550 โดย เกรียงศักดิ์ บุญเสริมสุวงศ์) ชิพ 82E54AE2 ของ Megawin เป็น MCU ที่น่าสนใจมาก นอกจากมีความเร็วในการทำงานสูงแล้ว (ประมาณ 12 เท่า) ยังมี Analog to Digital ขนาด 10 Bit ให้ใช้งานถึง 8 Ch. (P1 ของตัว MCU) ทำให้ประยุกต์กับงานต่าง ๆ ได้สะดวกขึ้น โปรแกรมตัวอย่างนี้จะแสดงการใช้งาน A/D อย่างง่าย ๆ เพื่อเป็นแนวทางไปต่อยอดอีกที เริ่มจากข้อกำหนดดังนี้ # ใช้ขา P1.0 (18) ซึ่งเป็น AIN0 (Analog In - Channel 0) ต่อกับขากลางของ VR100K และให้ขาอีก 2 ขาต่อกับไฟ +5V และ GND # ให้แสดงผลออกทาง RS232 โดยต่อกับ PC และใช้โปรแกรมสื่อสาร (Sterm ของศิลา) เพื่อดู ผลที่เกิดจากการทำงานของโปรแกรม การใช้งาน A/D ของ 82E54AE2 นั้น จำเป็นจะต้องกำหนดคุณสมบัติของ Port ใหม่ด้วย MCU เบอร์นี้ สามารถกำหนดคุณสมบัติของ Port ได้เป็น 4 แบบ ดังตารางนี้ PxM0n PxM1n Port Mode 0 0 Quasi-bidirectional (โหมดมาตรฐานเหมือน MCS-51 ทั่วไป และเป็น Default) 0 1 Push-Pull Output 1 0 Input Only (High-impedance) 1 1 Open-Drain Output การกำหนดคุณสมบัติของ Port จะทำได้ด้วยกำหนดค่าใน SFR 8 ตัว คือ P0M0,P0M1 สำหรับ Port-0 ... P1M0,P1M1 สำหรับ Port-1 ... P2M0,P2M1 สำหรับ Port-2 ... P3M0,P3M1 สำหรับ Port-3 รายละเอียด ให้ดูจาก Data Sheet อีกที การใช้งาน A/D นั้น จะต้องกำหนดคุณสมบัติของ Port ให้เป็น Input Only หรือ Open-Drain เท่านั้น ในตัวอย่างนี้จะกำหนด P1.0 เป็น Input Only ดังนี้ P1M0 |= 0x01; // set P1.0 = input only (high-impedance) P1M1 |= 0x00; โดยกำหนดเฉพาะ Bit-0 เท่านั้น ซึ่งหมายถึง P1.0 นั่นเอง (ที่จริง P1M1 |= 0x00 ไม่ต้องใส่ไว้ก็ได้ แต่ที่ใส่ไว้ ก็เพื่อให้รู้ว่ามี SFR 2 ตัวที่เกี่ยวข้องสำหรับการกำหนดคุณสมบัติ Port 1 นั่นเอง) จากนั้นเราก็สามารถใช้งาน A/D ได้ โดยจะมี SFR เกี่ยวข้องดังนี้ ADCTL ... 0xC5 (ADC Control) สำหรับควบคุมการทำงาน แยกเป็นบิทคือ B7 ... 0=Off 1=On (ใช้งาน ADC) B6,B5 ... กำหนดความเร็วในการแปลง 4 ระดับ 270,540,810,1080 clock cycles B4 ... Interrupt flag คือถ้าเป็น 1 หมายถึงแปลงเสร็จเรียบร้อย และผู้ใช้ต้อง Clear ให้เป็น 0 ด้วยโปรแกรม B3 ... Start control เริ่มการทำงานของ A/D B2,B1,B0 ... กำหนด Channel ที่ต้องการใช้งาน ADCV ... 0xc6 (ADC value) สำหรับอ่านค่า A/D B9-B2 (8 บิท) ADCVL ... 0xbe (ADC value) สำหรับอ่านค่า A/D B1-B0 (2 บิท) ในโปรแกรมตัวอย่าง หลังจากกำหนด P1.0 ให้เป็น Input Only แล้ว ก็จะเริ่มให้ A/D ทำงานทันที และใน function read_ad ก็จะตรวจสอบ interrupt flag ว่าแปลงค่าเสร็จหรือไม่ ถ้าเรียบร้อยแล้วก็จะอ่านค่าทั้ง 10 บิทไว้ จากนั้นก็ จะเริ่มให้ A/D ทำงานต่อเนื่องไป เพื่อจะวนกลับมาอ่านค่าได้ต่อไป ... ส่วนการแสดงผลนั้น นอกจากจะแสดงเป็นข้อมูล เลข Hex 0000-03FF แล้ว (2 ยกกำลัง 10 = 1024) ยังคำนวนให้แสดงผลเป็น 0-5 Volt ด้วย นั้นหมายความว่า ถ้าขณะทำงานเรานำ Meter ไปวัดไฟที่ขา P1.0 ค่าที่ได้ก็จะตรงกับค่าที่แสดงบนจอเครื่อง PC ด้วย (ภาคจ่ายไฟต้อง มีไฟ 5VDC แบบมาตรฐานด้วย) ... ขอให้สนุกกับ A/D บนชิพตัวเก่งนี้ได้เลยครับ