[ บทความ : ทดลองใช้บอร์ด ET-DIO ตอนที่ 1 ] - ขับหลอด LED 8 ตัว

เนื่องจากเรามีบทความค่อนข้างหลากหลาย และทาง ETT เองก็มีบอร์ดควบคุมงานทางด้านไมโครฯ ให้เลือกใช้หลายตัว ประกอบกับ ในบางระบบงานนั้นเราต้องการ ไมโครโปรเซสเซอร์ที่มีความเร็วในการทำงานมากๆ ผมคิดว่า คงไม่มีใคร เอาไมโครโปรเซสเซอร์ความเร็วน้อยๆ ไปทำการประมวลผลภสพแบบเรียลไทม์ (Real Time) แน่ ๆ จริงไหมครับ เพราะ ถ้าเราทำเช่นนั้น ผลลัพธ์คงไม่ได้ออกมาเป็นเรียลไทม์อย่างแน่นอน ... ทางเลือกหนึ่งสำหรับงานควบคุมที่ต้องการความเร็ว ในการทำงานสูง ๆ (หมายถึงต้องการคำนวณเยอะๆ) เครื่องไมโครคอมพิวเตอร์ที่เราใช้งานอยู่นั้น ก็จะเป็นทางเลือกที่จำเป็น มาก ๆ เลยทีเดียว เพราะเมื่อเทียบกับไมโครโปรเซาศเซอร์ อย่าง Z80/180 หรือไมโครคอนยโทรลเลอร์ MCS-51 / 68HC11 / BASIC Stamp/ PIC แล้ว ผมว่ายังไงเจ้าไมโครโปรเซสเซอร์นั้น มีความเร็วเหมาะกับงานจำพวกนี้เป็นอย่างมาก (ไมโครคอมพิวเตอร์ที่ว่านี่ ผมหมายถึงเครื่องระดับ 386 ขึ้นไปนะครับ) ... ในตลาดจำนวนพวกอุปกรณ์ embeded ในต่างประเทศนั้น เขาเอา 386/486 หรือไมโครโปรเซสเซอร์ที่มีความเร็วสูงๆ มาออกแบบบอร์ดควบคุมแบบใหม่ พร้อมทั้งใช้ ROM/EPROM กับ RAM อีกปริมาณหนึ่ง (ปกติก็ 1 MB ขึ้นไป) ... แล้วเขาก็เอา Linux มาคอมไพล์ เพื่อใช้งานกับบอร์ดของเขา ... การที่เขาใช้ Linux นั้นคงเป็นเพราะ นอกจาก Linux เป็นระบบปฏิบัติการที่แจกจ่ายฟรีๆ พร้อม surce code แล้ว Linux เองยัง ทำงานเป็นแบบ Multitasking (ระบบ ที่ทำงานหลายๆ งานได้พร้อมๆ กัน) ทำให้เราสามารถสั่งงานๆ แบบเรียลไทม์พร้อมทั้ง สั่งได้ทีละหลายๆ งานอีกด้วย ...

จากย่อหน้าด้านบน จะเห็นว่า ไมโครคอมพิวเตอร์ได้มีบทบาทมากขึ้นในงานควบคุม ซึ่งรูปแบบที่นิยมใช้งานกันอยู่นั้น ก็มี ด้วยกันหลายลักษณะ ไม่ว่าจะเป็นการ การใช้ Serial Port, Parallel Port ไปจนถึงการสร้างบอร์ดแบบการ์ดเสียบบน ช่องเสียบ (Slot) แบบ ISA 8 บิต, 16 บิต, PCI ก็ล้วนแต่เป็นกางเลือกในการใฃ้ไมโครคอมพิวเตอร์สำหรับงานควบคุม ... ในบทความนี้เราจะลองใช้การ์ดที่เสียบลงบนช่องเสียบแบบ 8 บิตของบริษัทอีทีที ... บอร์ดที่ว่าเป็นรุ่น ET-DIO ครับ.. คุณสมบัติของมันก็คือ นอกจากมีพอร์ตให้เราใช้งาน 3 พอร์ต (8x3 บิต จาก ไอซี 8255) แล้ว ยังมีไอซีเพิ่ม ประสิทธิภาพในด้านการทำ A-TO-D และ D-TO-A พรอ้มทั้ง 8253 (Timer/Counter) ให้เราใช้งานอีกด้วย เรียกได้ว่า บอร์ดนี้มีความสามารถมากมายเลยทีเดียว ... ก่อนอื่น ผมขอขอบคุณ อ.เที่ยง เหมียดไธสง [ประธานโปรแกรมวิชาอิเล็กทรอนิกส์ ของสถาบันราชภัฏเพชรบุรี] เป็นอย่างมากครับ ที่ ให้บอร์ด ET-DIO มาทดลองใช้งาน

