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