Issuu on Google+

Proto Tech - Series

Embedded System ศักดิ์ชัย ผางส�าเนียง

เรี ย น-เล น -ใช

ไมโครคอนโทรลเลอร MCS-51 ดวยโปรแกรมภาษาเบสิก µÍ¹·Õè 2 : ¤Çº¤ØÁÍØ»¡Ã³ÀÒ¹͡¼‹Ò¹¾ÍϵàÍÒµ¾Øµ

ประเดิมการทดลองอยางงายดวย การขับอุปกรณเอาตพุต ผานการเขียนโปรแกรมภาษาเบสิก เพื่อสงคาไปยังพอรตเอาตพุตของ ไมโครคอนโทรลเลอร P89V51RD2

รู้¨ักกับไมâครคอนâทรลเลอร์ P89V51RD2

ในรูปที่ 2-1 แสดงการจัดขาของไมโครคอนโทรลเลอร์ P89V51RD2

หลังจากที่เราทราบเครื่องมือพื้นฐานในการใช้งาน Bascom-8051 กัน แล้ว ล�าดับต่อไปมาท�าความรู้จักกับไมโครคอนโทรลเลอร์ที่เราจะต้องร่วม ทุกข์รว่มสุขกันไปตลอดอายุของบทความชุดนี้ก่อนหน่อย เพื่อจะได้ใช้งาน ได้อย่างถูกต้อง นั่นคือ ไมโครคอนโทรลเลอร์เบอร์ P89V51RD2 P89V51RD2 เป็นไมโครคอนโทรลเลอร์ที่ผลิตโดย NXP หรือ Philips Semiconductor ในอดีต มีคุณสมบัติทางเทคนิคโดยสรุปดังนี้ • มีพอร์ตอินพุตเอาต์พุต 4 พอร์ต ได้แก่ P0, P1, P2 และ P3 แต่ละ พอร์ตมี 8 ขา มีรูปแบบการเรียกชื่อขาเป็น P0.0 ส�าหรับพอร์ต 0 บิต 0 ไป จนถึง P3.7 ส�าหรับพอร์ต 3 บิต 7 รวม 32 ขา รองรับการท�างานกับระดับ สัญญาณทีทีแอลและซีมอส

• ต้องการไฟเลี้ยง +5Vdc ใช้งานกับคริสตอลได้สูงสุด 40MHz

• ความจุของหน่วยความจ�าโปรแกรมแบบแฟลชมากถึง 64 กิโลไบต์ และมีหน่วยความจ�าข้อมูลแรม 1 กิโลไบต์

• มีโมดูล UART ส�าหรับสื่อสารข้อมูลผ่านพอร์ตอนุกรม

• มีไทเมอร์/เคาน์เตอร์ 16 บิต 3 ตัว

• รองรับการอินเตอร์รัปต์จาก 8 แหล่งก�าเนิด และจัดระดับความ ส�าคัญได้ 4 ระดับ

68

• มีโมดูลก�าเนิดสัญญาณ PWM

• มีวอตช์ด็อกไทเมอร์ในตัว

• มี DPTR หรือรีจิสเตอร์ชี้ต�าแหน่งข้อมูล 2 ตัว

The Prototype Electronics

รูปที่ 2-1 การจัดขาของไมโครคอนโทรลเลอร์ P89V51RD2


âครงสร้างและการท�างานของ¾อร์ตของ P89V51RD2

การท´ลองที่ 1 - ควบคØมอØปกรณ์เอาต์¾Øตอย‹างง‹าย

ไมโครคอนโทรลเลอร์ MCS-51 มาตรฐาน มีพอร์ตให้ใช้งานทั้งสิ้น 4 พอร์ตคือ พอร์ต 0 ถึงพอร์ต 3 แต่ละพอร์ตมีขนาด 8 บิต เป็นพอร์ตแบบ 2 ทิศทาง เป็นได้ทั้งอินพุตรับสัญญาณข้อมูลเข้าและเอาต์พุตส่งสัญญาณ ข้อมูลออก ทุกพอร์ตของไมโครคอนโทรลเลอร์ MCS-51 แบบแฟลชมีวงจร แลตช์และวงจรขับ ตลอดจนบัฟเฟอร์อินพุต