เราจะมาเริ่มการควบบคุมแบบง่ายๆ ก่อน นั่นคือ ลองใช้ พอร์ต A ของไอซี 8255 มาทำการขับหลอด LED จำนวน 8 หลอด ให้เป็นไฟวิ่งรูปแบบต่างๆ ... วงจรที่ใช้งานเป็นดังนี้ครับ

เนื่องจากเราใช้ไมโครคอมพิวเตอร์ ดังนั้น ภาษาที่เราสามารถเลือกใช้งานได้นั้นก็มีมากมายเลยทีเดียว ผมขอเลือกใช้ภาษา C ล่ะกันครับ ... ตัวอย่างโปรแกรมที่ผมเอามาเสนอในบทความนี้จะเป็นของ Turbo-C version 2.01 กับ Visual C++ version 5 โดยตัว แรกทำงานบน DOS และตัว Visual C++ จะทำงานบน Windows [ผมกำหนดให้โปรแกรมสำหรับ Windows ทำงานแบบ Console mode] ส่วนภาษาอื่นๆ นั้น ผมไม่แน่ใจว่าบน Windows จะทำงานได้หรือไม่ ตัวอย่างเช่น Visual BASIC / Delphi หรือ C++ Builder เท่าที่ลองทดสอบ รู้สึกว่า มันต้องการใช่ไลบรารีจากภายนอกที่จะต้องเขียนด้วย Visual C++ หรือ Borland C++ เป็นไฟล์แบบ DLL แล้ว Visual BASIC/Delphi และ C++ Builder จะเรียกใช้ DLL นั้นอีกทีหนึ่ง ... ถ้าจำไม่ผิด ขอให้ ผู้อ่านโหลดโปรแกรมตัวอย่างของบอร์ด ET-DIO ไปศึกษาก็แล้วกันครับ ในนั้นมีตัวอย่างของ Visual BASIC กับ Delphi มาให้แล้ว ... หน้าตาของโปรแกรมสำหรับ Turbo C version 2.01 เป็นดังนี้ครับ

	/*
	Filename	:       	dio8255.c
	Author	:	Supachai Budsartij
	Date    	:       	26 ก.ค. 2543
	Compiler	:       	Turbo C Version 2.01
	Hardware	:	ETT-DIO Card
	Platform	:       	MS-DOS
	Tester 	:	AMD K6-II 500MHz
			RAM     64MB
			Harddisk 1x10.2GB, 1x1.2GB
			VGA 3Dfx Banshee
			Sound Creative AWE64 [ISA]
	Note	:	Move LED with pattern.
	 */
	#include <stdio.h>
	#include <conio.h>
	#include <stdio.h>
	#include <dos.h>

	#define DIO_8255PA	0x300
	#define DIO_8255PB	0x301
	#define DIO_8255PC	0x302
	#define DIO_8255CTRL	0x303

	void out_8255(int port_no, unsigned char data)
	{
	    outportb(port_no, data);
	    delay(10000);
	}

	void main(void)
	{
	    unsigned char pattern[] = {
	        0x01,0x02,0x04,0x08,0x10,0x20,0x40,
	        0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,
	        0x00,0x00,0x00,0x00,
	        0x81,0x42,0x24,0x18,0x24,0x42,0x81,
	        0x00,0x00,0x00,0x00,
	        0x18,0x24,0x42,0x81,0x42,0x24,0x18,
	        0x00,0x00,0x00,0x00,
	        0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,
	        0x00,0x00,0x00,0x00};
	    unsigned char max_patt = sizeof(pattern);
	    unsigned char element = 0;

	    out_8255(DIO_8255CTRL,0x80);

	    while (!kbhit()) {
		out_8255(DIO_8255PA,pattern[element]);
		if (element == max_patt-1) {
			element = 0;
		}
		else {
			element++;
		}
	    }
	    out_8255(DIO_8255PA,0x00);
	}
