[ บทความ : ทดลองใช้ภาษาซีกับบอร์ด ET-BOARD V6 ] [ภาค MCS-51] ตอนที่ 1 ติดต่อกับ LED

หลังจากหายไปหลายวัน ประกอบกับมีคนถามเกี่ยวกับตัวอย่างโปรแกรมในหนังสือ ... ผมพบว่า โดยมากแล้วการเขียนโปรแกรมภาษาซี บน ไมโครคอนโทรลเลอร์นั้น มีบางอย่างที่แตกต่างไปจากการเขียนโปรแกรมภาษาซีบนไมโครคอมพิวเตอร์ที่เราๆ ท่านๆ ใช้กันอยู่ ... อย่างหนึ่งก็คือ เรื่องของระบบปฏิบัติการ เวลาที่เราเขียนโปรแกรมด้วย Turbo C ก็หมายความว่าเราใช้ระบบปฏิบัติการ DOS, เวลาที่เรา เขียนโปรแกรมด้วย Borland C++, C++ Builder, Visual C++ นั่นก็หมายความว่าเราเขียนโปรแกรมบนระบบปฏิบัติการ Windows เป็นต้น ... แต่การเขียนโปรแกรมบนไมโครคอนโทรลเลอร์นั้น เราเขียนบนระบบที่ไม่มีระบบปฏิบัติการ หรือจะบอกว่า เราเขียนโปรแกรมผ่านทางโปรแกรมมอนิเตอร์ ก็ตามเถอะครับ ความสามารถของระบบปฏิบัติการที่เรารู้จักกันนั้นมันแตกต่างจากโปรแกรมมอนิเตอร์ที่เรากล่าวถึง

ความแตกต่างที่เห็นได้ง่ายที่สุดก็คือส่วนของฮาร์ดแวร์ เราจะพบว่า โดยปกติแล้ว ไมโครคอมพิวเตอร์นั้นจะมีอุปกรณ์พื้นฐานที่เหมือนกัน ทุกบริษัทที่ขายคอมพิวเตอร์จะออกแบบโครงสร้างฮาร์ดแวร์ที่เหมือนกัน แต่ไมโครคอนโทรลเลอร์นั้น ค่อนข้างไม่มีมาตรฐานที่แน่นอน เนื่องจากจะต้องออกแบบฮาร์ดแวร์ให้เหมาะสมกับงานที่จะใช้งาน เป็นครั้งๆ ไป ... ด้วยความมีมาตรฐานของไมโครคอมพิวเตอร์นั้น ก็ทำให้เกิดความสะดวกสบายแก่ผู้ออกแบบระบบปฏิบัติการ และผู้สร้างตัวแปลภาษา ... สะดวกอย่างไรนั้น สังเกตง่ายๆ ได้จาก เวลาที่เรา เรียนเขียนโปรแกรมด้วยภาษาซีนั้น เราแทบไม่ต้องรู้ด้วยซ้ำไปว่าเครื่องที่เราใช้นั้นต่อพ่วงอะไรเอาไว้บ้าง อยากรู้ว่ามีอุปกรณ์หรือเปล่า เรา ก็ทำการอ่านค่าจากพอร์ตที่กำหนดเอาไว้ตามคู่มือเครื่อง (ซึ่งพอร์ตต่างๆ นั้นจะมีการกำหนดเอาไว้เป็นมาตรฐานตรงกัน) แค่นี้ก็มั่นใจได้เลยว่า ถ้าเราเขียนโปรแกรมจากเครื่องไมโครคอมพิวเตอร์เครื่องหนึ่ง ก็จะสามารถใช้ได้กัยไมโครคอมพิวเตอร์เครื่องอื่นๆ ที่ลงระบบปฏิบัติการ เดียวกัน หรือออกแบบให้เหมือนกัน แต่พอหันมามองที่ระบบไมโครคอนโทรลเลอร์ ... แค่ถามว่าหน่วยความจำของบอร์ดส่วนใดใช้ทำอะไร ? ... แค่ตรงนี้บอร์ดแต่ละรุ่นก็แตกต่างกันแล้ว นี่ยังไม่ได้ถามถึงอุปกรณ์ต่อพ่วงเลยนะครับ ... นึกก็ปวดหัวแล้ว ... ความปวดหัวนี้นี่ล่ะครับ ที่ทำให้ คนเขียนตัวแปลภาษาหนักใจมาก (ทำเหมือนเขียนเองเลย :D) ดังนั้น จะพบว่า โดยมากแล้วตัวแปลภาษาต่างๆ เช่น ภาษาซี ก็จะให้ เราทำการแก้ไขส่วนเริ่มต้นทำงาน (Startup file) ให้เหมาะสมกับฮาร์ดแวร์ที่เราจะใช้งาน ... ด้วยเหตุนี้ล่ะ ทำให้ความง่าสยของภาษาซี เป็นอุปสรรค ขึ้นมาทันที คือ ... คุณจะเขียนโปรแกรมได้นั้นจะต้องกำหนดค่าต่างๆ ให้ถูกต้อง แถมถ้าเปลี่ยนฮาร์ดแวร์ คุณก็จะต้องเปลี่ยนแปลงมันใหม่อีกต่างหาก ... พอนึกออกไหมครับ ว่าถ้าเขียนโปรแกรมแล้วทำงานไม่ได้นั้น นอกจากจะเกิดจากการเขียนโปรแกรมผิดพลาดแล้วยังอาจจะเกิด จากการกำหนดค่าเริ่มต้นของโปรแกรมไม่ถูกต้องอีกด้วย ... ยิ่ง MCS-51 มีการออกแบบหน่วยความจำได้หลายลักษณะ คือ สามารถแยกหน่วย ความจำแบบข้อมูลกับโปรแกรมออกจากกันได้ หรือถ้าไม่พอใจอาจจะทำการรวมให้เป็นส่วนเดียวกัน (Overlapped) ก็ได้ หรือจะแยกบางส่วนให้ overlapped แต่บางส่วนแยกกันก็ได้ ... อืม ... ปวดหัว(ใช่ไหมครับ) แต่ข้อกำหนดต่างๆ เหล่านี้นะครับ จะหาอ่านได้จากคู่มือของบอร์ดที่เราซื้อมา เพราะเขาจะบอกว่าหน่วยความจำส่วนใดออกแบบไว้อย่างไร ...

