[ บทความ : 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 มาให้ผม ใช้ประกอบการเขียนหนังสือ จนต้องออกมาในรูปของบทความแก้ขัดไปก่อน แล้วค่อยรวมเล่ม เป็นหนังสือคราวหน้าล่ะกันครับ ครั้งนี้เท่านี้ก่อนครับ ขอให้สนุกกับการเขียนโปรแกรมครับ


เขียนโดย : ศุภชัย บุศราทิจ
Author : Supachai Budsaratij
วันที่ทำการปรับปรุง : ๑๑ พ.ย. ๒๕๔๔