จุดสำคัญของโปรแกรมของ Turbo C ก็คือ ทาง Borland ได้ให้ไลบรารีมาเยอะมาก เช่น การ delay หรือ หน่วงเวลานั้น เราสามารถ เรียกใช้ delay( ) ได้เลย แต่ที่ต้องระวังก็คือว่าคำสั่ง delay( ) นี้เมื่อเราเปลี่ยนเครื่องใช้งาน เราก็ต้องกำหนดค่ามันใหม่ด้วยเสมอ ... ดังนั้น เมื่อผู้อ่านเอาไปทดลองแล้วพบว่า มันเร็วเกินไป หรือช้าเกินไปก็ให้ปรับแก้ได้ที่คำสั่ง delay( ) ล่ะกันครับ .. . ส่วน Visual C++ ไม่ได้ให้คำสั่ง หน่วงเวลามาให้ เราจึงต้องทำการหน่วงเวลาด้วยตัวเอง ซึ่งก็ไม่ได้ยากอะไร เพราะ ผมใช้การหน่วง เวลาแบบการวนรอบ เท่ากับจำนวนรอบที่กำหนดมาให้ แต่อย่างไรก็ตาม การทำอย่างนี้ก็มีปัญหาเรื่องความเที่ยงตรงของเวลาครับ เพราะแต่ละเครื่องจะช้า /เร็วไม่เท่ากัน ก็เป็นที่รู้กันนะตรับว่า ควรไปแก้ไขอย่างไร ส่วน source code ก็จะเป็นดังนี้ครับ

	/*
		Filename:	dio8255.c
		Author	:	Supachai Budsartij
		Date	:	20 ก.ค. 2543
		Compiler	:	Visual C++ Version 5
		Hardware:	ETT-DIO Card
		Platform	:	Win32 [Console]
		Tester 	:	AMD K6-II 500MHz
				RAM	64MB
				Harddisk 1x10.2GB, 1x1.2GB
				VGA 3Dfx Banshee
				Sound Creative SB32 [ISA]
		Note	:	Drive LEDx8 on 8255 port A.
	 */
	#include <conio.h>
	#include <stdio.h>

	#define DIO_8255PA	0x300
	#define DIO_8255PB	0x301
	#define DIO_8255PC	0x302
	#define DIO_8255CTRL	0x303

	void delay_8255(short dly)
	{
		while (dly-- > 0);
	}

	void out_8255(int port_no, unsigned char data)
	{
    		_outp((unsigned short)port_no, (int)data);
    		delay_8255(10000);
	}

	void main(void)
	{
    		unsigned char pattern[] = {
           			0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x40,
			0x20,0x10,0x08,0x04,0x02,0x01,
	       		0x00,0x00,0x00,0x00,
	       		0x81,0x42,0x24,0x18,0x24,0x42,0x81,
	       		0x00,0x00,0x00,0x00,
	       		0x18,0x24,0x42,0x81,0x42,0x24,0x18,
	       		0x00,0x00,0x00,0x00,
	       		0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01,0x02,
			0x04,0x08,0x10,0x20,0x40,0x80,
	       		0x00,0x00,0x00,0x00};
    		unsigned char max_patt = sizeof(pattern);
    		unsigned char element = 0;

    		out_8255(DIO_8255CTRL,0x80);

    		while (!kbhit()) {
			out_8255(DIO_8255PA,pattern[element]);
			if (element == max_patt-1) {
				element = 0;
			}
			else {
				element++;
			}
		}
		out_8255(DIO_8255PA,0x00);
	}

รูปของบอร์ดทดลองเป็นดังนี้

ตอนนี้เราก็ได้ทดลองเขียนโปรแกรมผ่านพอร์ตของบอร์ด ET-DIO ไปแล้ว คราวหน้าผมจะเอาตัวอย่างเกี่ยวกับ 7-Segment มาแนะนำกันต่อไปครับ ... ตอนนี้เท่านี้ก่อนล่ะกันครับ


เขียนโดย : ศุภชัย บุศราทิจ
Author : Supachai Budsaratij
e-mail : raek@se-ed.net
วันที่ทำการปรับปรุง : ๓๐ ก.ค. ๒๕๔๓