เข้าเรื่องดีกว่าครับ ... บทความตอนนี้จะเป็นเรื่องของการทดลองเขียนโปรแกรมเพื่อใช้งานกับบอร์ด ET-2000 V6 ซึ่งเป็นบอร์ด ที่มีทั้ง Z80 และ MCS-51 .. ตอนนี้ว่ากันเรื่องของ MCS-51 กันก่อน ... จากโครงสร้างของบอร์ดจะเห็นว่า การออกแบบนั้น ค่อนข้างอุปกรณ์เยอะ การเขียนโปรแกรมสามารถกำหนดได้ว่าจะใช้หน่วยความจำแบบใดก็ได้ครับ แต่อาจจะมีปัญหากับ รูปแบบหน่วยความจำ (Memory model) แบบ Large นะครับ เพราะการที่คุณจะใช้ Large ได้ คุณจะต้องติดตั้งหน่วยความจำ แรม (RAM) ความจุ 32K (62256) ซึ่งเป็นหน่วยความจำข้อมูล ที่บอร์ดด้วยนะครับ ไม่อย่างนั้นเวลาทำงานมันก็จะมีข้อผิดพลาด ในการทำงาน คือ มันจะรวนไงครับ ... คือ ถ้าไม่มีหน่วยความจำตัวนี้ติดตั้งอยู่ก็จะต้องแก้ไขโดยการใช้หน่วยความจำแบบอื่นๆ เช่น ใช้เป็น SMALL, TINY เป็นต้น ... นอกจากเลือกรูปแบบหน่วยความจำได้แล้ว ขั้นตอนต่อไปของเราก็คือ จะต้องแก้ไขส่วน startup ใหม่ ... (รายละเอียดอ่านได้จากหนังสือบทที่ 5 ครับ) ซึ่งจะต้องแก้ไขว่าจะให้หน่วยความจำข้อมูลเริ่มที่ใด โดยถ้าเป็น TINY ก็ไม่ต้องกำหนด เพราะจะใช้หน่วยความจำภายใน แต่ถ้าใช้ SMALL ก็สามารถกำหนดเป็น $8000 ส่วนหน่วยความจำ โปรแกรมก็จะเริ่มต้นที่ $8000 (สำหรับ TINY) และ $8100 หรือมากกว่านี้สำหรับ SMALL แต่ถ้าคุณติดตั้งหน่วยความจำข้อมูล ขนาด 32K เอาไว้ แล้วใช้งานแบบ LARGE ก็กำหนดให้หน่วยความจำข้อมูลเริ่มต้นที่ $0000 จบที่ $7FFFF และหน่วยความจำ โปรแกรมก็เริ่มต้นที่ $8000 เท่านี้ก็เรียบร้อยแล้วครับ ... รูปด้านล่างเป็นตัวอย่าง startup บางส่วนของ TINY, SMALL, LARGE ครับ

