[ บทความ : 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 กันต่อ … สัปดาห์นี้ เท่านี้ก่อนนะครับ …

 


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