มาเริ่ ม กั น ที่ ก ารทดลองเขี ย นโปรแกรมเพื่ อ ติ ด ต่ อ กั บ พอร์ ต อิ น พุ ต เอาต์พุตของ P89V51RD2 ในการทดลองนี้ใช้ LED สีแดง ขนาด 3 หรือ 5 มม. และตัวต้านทาน 510Ω เป็นอุปกรณ์ร่วม ดังรูปที่ L1-1

ที่พอร์ต 0 และพอร์ต 2 จะใช้งานเป็นพอร์ตอินพุตและเอาต์พุตส�าหรับ งานทั่วไป และใช้ในการติดต่อกับหน่วยความจ�าภายนอก ส�าหรับพอร์ต 3 ทั้งพอร์ตและพอร์ต 1 บางขานอกจากจะใช้เป็นขาพอร์ตอินพุตเอาต์พุตตาม ปกติแล้ว ยังสามารถใช้งานในหน้าที่พิเศษได้อีก ที่ขาพอร์ต 0 ไม่มีวงจรพูลอัปภายใน หากมีการน�าพอร์ต 0 ไปใช้งาน เป็นพอร์ตอินพุตจะต้องต่อตัวต้านทานพูลอัปภายนอกเข้าที่ขาพอร์ต 0 ทุก ขาด้วย

การใช้งานเปšน¾อร์ตเอาต์¾Øต โดยปกติแล้ว ขาพอร์ตจะก�าหนดให้มีลักษณะเป็นเอาต์พุตอยู่แล้ว จึง ส่งข้อมูลออกไปได้อย่างง่ายดายและตรงไปตรงมา หากต้องการส่งข้อมูล "0" ก็เขียนข้อมูลไปได้เลย ในทางตรงข้ามหากต้องการส่งข้อมูล “1” ออกไป ก็ให้เขียนข้อมูล “1” ออกไป ขาพอร์ตจะถูกเชื่อมต่อกับวงจรพูลอัปภายใน เกิดเป็นลอจิก “1” ที่ขาพอร์ตนั้น

a

c

b (a) LED ขนาด 5 มม. สีแดงหรือสีอื่นตามต้องการ (b) ตัวต้านทาน 510Ω 1/4W 5% หรือ 1% (c) สายต่อวงจร

รูปที่ L1-1 แสดงอุปกรณ์ทั้งหมดที่ใช้ในการทดลองนี้ ในการต่อวงจรทดลองควรใช้แผงต่อวงจรหรือเบรดบอร์ดพร้อมกับ สายต่อวงจรซึ่งเป็นสายไฟเดี่ยวเบอร์ AWG#22 มาช่วยด้วย ในรูปที่ L1-2 แสดงหน้าตาของเบรดบอร์ดขนาด 400 จุดพร้อมกับการต่อถึงกันของจุดต่อ ต่างๆ ภายในเบรดบอร์ด

เมื่อใช้งานเป็นพอร์ตเอาต์พุต แต่ละขา (หรือแต่ละบิต) ของแต่ละ พอร์ตมีความสามารถในการจ่ายกระแสหรือที่เรียกว่า กระแสซอร์ส (source current) ได้สูงสุด 4mA จึงไม่เหมาะที่จะขับ LED ด้วยการใช้กระแสซอร์ส เว้นแต่จะต่อวงจรบัฟเฟอร์เพื่อขับกระแสไฟฟาให้มากขึ้น อย่างไรก็ตาม หากต้องการลดจ�านวนอุปกรณ์และความซับซ้อนลงในกรณีที่ต้องการขับ LED ไม่กี่ดวง แนะน�าให้ใช้การขับแบบกระแสซิงก์ (sync current) แทน ด้วยการส่งลอจิก "0" ออกไปยังขาพอร์ต แล้วต่อขาแอโนดของ LED เข้ากับ ไฟเลี้ยง +5V แทน โโยต้องมีตัวต้านทานต่ออนุกรมที่ขาแคโทดเพื่อจ�ากัด กระแสไฟฟาให้ LED ด้วย ดังตัวอย่างวงจรในรูปที่ 2-2