ตอนนี้เราก็ทำการแก้ไขไฟล์เริ่มต้นการทำงานเสร็จเรียบร้อย ... ต่อไปก็มาทำการเขียนโปรแกรม ... ตัวอย่างโปรแกรมที่ผม เขียนนี้เป็นตัวอย่างหนึ่งที่มากับบอร์ด ET-2000 V6 เดิมตัวอย่างชื่อว่า ex1.asm ซึ่งทำการขับหลอด LED โดยให้ มีลำดับการติดดับทีละดวง ซึ่งรูปแบบการแสดงจะเป็นการติดจากดวงทางขวาแล้วเลื่อนมาทางซ้าย พอดวงาง ซ้ายสุดสว่าง ก็จะกลับไปเริ่มต้นที่ดวงขวาสุดอีกครั้ง ... การออกจากโปรแกรมเราจะต้อง reset บอร์ด ... โปรแกรมมีหน้าตามดังนี้ครับ

	/*
	 * Filename : ex01.c
	 * Compiler : Micro-C51 V2.4
	 * Hardware : ET-2000 V6
	 */

	#include <8051io.h>
	#include <8051reg.h>

	#define 	P_DIGIT   		0xE000
	#define 	P_SEGM    		0xE001
	#define 	P_CONTROL 	0xE003

	config8255usr()
	{
	    poke(P_CONTROL,0x88);
	    delay();
	}

	delay()
	{
 	   unsigned char i,o;
	    for (o=0; o<10; o++) for (i=0; i< 255; i++);
	}

	main()
	{
	    unsigned char pattern;

	    config8255usr();

	    pattern = 0x06;
	    poke(P_DIGIT,pattern);
	    delay();
	    pattern = 0x01;
	    while (1) {
	        poke(P_SEGM,pattern);
	        delay();
	        if (pattern != 0x80) {
	            pattern <<= 1;
	        }
	        else {
	            pattern = 0x01;
	        }
	    }
	}

ตอนนี้เรามาทำการคอมไพล์โปรแกรมกันครับ ... รูปแบบแรกเป็หนการสั่งคอมไพล์เพื่อใช้กับรูปแบบหน่วยความจำแบบ TINY

	cc51 ex01 -pio m=t

สำหรับ SMALL ก็สั่งดังนี้ครับ

	cc51 ex01 -pio m=s

สำหรับ LARGE สั่งดังนี้

	cc51 ex01 -pio m=L

ตอนนี้เราก็จะได้ไฟล์ ex01.hex มาแล้ว (ถ้าเขียนโปรแกรมไม่ผิดนะครับ) หรือถ้าใครคอมไพล์ไม่ได้ก็ขอให้ดูที่ส่วนของ การติดตั้งโปรแกรมนะครับ เพราะเราจะต้องเพิ่มตัวแปรระบบและ path ของโปรแกรมเข้าไปใน autoexec.bat ด้วย

เมื่อได้ .hex มาแล้ว ขั้นตอนสุดท้ายก็คือโหลดเข้าสู่บอร์ดแล้วก็ทำการเรียกใช้งานครับ

... บทความตอนนี้คงเท่านี้ก่อนนะครับ ... บทความต่อไปจะเป็นตัวอย่างติดต่อกับ serial port ของบอร์ด ET-2000 V6 ครับ ... หลังจากนั้นก็จะเป็นเรื่องอะไรก็ค่อยว่ากันใหม่ครับ ... มาถึงตรงนี้ หวังว่าผู้อ่านคงพอจะมองภาพออกนะครับ ว่าจะเขียนโปรแกรมโดยใช้ภาษาซีได้อย่างไร...


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