[ บทความ : Robot ] ตอนที่ 3 เรื่อง ... ศึกษา ET-ROBOT (ตัวแปร) |
เอาล่ะครับ ตอนนี้เราสามารถใช้งาน BASIC Stamp Editor และสามารถส่งโปรแกรมไปเก็บในบอร์ดควบคุมกันเป็นที่เรียบร้อยแล้ว คราวนี้เรามาดูเรื่องของตัวแปรกันต่อครับ
ตัวแปรคืออะไร
?
ก่อนหน้านี้เราได้เรียนวิชาคณิตศาสตร์ เรามักได้ยินว่า ตัวแปร จะแบ่งออกเป็น 2 ประเภท คือ ตัวแปรต้นและตัวแปรตาม (จำได้ไหมเอ่ย) แล้วเจ้าตัวแปรนี่คืออะไรกันแน่ ? ตอบได้ง่ายๆ ว่า ตัวแปร คือ สิ่งที่แปรผัน หรือเปลี่ยนแปลงค่าได้ .. โดยการเปลี่ยนแปลงค่านั้น มีด้วยกันสองลักษณะ ดังที่ได้กล่าวถึงไปแล้ว นั่นคือ ตัวแปรที่เป็นตัวแปรต้น กับตัวแปรตาม
คำว่าตัวแปรต้น คือ ค่าที่เราเป็นผู้กำหนด ส่วนตัวแปรตาม คือ ส่วนที่เกิดการเปลี่ยนแปลงตามค่าที่เรากำหนด (งงไหม?) ผมจะตกตัวอย่างเรื่องสมการง่ายๆ ที่ทุกคนรู้จัก นั่นคือ สมการหาพื้นที่ของสี่เหลี่ยม อันได้แก่
พื้นที่สี่เหลี่ยม = ความกว้าง x ความสูง
จากสมการด้านบน เรามีตัวแปร 3 ตัว คือ พื้นที่สี่เหลี่ยม, ความกว้าง และ ความสูง ถ้าเราสังเกตดูดีๆ จะพบว่า พื้นที่สี่เหลี่ยมนั้น จะเปลี่ยนแปลงค่าของตัวมันเอง ตามค่าของความกว้างและความสูง ดังนั้น ความกว้างและความสูงจึงเป็นตัวแปรต้น และพื้นที่สี่เหลี่ยมจึงเป็นตัวแปรตาม (เพราะเปลี่ยนแปลงตามค่าของ ความกว้างและความสูง)
เนื่องจากคุณสมบัติของตัวแปร คือ สามารถเปลี่ยนแปลงค่าตัวของมันเองได้ ในคอมพิวเตอร์ เราจึงใช้หน่วยความจำเป็นที่เก็บตัวแปรต่างๆ โดยหน่วยความจำที่ว่านี้ จะต้องมีคุณสมบัติ ที่สามารถเปลี่ยนแปลงค่าได้ เอ แล้ว BASIC Stamp มันมีหน่วยความจำเป็นอย่างไร ล่ะ ?
การจัดการหน่วยความจำของ
BASIC Stamp
ฮาๆ
ผมไม่มีข้อมูลหน่วยความจำของ
BS2p40 เสียด้วยสิ
เอาไงดี
(แล้วเขียนบทความยังไงของผมล่ะเนี่ย)
ผมขอเอาตัวรอดด้วยการอ้างอิงจาก
BASIC Stamp 2SX ล่ะกันนะ
เพราะมันใช้แทนกันได้
แล้วคราวหน้า
ถ้ามันมีอะไรที่แตกต่างกันจริงๆ
ผมจะมาเพิ่มเติมให้ล่ะกันครับ
.. (นะนะนะ :D)
หน่วยความจำของ BASIC Stamp 2SX นั้นแบ่งออกเป็น 3 ส่วนคือ Variable RAM, Scratch pad RAM และ EEPROM โดยแต่ละส่วนนั้น มีรายละเอียดดังนี้เลยครับ
-Variable RAM เป็นหน่วยความจำที่เราใช้ในการสร้างตัวแปรต่างๆ อันจะประกอบด้วยหน่วยความจำขนาด 16 word (32 ไบต์) ในการใช้งานนั้น เราสามารถกำหนดขนาดการใช้ได้เป็น 4 รูปแบบ คือ Bytes, Nibbles, Bits และ Word การจัดแบ่งหน่วยความในส่วนนี้นั้น จะเป็นดังตารางต่อไปนี้
Word name |
Byte
name |
Nibble
name |
Bit
name |
หมายเหตุ |
INS |
INL |
INA |
IN0 IN1 IN2 IN3 |
ขารับข้อมูล
(Input pin) |
INB |
IN4 IN5 IN6 IN7 |
|||
INH |
INC |
IN8 IN9 IN10 IN11 |
||
IND |
IN12 IN13 IN14 IN15 |
|||
OUTS |
OUTL |
OUT |
OUT0 OUT1 OUT2 OUT3 |
ขาส่งข้อมูล
(Output pin) |
OUTB |
OUT4 OUT5 OUT6 OUT7 |
|||
OUTH |
OUTC |
OUT8 OUT9 OUT10 OUT11 |
||
OUTD |
OUT12 OUT13 OUT14 OUT15 |
|||
DIRS |
DIRL |
DIRA |
DIR0 DIR1 DIR2 DIR3 |
ขารับ/ส่งข้อมูล
(I/O pin direction control) |
DIRB |
DIR4 DIR5 DIR6 DIR7 |
|||
DIRH |
DIRC |
DIR8 DIR9 DIR10 DIR11 |
||
DIRD |
DIR12 DIR13 DIR14 DIR15 |
|||
W0 |
B0 B1 |
|
|
ใช้งานทั่วไป |
W1 |
B2 B3 |
|
|
|
W2 |
B4 B5 |
|
|
|
W3 |
B6 B7 |
|
|
|
W4 |
B8 B9 |
|
|
|
W5 |
B10 B11 |
|
|
|
W6 |
B12 B13 |
|
|
|
W7 |
B14 B15 |
|
|
|
W8 |
B16 B17 |
|
|
|
W9 |
B18 B19 |
|
|
|
W10 |
B20 B21 |
|
|
|
W11 |
B22 B23 |
|
|
|
W12 |
B24 B25 |
|
|
ตารางที่
1
แสดงการแบ่งหน่วยความจำตัวแปร
ของ BS2SX
การสร้างตัวแปร มีรูปแบบดังนี้
ชื่อตัวแปร
var ขนาด
โดยที่
ชื่อตัวแปร เป็นชื่อของตัวแปรที่เราใช้เรียก
โดยการตั้งชื่อนั้นกำหนดเอาไว้ว่า
ต้องขึ้นต้นด้วยตัวอักษรภาษาอังกฤษ
หรือ _ เท่านั้น
และชื่อจะต้องไม่ซ้ำกับคำสงวนที่กำหนดโดย
PBASIC
ขนาด
เป็นขนาดของตัวแปรที่เราต้องการสร้าง
โดยมีให้เลือกใช้ 4 ขนาดคือ
Bit มีขนาด 1 บิต มีค่าได้ 0 หรือ 1 เท่านั้น
Nibble
มีขนาด 4 บิต
มีค่าได้ 0 ถึง 15
Byte
มีขนาด 8 บิต
มีค่าได้ 0 ถึง 255
Word
มีขนาด 16 บิต
มีค่าได้ 0 ถึง 65535
-Scratch
pad RAM เป็นหน่วยความขนาด
64 ไบต์
โดยเราสามารถใช้งานได้เพียง 63
ไบต์
ทั้งนี้เพราะไบต์สุดท้ายนั้น
BASIC Stamp ใช้เก็บหมายเลขก้อน
(Page) ที่โปรแกรมกำลังทำงาน
การใช้หน่วยความจำส่วนนี้นั้น
สามารถใช้ผ่านทางคำสั่ง GET และ
PUT เท่านั้น
-EEPROM
เป็นหน่วยความจำ ROM ที่สามารถลบและเขียนใหม่ได้ด้วยวงจรอิเล็กทรอนิกส์
มีขนาด 16KB ใช้สำหรับเก็บข้อมูลทั่วไปและโปรแกรมที่เรียนเขียน
ซึ่งหน่วยความจำนี้จะถูกแบ่งเป็นก้อน
(Page) โดยแต่ละก้อนจะมีขนาด
2KB การที่เราจะใช้หน่วยความจำส่วนนี้ได้นั้น
เราต้องมองว่ามันเป็นหน่วยความจำที่เราไม่สามารถแก้ไขในระหว่างที่โปรแกรมทำงาน
ด้วยเหตุนี้ ถ้าตัวแปรใด
ที่เราต้องนำไปใช้
โดยตัวของมันมีลักษณะเป็นค่าคงที่
เราก็ควรที่จะเก็บเอาไว้ในหน่วยความจำของส่วน
EEPROM
เมื่อกล่าวถึงตัวแปร คราวนี้ก็ต้องกล่าวถึงเรื่องของการกำหนดค่าด้วยเช่นเดียวกัน เนื่องจากค่าที่เราสามารถกำหนดได้นั้น ปกติจะเป็นเป็น 2 ประเภทคือ ค่าที่เป็นตัวเลข กับค่าที่เป็นตัวอักษร โดยที่ค่าที่เป็นตัวอักษรนั้น จะไม่สามารถนำไปคำนวณได้ และจะต้องอยู่ในเครื่องหมาย .. เท่านั้น ส่วนค่าตัวเลขนั้น เราสามารถนำไปคำนวณได้
ค่าตัวเลขนั้น
จำแนกได้เป็น 2 ประเภท
คือ
ตัวเลขจำนวนเต็มและตัวเลขแบบทศนิยม
ซึ่งใน BASIC Stamp นั้น
จะมีเฉพาะตัวเลขแบบจำนวนเต็มเท่านั้น ในการกำหนดค่าตัวเลขนั้น
ปกติเราใช้เป็นเลขฐาน 10 แต่อย่างไรก็ดี
เราสามารถอ้างอิง
หรือกำหนดด้วยเลขฐานอื่นๆ
ได้เช่นเดียวกัน
โดยที่เราไม่ต้องแปลงค่าตัวเลขฐานนั้นๆ
มาเป็นฐาน 10
เลขฐานดังกล่าวคือ
เลขฐาน 2 และ ฐาน 16
มาดูตัวอย่างการกำหนดค่ากันก่อนครับ
W1 = 10
W2 = %10
W3 = $10
จากตัวแปร
W1 เราจะได้ว่า
ค่าที่เรากำหนดให้แก่ตัวแปรตัวนี้จะเป็นค่า
10 ในฐาน 10 แต่ในบรรทัดที่
2 นั้นเรากำหนดให้ W2
มีค่าเป็น %10 ซึ่ง
ใน BASIC Stamp นั้นจะมองว่า
ถ้าตัวเลขใดนำหน้าด้วยเครื่องหมาย
% ก็จะตีความว่าเป็นเลขฐานสอง
ส่วนกรณีของ W3 ที่มีค่าเป็น
$10 นั้น ตัว BASIC Stamp จะมองว่า
ถ้านำหน้าด้วยเครื่องหมาย $
ก็จะเป็นเลขฐาน 16
การกำหนดค่านี้ จะทำงานแบบ L=R โดย ทำการคำนวณว่า ค่าทางขวา (R) นั้นมีค่าเป็นเท่าไร เสร็จแล้วจะนำค่าที่คำนวณได้นั้น มาเก็บในตัวแปรทางด้านซ้าย (L) นั่นหมายความว่า ทางด้านซ้ายของเครื่องหมายเท่ากับ (=) นั้น จะต้องเป็นตัวแปร (เฉพาะกรณีของการกำหนดค่านะครับ) เอาล่ะมาดูตัวอย่างกันดีว่า
จากตอนต้นผมได้ยกตัวอย่างสมการหาพื้นที่สี่เหลี่ยม ดังนั้น เราจะมาเขียนโปรแกรมคำนวณพื้นที่สี่เหลี่ยมกันครับ ตัวโปรแกรมเป็นดังนี้เลยครับ
'{$STAMP
BS2p}
'{$PORT
COM1}
width
VAR BYTE
height
VAR BYTE
area
VAR WORD
width=10
height=$A
area
=
width*height
DEBUG
"Area=",
dec area
DEBUG
"Area=$",
hex area
DEBUG
"Area=%",bin
area
DEBUG
"B0
=",
dec B0,
"
B1
= ",
dec B1,
"
W0
=",
dec W0
DEBUG
"B2
=",
dec B2,
"
B3
= ",
dec B3,
"
W1
=",
dec W1
END
จากตัวอย่างโปรแกรม จะมีส่วนที่แตกต่างจากโปรแกรมของคราวที่แล้วด้วยกันหลายจุด เริ่มตั้งแต่บรรทัดที่ 2 ที่เขียนว่า
{$PORT
COM1}
อันมีความหมายว่า
โปรแกรมจะติดต่อกับบอร์ดควบคุมผ่านทาง
COM1
ในโปรแกรมนี้มีการสร้างตัวแปร 3 ตัว คือ width, height และ area โดยที่เป็นตัวแปรแบบ BYTE, BYTE และ WORD ตามลำดับ ส่วนการกำหนดค่านั้น ผมได้ให้ width มีค่าเป็น 10, height มีค่าเป็น $A ซึ่งมีความหายว่า เรากำหนดให้ height มีค่าเป็น A ในเลขฐานสิบหก ซึ่งก็คือเลข 10 ในฐาน 10
ในบรรทัด
area=width * height
ตัว
BASIC Stamp จะทำการประมวลผล
หรือคำนวณค่าทางด้านขวาของเครื่องหมายเท่ากับก่อน
แล้วนำผลลัพธ์ที่ได้นั้น
ไปเก็บในตัวแปรทางด้านซ้าย
นั่นคือ
นำค่าที่เก็บในตัวแปร width และ
height ซึ่งก็คือ 10 กับ
10 มาทำการคูณกัน
ดังนั้น
ผลลัพธ์ที่ได้คือ 100 แล้วนำค่า
100 นี้ไปเก็บในตัวแปร area
เมื่อคำนวณเสร็จถ้าเราไม่แสดงผลออกมา ย่อมไม่ทราบว่า การทำงานนั้น ถูกต้องหรือไม่ ส่วนที่ใช้แสดงผลนั้น มีด้วยกัน 3 บรรทัด คือ
DEBUG
"Area=", dec area
DEBUG
"Area=$", hex area
DEBUG
"Area=%", bin area
DEBUG
"B0 =", dec B0, " B1 = ", dec B1, " W0 =", dec
W0,13
DEBUG
"B2
=",
dec B2,
"
B3
= ",
dec B3,
"
W1
=",
dec W1,13
ซึ่งเราได้ทราบแล้วว่า คำสั่ง DEBUG นั้นใช้สำหรับแสดงผลออกมาทางส่วนของ Debug Terminal ของโปรแกรม BASIC Stamp Editor แต่คราวนี้มันแตกต่างจากเติม ตรงที่ว่า ผมได้พ่วงการแสดงผล ที่มากกว่าเป็นแค่ข้อความ มาดูทีละบรรทัดนะครับ
จากที่เขียนว่า DEBUG Area=, dev area, 13 นั้น ตัว BASIC Stamp จะทำงานทีละอย่างนั่นคือ เริ่มส่งตัวอักษร A มาที่ Debug Terminal เมื่อส่งเสร็จมันก็จะส่งตัวอักษร r,e และ a ตามมาเรื่อยๆ เป็นอันจบข้อความว่า Area ในส่วนต่อมาคือ เครื่องหมาย comma อันมีความหมายว่า มีข้อมูลจากส่วนอื่น ใช้แสดงต่อท้ายจากข้อความ
คราวนี้ล่ะครับ
ส่วนที่ต่อท้ายนั้น
ผมเขียนเอาไว้ว่า dec area ซึ่งเรารู้ว่า
area คือ ตัวแปร
ซึ่งเป็นตัวเลข ส่วน dec นั้นเป็นคำสั่งแปลงตัวเลขให้เป็นข้อความแบบตัวเลข
(งงไหม?) คำว่า
ข้อความแบบตัวเลขนั้นมีความหมายว่า
เดิมเนี่ย เจ้า area มีค่าเป็น
100 ซึ่งค่า 100 จะเป็นค่าของรหัส
ASCII ที่เป็นตัวอักษร d
เมื่อเราสั่งแสดงผลโดยไม่มีคำสั่ง
dec นำหน้า
มันก็แสดงเป็นตัวอักษร d
คราวนี้พอเราใส่คำสั่งว่า
dec นำหน้า ตัว BASIC Stamp ก็เข้าใจว่า
ให้ทำการแปลงเลข 100 นั้นให้เป็นข้อความ
100 เสียก่อนแล้วค่อนแสดง
ด้วยเหตุนี้ ที่ Debug terminal จึงแสดงข้อความเป็น
100 นั่นเอง
จึงสรุปได้ว่า dec นั้นเป็นการแปลงตัวเลขให้เป็นข้อความ
โดยข้อความนั้นเป็นเลขแบบฐาน
10 ส่วนคำสั่ง hex นั้นเป็นการกำหนดว่าให้แปลงตัวเลขเป็นข้อความตัวเลขแบบฐาน
16 และ bin ก็คือ
การแปลงให้เป็นข้อความตัวเลขแบบฐาน
2 ไงล่ะ
ส่วนบรรทัด
DEBUG
"B0 =", dec B0, " B1 = ", dec B1, " W0 =", dec
W0,13
DEBUG
"B2 =", dec B2, " B3 = ", dec B3, " W1 =", dec
W1,13
นั่นผมเขียนเพื่อดูว่า ตัวแปร width, height และ area มันได้ใช้หน่วยความจำบนหน่วยความจำใด และเมื่อสั่งแสดงผล แล้วผลของการทำงานจะแสดงหน้าจอแสดงผลดังนี้เลยครับ |
จะเห็นว่าข้อความที่ส่งผ่านจากคำสั่ง
DEBUG นั้นมันอยู่ติดกันเป็นบรรทัดเดียวกันหมด
ขอให้ผู้อ่านลองเปลี่ยนส่วนของคำสั่ง
DEBUG ให้เป็นดังนี้ดูครับ
DEBUG
"Area=", dec area, 13
DEBUG
"Area=$", hex area, 13
DEBUG
"Area=%",bin area, 13
DEBUG
"B0 =", dec B0, " B1 = ", dec B1, " W0 =", dec
W0,13
DEBUG
"B2 =", dec B2, " B3 = ", dec B3, " W1 =", dec
W1,13
แล้วสั่ง Run อีกครั้ง ก็จะมีผลลัพธ์แตกต่างไปจากเดิม ดังรูปต่อไปนี้ |
ความแตกต่างคือ พอผมใส่ ,13 ต่อท้ายคำสั่ง DEBUG มันก็จะขึ้นบรรทัดใหม่ ทั้งนี้ก็เพราะว่า รหัส ASCII 13 นั้น เป็นรหัสของแป้น Enter ดังนั้น BASIC Stamp จึงเข้าใจว่า เราต้องการให้ขึ้นบรรทัดใหม่นั่นเอง
และเมื่อดูค่าของ
B0, B1 หรือ เรียกในแบบ WORD
ว่า W0 นั้นมีค่าเป็น
100 ซึ่งตรงกับตัวแปร area
จึงสรุปได้ว่า W0 น่าจะเป็นตัวแปร
area ส่วน B2 กับ B3
นั้น ควรจะเป็นตัวแปร width
และ height ส่วน B2 จะเป็น
width หรือ height นั้น
ขอให้ผู้อ่านลองเปลี่ยนค่าของ
width ให้ไม่เท่ากับ height
ดู ก็จะทราบแล้วล่ะครับ
เอาล่ะ แล้วผมเอาอะไรมาเป็นหลักฐานว่าตัวแปร area, width และ height นั้นเป็น W0 กับ W1 มันอาจจะเก็บเอาไว้ที่อื่นก็ได้จริงไหมครับ :) วิธีการของผมก็คือ ดูจากแผนผังหน่วยความจำที่โปรแกรม BASIC Stamp Editor แสดงให้ผมดูไงล่ะ การสั่งให้หน้าต่างนี้แสดงขึ้นมานั้น ทำได้โดยการเลือกที่เมนู Run / Memory map ดังรูปต่อไปนี้
|
เมื่อเลือกเสร็จก็จะมีหน้าต่างของหน่วยความจำแสดงขึ้นมา |
ที่เราจะสนใจคือ อันนี้ครับ |
มันได้บอกเราว่า
มีการใช้ REG0 โดยอ้างอิงเป็นข้อมูลแบบ
WORD (เพราะมันเป็นสีน้ำเงิน)
และ REG1 นั้นเป็นการอ้างอิงแบบ
Byte (เพราะใช้สีเขียว)
แต่ REG2 ถึง REG12 นั้นเป็นสีเทา
ซึ่งหมายความว่า
ไม่ได้ถูกใช้งาน ดังนั้น
ผมเลยอาจหาญสรุปเอาว่า REG0 หรือ
W0 ก็คือตัวแปร area ส่วน
REG1 ก้ใช้เก็บข้อมูลของตัวแปร
width กับ height
จากตรงจุดนี้
จะได้ว่า
ถ้าเราสร้างตัวแปรขึ้นมา BASIC
Stamp ก็จะไปจองในหน่วยความจำในส่วน
Variable RAM ซึ่งมีพื้นที่ให้เราใช้งานเพียง
26 ไบต์เท่านั้น
มาถึงตรงนี้
ผมหวังว่า ผู้อ่านคงได้ใช้ BASIC
Stamp แบบเข้าใจถึงการทำงานแบบละเอียดกันนะครับ
(ฮาๆ เขียนตั้งเยอะ
เนื้อหานิดเดียวเอง)
สาเหตุที่ผมค่อนข้างอธิบายละเอียดนั้นเป็นเพราะนิสัยส่วนตัวน่ะครับ
คือ ตอนเริ่มชอบโม้มากมาย
แล้วพอท้ายๆ
ก็รวบรัดเสียจนตามไม่ทัน (ฮาๆ)
มาสรุปคำสั่งกันก่อนครับว่า
เราได้เรียนรู้อะไรไปบ้าง
.
ก่อนอื่นเลย
เราได้รู้ว่า
การสร้างตัวแปรนั้นทำอย่างไร,
หน่วยความจำสำหรับเก็บตัวแปรนั้น
มีกี่แบบ และอะไรบ้าง, ได้ศึกษาถึงรูปแบบของคำสั่ง
DEBUG เพิ่มเติมจากคราวที่แล้ว
และได้รู้คำสั่งที่ทำหน้าที่แปลงตัวเลขให้เป็นข้อความแบบตัวเลข
คือ dec, hex และ bin
คราวหน้าก็จะเป็นเรื่องของเครื่องหมายดำเนินการ
และคำสั่งที่เกี่ยวข้องกันเครื่องหมายดำเนินการ
พอผ่านเรื่องเครื่องหมายดำเนินการ
ก็จะมาลองใช้คำสั่งของ BASIC
Stamp กันต่อ
สัปดาห์นี้
เท่านี้ก่อนนะครับ