(a) เบรดบอร์ดมาตรฐานขนาด 2.5 x 3.5 นิ้ว จุดต่อ 390 ถึง 400 จุด

(b) โครงสร้างการต่อถึงกันของตุดต่อทั้งหมดภายในเบรดบอร์ด

รูปที่ L1-2 ลักษณะของแผงต่อวงจรหรือเบรดบอร์ดที่แนะนําให้ใช้ใน บทความชุดนี้ รูปที่ 2-2 แสดงการขับโหลดของขาพอร์ตเอาต์พุตของไมโครคอนโทรลเลอร์ The Prototype Electronics

69


(L1.1) เปิดโปรแกรม Bascom-8051 ขึ้นมา เขียนโปรแกรมที่ L1-1 บันทึกชื่อเป็น OutPort.bas

(L1.3) ปิดไฟเลี้ยง แล้วต่อวงจรทดลองตามรูปที่ L1-4 จากนั้นจ่ายไฟ เลี้ยง วงจรจะท�ำงาน

(L1.2) คอมไพล์โปรแกรม แล้วดาวน์โหลดไปยังไมโครคอนโทรลเลอร์ บนบอร์ด TPE-51 ด้วยซอฟต์แวร์ Flash magic โดยเปิดซอฟต์แวร์ Flash Magic ขึ้นมา จากนั้นเลือกเบอร์ พอร์ตอนุกรม (พอร์ตที่บอร์ด TPE-51 ต่อ อยู่) อัตราบอด และเลือกไฟล์นามสกุล .hex ที่ต้องการโปรแกรม ดังรูปที่ L1-3 จากนั้นคลิกที่ปุ่ม Start แล้วกดสวิตช์ RESET ที่บอร์ด TPE-51 การ โปรแกรมจะเริ่มต้นขึ้น รอจนกระทั่งเรียบร้อย

รูปที่ L1-4 วงจรทดลองพอร์ตเอาต์พุตของไมโครคอนโทรลเลอร์ MCS-51 รูปที่ L1-3 แสดงการตั้งค่าและไฟล์นามสกุล .hex ของการทดลองนี้ ที่ต้องดาวน์โหลดไปยังบอร์ด TPE-51 ผ่านโปรแกรม Flash Magic

ความรู้เบื้องต้นเกี่ยวกับตัวแปรและค�ำสั่งทางคณิตศาสตร์ในภาษาเบสิก ตัวแปรคืออะไร

ค�ำสั่งเปรียบเทียบทางคณิตศาสตร์

= หมายถึง เท่ากับ รูปแบบคือ X=Y

<> หมายถึง ไม่เท่ากับ รูปแบบคือ X<>Y

< หมายถึง น้ออยกว่า รูปแบบคือ X<Y

> หมายถึง มากกว่า รูปแบบคือ X>Y

<= หมายถึง น้อยกว่าหรือเท่ากับ รูปแบบคือ X<=Y

>= หมายถึง มากกว่าหรือเท่ากับ รูปแบบคือ X>=Y

ตัวแปรคือการจองหน่วยความจ�ำแรมใน ไมโครคอนโทรลเลอร์ ในไมโครคอนโทรลเลอร์ P89V51RD2 มีหน่วยความจ�ำแรม 1 กิโลไบต์ หรือ 1,024 ไบต์ ดังนั้นการประกาศตัวแปรคือ การเข้าไปจับจองพื้นที่ส�ำหรับเก็บข้อมูลตัวเลขต่างๆ ถ้าจะเปรียบไปแล้ว การเลือกตัวแปรก็ เหมือนการเลือกตะกร้าใส่ของ ซึ่งมีหลายขนาด ดังนั้นหากเลือกตะกร้าใหญ่ แต่ ใส่ของนิดเดียว ก็เปลืองที่เปล่าๆ ในขณะเดียวกัน ถ้าเลือกเล็กเกินไปก็จะใส่ของได้ไม่หมด นั่นคือ หากเลือกหรือ ก�ำหนดชนิดและขนาดของตัวแปรไม่ถูกต้อง ก็จะส่งผลให้การท�ำงานของโปรแกรทมเกิดความ ผิดพลาดได้ ดังนั้นการประกาสตัวแปรเพื่อน�ำมาใช้งานจึงมีความส�ำคัญในการเขียนโปรแกรม

