[ บทความ : EXP4 I/O LAB 1 : #1 LED ] |
กลับมาอีกครั้ง กับบทความภาษาซี กับ MCS51 แต่คราวนี้ เราจะเจาะจงกันไปเลยว่า เราจะใช้ NCS51 ในชุด EXP4 I/O กับ EXP4 MPU (เป็น Single Chip) หรือ CP-SB31 V2 แล้วบทความชุดนี้ก็จะเหมือนกับเป็นภาคเสริมของหนังสือ ที่ผมเขียนเอาไว้ (ในตอนแรกว่า จะออกมาอีกเล่ม แต่ว่า ผ่านมากว่า 1 ปี แล้วก็ เขียนไม่เสร็จสักที แกรงว่า สิ่งที่ทำเอาไว้จะล้าสมัย เลยนำมาเสนอในรูปบทความเสียดีกว่า)
มาวาง โครงเรื่องกันก่อนครับ เราจะเล่มกันตามบทของหนังสือ LAB ที่ทาง ETT ได้ทำเอาไว้ นั่นคือ เริ่มจากภาค LED (7Segment) ไปเรื่อยๆ ส่วนรายละเอียดของวงจรนั้น ผมขอไม่อธิบายเพิ่มเติมเนื่องจาก ในหนังสือของ ETT (ที่มากับ ET-EXP4 I/O) นั้น มีรายละเอียด มากเพียงพออยู่แล้ว ส่วนตัวแปรภาษานั้น ผมก็ใช้เป็น Micro-C/51 (ซึ่งทำงานบน DOS น่ะล่ะครับ) เหตุที่เลือกตัวนี้ ก็เป็นเรื่องราคาล่ะครับ ส่วนใครที่ใช้ Keil-C/51, RKIT51 ก็ต้องปรับโปรแกรม เอาเองล่ะครับ
เริ่มเปิดฉากด้วย การขับ LED ตัวอย่างโปรแกรม ก็จะเหมือนๆ เดิม (ถ้าย้อนกลับ ไปอ่าน จะเห็นว่า ผม reuse ส่วนที่เป็น LED มาหลายครั้งแล้ว ... ครั้งนี้รอบสุดท้ายล่ะกันครับ) ตัวอย่างโปรแกรม จะเป็น 2 รุ่น คือ สำหรับเป็น Single Chip และรุ่นที่เป็น CP-Sb31 V2 ซึ่ง ใน CP-SB31 V2 (หรือ CP-S8252 V2) นั้น ผมจะอาศัยส่วน PIO (8255) ในการติดต่อกับ อุปกรณ์ภายนอก
ข้อควรระวัง ในการใช้ Micro-C/51 กับ ตัวแปรแบบ unsigned char เวลาที่ เราใช้ค่าถึง 0xFF มักมีปัญหา (โดยเฉพาะเกี่ยวกับวนรอบ บ่อยมากที่มันวนหลุดไปเลย) ดังนั้น ถ้าผู้อ่านต้องการใช้การวนรอบที่ถึง 0xFF ก็เปลี่ยน มาใช้ int แทนก็แล้วครับ
ตัวอย่างแรก เป็นการส่ง pattern ออกทาง I/O port เพื่อไปขับ หลอด LED ที่บอร์ด EXP4 I/O ดังนั้น ผู้อ่านจะต้องต่อ connector ของ ET-EXP4 MPU จาก Port 1 ไปที่ช่อง ROW ในบอร์ด ET-EXP 4 I/O ... ส่วนพวก Single Board, Controller Board อย่าง CP-SB31 V2 เราต้องต่อจาก ETT-8255 I/O Slot จากบอร์ด เข้าที่ฝั่งแยกพอร์ต บนบอร์ด ET-EXP4 I/O แล้ว ทำการจ่ายไฟ 5VDC เข้ากับบอร์ดด้วยนะครับ (ETT ไม่ได้ ใช้ +5VDC จาก controller board) .... อ้อ แล้วเลือก Switch ไปที่ Latch ด้วยนะครับ
Pattern ที่เราส่งให้ ก็จะเป็นดังนี้ครับ
รอบที่ ค่าตัวเลข ข้อมูล 1 0x00 00000000 2 0x81 *000000* 3 0x42 0*0000*0 4 0x24 00*00*00 5 0x18 000**000 6 0x24 00*00*00 7 0x42 0*0000*0 8 0x81 *000000*เมื่อทำครบแล้วก็จะทำการวนรอบไปอีกเรื่อยๆ ไม่รู้จบ โค้ดโปรแกรมตัวแรก สำหรับ Single Chip ก็จะเป็นดังนี้ครับ
/* * Filename : mled01.c * Compiler : Micro-C/51 V2.4 or V3.21 * Hardware : EXP4 I/O LAB1 and EXP4 MCU * * Command : cc51 mled01 -piomf m=t */ #include <8051reg.h> #define uchar unsigned char my_delay(mxloops) int mxloops; { int i,o; for (o=0; oสำหรับ CP-SB31 V2 นั้น เนื่องจากเราติดต่อกับ 8255 ดังนั้น ผมเลยเขียนส่วนของโปรแกรม เป็นไลบรารี เอาไว้ใช้ ซึ่งมีรายละเอียดดังนี้
/* * Filename : sb31v2.h * Compiler : Micro-C/51 V2.4 or V3.21 * Hardware : CP-SB31 V2 */ #ifndef __SB31_V2 #define __SB31_V2 #define uchar unsigned char #define PIO_A 0xE0E0 #define PIO_B 0xE0E1 #define PIO_C 0xE0E2 #define PIO_X 0xE0E3 #define WR_CMDLCD 0xE0C0 #define RD_CMDLCD 0xE0C1 #define WR_DATLCD 0xE0C2 #define RD_DATLCD 0xE0C3 pio_delay(mxloops) int mxloops; { int i,o; for (o=0; o#include "sb31v2.h" uchar patt[] = { 0x00, 0x81, 0x42, 0x24, 0x18, 0x24, 0x42, 0x81 }; main() { uchar i; pio_init(); while(1) { for (i=0; i<8; i++) { pio_wr(PIO_A, patt[i]); my_delay(500); } } } ในโปรแกรม ที่ 2 นี้ ผมทำการปรับ โปรแกรมเสียใหม่ คือ ตัวแปร patt นั้น ผมใช้เป็นแบบ global variable และ กำหนดค่าให้มันล่วงหน้า ถ้าเราทำแบบนี้นะครับ Micro-C/51 จะมองว่า มัน เป็น program memory (เวลาที่เราอัดลง EPROM, Flash Memory) แต่ถ้าทำงานบน RAM แบบ Overlapped มันจะสามารถ อ่านและเขียนทับได้ (ถ้ากับ ROM มันจะเขียนทับไม่ได้) ... ที่วุ่นวายก็เพราะว่า MCS-51 มีการออกแบบวิธีการเข้าถึงหน่วยความจำในหลายๆ ลักษณะนั่นเอง
ตัวอย่างครั้งต่อไป จะเป็นเรื่อง MCS51 กับ ET-EXP4 I/O เหมือนเดิมครับ แต่จะก้าวที่ ส่วนของ 7-Segment กันแล้วล่ะครับ (น่าจะนึกภาพออกนะครับ ว่า code โปรแกรม ก็จะคล้ายๆ กับบทความที่ผมได้เขียนไปแล้วเมื่อครั้งก่อน แต่เราจะนำมาใช้กับ ET-EXP 4 I/O ครับ)
ก่อนอื่น ต้องขอขอบคุณ กอบกิจ เติมผาติ มา ณ ที่นี้ด้วยครับ ที่ได้ส่งบอร์ด ET-EXP4 มาให้ผม ใช้ประกอบการเขียนหนังสือ จนต้องออกมาในรูปของบทความแก้ขัดไปก่อน แล้วค่อยรวมเล่ม เป็นหนังสือคราวหน้าล่ะกันครับ ครั้งนี้เท่านี้ก่อนครับ ขอให้สนุกกับการเขียนโปรแกรมครับ