ชนิดของตัวแปรใน Bascom-8051

ค�ำสั่งด�ำเนินการตรรกะหรือลอจิก

ประกอบด้วย

BIT - มีขนาดของการจองพื้นที่ 1/8 ไบต์ หรือ 1 บิต เก็บข้อมูลได้เพียงค่า 0 กับ 1 เป็น ตัวแปรที่มีขนาดเล็กที่สุด

70

BYTE - มีขนาด 1 ไบต์ เก็บข้อมูลตัวเลขได้ตั้งแต่ 0 ถึง 255

Integer - มีขนาด 2ไบต์ เก็บข้อมูลตัวเลขได้ตั้งแต่ -32,768 ถึง +32,767

Word - มีขนาด 2 ไบต์ เก็บข้อมูลตัวเลขได้ตั้งแต่ 0 ถึง 65,535

Long - มีขนาด 4 ไบต์ เก็บข้อมูลตัวเลขได้ตั้งแต่ -2,147,483,648 ถึง +2,147,483,647

Single - มีขนาด 4 ไบต์ ใช้เก็บข้อมูลตัวเลขแบทศนิยมทั้งด้านบวกและลบ

String - ส�ำหรับเก็บตัวอักขระหรือตัวอักษร มีขนาดตามที่เราประกาศแล้วบวกด้วย 1 เช่น Dim I as String * 5 จะมีขนาด 6 ไบต์

มีอยู่ 4 ค�ำสัง่ คือ NOT, AND, OR และ XOR มีรปู แบบการท�ำงานดังตารางต่อไปนี้

ค�ำสั่งทางคณิตศาสตร์

NOT คือการกลับสถานะเป็นตรงข้าม จาก "0" เป็น "1" หรือจาก "1" เป็น "0"

บวก ใช้สัญลักษณ์ +

ลบ ใช้สัญลักษณ์ -

คูณ ใช้สัญลักษณ์ *

หาร ใช้สัญลักษณ์ /

หารเอาเศษ ใช้คำ� สัง่ MOD เช่น A = 5 MOD 2 จะได้เศษของผลหารมาเก็บไว้ที่ A มีคา่ เท่The ากับPrototype 1 Electronics

AND คือการน�ำ A และ B มาตรวจสอบ หากตัวใดตัวหนึ่งมีค่าเป็น "0" จะให้ผลลัพธ์เป็น "0" และผลลัพธ์จะเป็น "1" เมื่อทั้ง A และ B มีค่าเป็น "1" ทั้งคู่เท่านั้น OR คือการน�ำ A และ B มาตรวจสอบ หากตัวใดตัวหนึ่งมีค่าเป็น "1" จะให้ผลลัพธ์เป็น "1" และผลลัพธ์จะเป็น "0" เมื่อทั้ง A และ B มีค่าเป็น "0" เท่านั้น XOR คือการน�ำ A และ B มาตรวจสอบว่ามีค่าเหมือนกันหรือไม่ ถ้าไม่ผลลัพธ์จะเป็น "1" ถ้าเหมือนกันผลลัพธ์จะเป็น "0"


$regfile = "89C51RD.DAT"

$regfile = "89C51RD.DAT"

‘ส�าหรับไมโครคอนโทรลเลอร์ 89V51RD2 (TPE-51)

$default Xram

$default Xram

‘ก�าหนดให้ใช้หน่วยความจ�า 1024 ไบต์

$ramstart = 0

‘เริ่มต้นการท�างานที่ต�าแหน่งแรก

$ramsize = 1024

‘ก�าหนดให้ใช้หน่วยความจ�า 1024 ไบต์

$ramstart = 0 $ramsize = 1024 $crystal = 11059200

$crystal = 11059200

Lamp Alias P0.0

‘ใช้คริสตอล 11.059200MHz ซึ่งเป็นความถี่คริสตอลบนบอร์ด TPE-51

Do

Lamp Alias P0.0

‘ก�าหนดให้ค�าว่า Lamp คือพิน P0.0

Do

‘จุดเริ่มต้นการจนรอบไม่รู้จบ

Reset Lamp

Waitms 500

ให้ P0.0 มีสถานะเป็น 0

Waitms 500

หน่วงเวลา 500 มิลลิวินาที

Set Lamp

ให้ P0.0 มีสถานะเป็น 1

Waitms 500

หน่วงเวลา 500 มิลลิวินาที ‘จุดสิ้นสุดการจนรอบไม่รู้จบ

Loop

Lamp = 0

โปรแกรมที่ L1-1 ไฟล์ OutPort.bas โปรแกรมส่งค่าออกพอร์ตเอาต์พุตอย่างง่าย (คําอธิบายโปรแกรมภาษาไทยไม่ต้องพิมพ์)

Lamp = Not Lamp Waitms 500 Loop

โปรแกรมที่ L1-2 โปรแกรมส่งค่าออกพอร์ตเอาต์พุตอีกแบบหนึ่งที่ให้ผลการ ทํางานเหมือนกับไฟล์ OutPort.bas ในโปรแกรมที่ L1-1 โดยโปรแกรมนี้ใช้คําสั่ง NOT มาช่วย

$regfile = "89C51RD.DAT" $default Xram

LED ที่พอรต P0.0 จะติดดับสลับกันไปมา โดยมีระยะเวลาการติด และดับ 500 มิลลิวินาทีหรือครึ่งนาที เราสามารถเพิ่มหรือลดค่าเวลานี้ได้ ตามความต้องการ จะสังเกตได้ว่า โปรแกรมตัวอย่าง OutPort.bas จะใช้ ค�าสั่งวนรอบไม่รู้จบ นั่นคือ Do…Loop หากต้องการออกจาก DO-Loop ก็ ท�าได้ด้วยการใช้ค�าสั่ง Exit Do เช่น Do

$ramstart = 0 $ramsize = 1024 $crystal = 11059200 Lamp Alias P0.0 Do Lamp = 0

“ค�าสั่งในการท�างาน”

Waitms 500

Exit Do

Lamp = 1

Loop

นอกจากนั้นการสั่งให้พอร์ตของไมโครคอนโทรลเลอร์ P89V51RD2 มีสถานะเป็น "0" ในไฟล์ OutPort.bas ใช้ค�าสั่ง Reset เพื่อให้ขาพอร์ตมี สถานะเป็น "0" และใช้ค�าสั่ง Set เมื่อต้องการขาพอร์ตมีสถานะเป็น "1" ซึ่ง เราสามารถเขียนโปรแกรมได้อีกหลายแบบเพื่อให้ได้ผลลัพธ์เดียวกัน ดัง ตัวอย่างในโปรแกรมที่ L1-2 และ L1-3 เริ่มตนกันงายๆ กอน กับการเขียนโปรแกรม เพื่อควบคุมการติดดับ ของ LED ติดตามตอนตอไปกับการอานคาสวิตช เพื่อนํามาควบคุม LED เพื่อสรางระบบควบคุมอยางงาย

Waitms 500 Loop

โปรแกรมที่ L1-3 โปรแกรมส่งค่าออกพอร์ตเอาต์พุตอีกแบบหนึ่งที่ให้ผลการทํางาน เหมือนกับไฟล์ OutPort.bas ในโปรแกรมที่ L1-1 โดยโปรแกรมนี้ใช้การเขียนค่าที่ ต้องการไปยังขาพอร์ตโดยตรง

www.tpemagazine.com

The Prototype Electronics

71


BASIC-51 COURSE Chapter2 (Thai)