[ บทความ : มาเขียนโปรแกรมกับ 68HC11 กันเถอะ ตอนที่ 2 ] มารู้จักกับ Cross-32

 

  

               จากบทความตอนแรก เราได้รู้จักคุณสมบัติของ 68HC811E2 กันไปแบบคร่าวๆ แล้วนะครับ ก่อนที่เราจะลงรายละเอียดมากกว่าเดิม ก่อนอื่น เราจะมาเริ่มศึกษา สิ่งที่เกี่ยวข้อง และต้องใช้กันก่อนดีกว่าครับ นั่นก็ได้แก่ โปรแกรม Edit.com ของ DOS/Windows, Cross-32 assembler , บอร์ดทดลอง และตัวดาวน์โหลดโปรแกรมลงบอร์ด

 

จุดประสงค์

                เราจะมาศึกษาการใช้งาน Edit.com, Cross-32, บอร์ดทดลอง และ การอัพโหลด (upload) โปรแกรมลงบอร์ด

 

บอร์ดทดลอง

                ก่อนอื่นขอข้ามมาพูดถึง บอร์ดทดลองกันก่อนนะครับ บอร์ดที่ผมเลือกใช้ประกอบการศึกษาการเขียนโปรแกรมกับ 68HC11 ก็คือบอร์ด บอร์ดไมโครคอนโทรลเลอร์รุ่น EXP4 LAB1 MCU หรือใครจะใช้บอร์ดรุ่น jr-6811 ก็ได้ครับ ... จริงๆ แล้วกะจะต่อวงจรเองด้วยล่ะครับ เพราะมันเสริมสร้างความเข้าใจเราได้ดีขึ้นเยอะเลย ประกอบกับชิพ 68HC811E2 เนี่ยมันเป็น Single Chip การต่อยิ่งง่ายกว่าปกติ ใครสนใจจะต่อเองก็ต่อได้ตามนี้ครับ (เป็นผังวงจรแบบง่ายๆ นะครับ ... เหมาะกับผมดี .. ฮา)

               

การใช้โปรแกรม Edit

                 โปรแกรม Edit นั้นจะมากับ MS-DOS ตั้งแต่รุ่น 5.0 หรือแม้แต่ใน Windows รุ่นใหม่ ก็ยังมี Edit.com ให้เราเรียกใช้เช่นเคย ในบทความนี้ผมจะอ้างอิงตาม โปรแกรม Edit ที่มากับ Windows XP ล่ะกันครับ

     1. การเรียกโปรแกรม

                การเรียกโปรแกรมใช้งานก็ให้พิมพ์ edit แล้วกด Enter หลังจากนั้น (ถ้าในเครื่องมีโปรแกรม edit อยู่นะครับ) ก็จะแสดงหน้าจอดังนี้

               

        2. การเรียกไฟล์

                การเรียกไฟล์นั้น เราต้องเลือกจากเมนู File แล้วเลือก Open

    3. การสร้างไฟล์ใหม่

                การสร้างไฟล์ใหม่ให้เราเลือกจากเมนู File แล้วเลือก New

    4. การบันทึก

การบันทึกนั้น ทำได้โดยการเลือกเมนู File แล้วเลือก Save

    5. การออกจากโปรแกรม

                การออกจากโปรแกรม ทำได้โดยการเลือกที่เมนู File แล้วเลือก Exit

 

การใช้ Cross-32

                Cross-32 เป็นซอฟท์แวร์ตัวแปลภาษาแอสเซมบลี ที่สนับสนุน ชุดคำสั่งได้หลายแบบ ไม่ว่าจะเป็นของ Z80, Z180, MCS-51, 68HC05, 68HC11 ฯลฯ แต่ในที่นี้ขออธิบายเฉพาะ 68HC11 ก็แล้วกันครับ

                ผมขอแบ่ง การใช้เป็น 2 ส่วน คือ  โครงสร้างการเขียน และการสั่งให้แปลภาษา

 

    1. โครงสร้างการเขียน

                โครงสร้างของไฟล์ข้อมูล ที่ใช้กับ Cross-32 คือ  

;

; Filename  : hc11w01.asm

; Author    : Supachai Budsaratij

; Assembler : Cross-32 version 4

;

 

        CPU     "68HC11.TBL"

        HOF     "MOT8"

        ORG     0000H   ; Data memory (128Bytes)

 

        ORG     0F800H  ; Start point (for 68HC811E2)

MAIN:

 

END_LOOP:

        BRA     END_LOOP

 

        ORG     0FFFEH  ; Reset vector

        DFB     0F8h,00h

 

        END  

ก่อนที่จะทำการคอมไพล์โปรแกรม เรามาทำความรู้จักกับส่วนต่างๆ ของโค้ดที่เราเขียนกันก่อนดีกว่าครับ

           1.1 คำอธิบายโปรแกรม (Comment)

                ส่วนนี้เป็นการอธิบายโปรแกรม ดังนั้น ในขั้นตอนการแปล ตัว Cross-32 จะไม่นำมันมาแปลความ การสร้างคำอธิบายนั้น ทำได้โดยใช้เครื่องหมาย ; นำหน้า แล้ว ข้อความที่ต่อจากเครื่องหมายนี้จนหมดบรรทัดนั้นๆ จะถือว่าเป็น คำอธิบายของโปรแกรม

            1.2 กำหนดประเภทของ CPU

                เนื่องจาก Cross-32 เป็นตัวแปลภาษาที่รองรับการแปลชุดคำสั่งได้หลายประเภท ดังนั้น เราต้องกำหนดว่าขณะนี้กำลังจะทำการแปลคำสั่งของโปรเซสเซอร์ประเภทใด ดังนั้น การที่เราสั่งงานไปว่า CPU  “68HC11.TBL” จึงมาความหมายว่า ให้ทำการแปลตามตารางชุดคำสั่งของไมโครคอนโทรลเลอร์รุ่น 68HC11

            1.3 กำหนดประเภทของไฟล์ปลายทาง (HOF : Hexadecimal Output Format)

                จากเหตุผลเดียวจากข้อก่อนหน้านี้ เนื่องจากโปรเซสเซอร์นั้นมีทั้งรุ่น 8 บิต, 16 บิต และ 32 บิต ดังนั้น เราต้องกำหนดด้วยว่า ไฟล์ผลลัพธ์นั้น ให้จัดอยู่ในรูปแบบอะไร การที่เราสั่งว่า HOF  “MOT8” จึงมีความหมายว่า ให้สร้างไฟล์ปลายทางในรูปแบบของ MOTOROLA Form และใช้กับโปรเซสเซอร์แบบ 8 บิต

            1.4 กำหนดจุดเริ่มต้นของโปรแกรม (ORG : Program Counter Origin Directive)

                คำสั่ง ORG เป็นการบอกให้ตัวแปลภาษารู้ว่า ชุดคำสั่งต่อไปนี้จะเริ่มต้นนับ เป็นค่าเท่าไร  ตัวอย่างเช่น เราสั่งว่า  

                        ORG  0F800h       

               ก็มีความหมายว่า คำสั่งตั้งแต่บรรทัดต่อไป จะเริ่มต้น ณ ตำแหน่งที่ F800 ในฐาน 16 (Cross-32 กำหนดว่า ตัวเลขฐานสิบหก จะต้องปิดท้ายตัวเลขด้วยตัวอักษร H หรือ h)

            1.5 เลเบิล (Label)

                เลเบิล (Label) เป็นชื่อที่เราใช้แทนตำแหน่งของหน่วยความจำ สาเหตุที่เราต้องตั้งเป็นชื่อเรียกเนื่องจากในการเขียนโปรแกรมภาษาแอสเซมบลี นั้น เราไม่นิยม  นับว่า คำสั่งแต่ละคำสั่งนั้น มีขนาดเท่าไร และจะถูกฝังอยู่ใน ณ ตำแหน่งใดของหน่วยความจำ ดังนั้น เราทำการอ้างอิงโดยใช้ชื่อแทนตำแหน่งของหน่วยความจำจริงแล้วยกหน้าที่นับนี้ให้เป็นหน้าที่ของตัวแปลภาษาแอสเซมบลี และก็เป็นหน้าที่ของแอสเซมเบลอร์ (Assembler : ตัวแปลภาษาแอสเซมบลี) แล้วในช่วงของการสร้างรหัสเครื่อง (Machine code) ตัว แอสเซมเบลอร์ก็จะนำค่าแอดเดรสนี้ไปแทนที่ ให้เราเองโดยอัตโนมัติ

                รูปแบบของเลเบิลนั้น มีอยู่ว่า จะต้องเป็นข้อความและปิดท้ายด้วยเครื่องหมาย  :

           1.6 DFB (Define Byte Directive)

                คำสั่ง DFB เป็นคำสั่งที่ทำให้แอสเซมเบลอร์ รู้ว่า ข้อมูลที่อยู่ต่อจาก DFB จะเป็นข้อมูลตัวเลขขนาด 8 บิต ดังนั้น การที่เราสั่งไปว่า DFB  0F8h, 00h จึงมีความหมายว่า ณ ตำแหน่ง FFFEh มีค่าเป็น F8 (ฐาน16) และที่ตำแหน่ง FFFFh มีค่าเป็น 0

           1.7 หมดไฟล์

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

             1.8 สรุป

                การเขียนโปรแกรมภาษแอสเซมบลีนั้น มีชื่อเรียกอีกอย่างหนึ่งว่า การเขียนโปรแกรมแบบบรรทัดคำสั่ง หมายความว่า การเขียนนั้นใช้ระบบ 1 บรรทัด เขียนเพียง 1 คำสั่ง  ดังนั้น สรุปได้ว่า ในแต่ละบรรทัดนั้น จะมีโครงสร้าง การเขียนได้ดังนี้  

Label:        operation            operand(s)           ;comment  

               

 โดยที่      Label:                    ก็คือ เลเบิล ที่ผมได้อธิบายไปแล้วในหัวข้อ 1.5

                Operation             ก็คือ ชุดคำสั่งของ CPU นั้น 

                Operand(s)          คือ ข้อมูลประกอบคำสั่ง ซึ่งจะต้องเขียนตามรูปแบบของชุดคำสั่งนั้นๆ (ดูได้จาก คู่มือชุดคำสั่ง)

                ;comment             ก็คือ ส่วนของคำอธิบาย (ดังที่กล่าวเอาไว้ในหัวข้อ 1.1)

 

    2. การสั่งให้แปลภาษา

ดังนั้น ไฟล์ที่ต้องใช้เวลาที่เราทำการคอมไพล์  (Compile) ก็คือ ไฟล์โค้ดที่เราเขียน (Source code) กับไฟล์ 68HC11.TBL เมื่อผู้อ่าน ทำการพิมพ์โปรแกรม เรียบร้อย (ผมบันทึกลงไฟล์ชื่อว่า  hc11w01.asm) ให้ทำการสั่งดังนี้

               C32D4CL hc11w01.asm -H hc11w01.HEX

             หลังจากทำการคอมไพล์เสร็จแล้ว เราจะได้ไฟล์เพิ่มเข้ามาอีก 1 ไฟล์นั่นคือ ไฟล์ที่ชื่อว่า hc11w01.hex ซึ่งเป็นไฟล์ฐานสิบหก ที่เราจะใช้ อัพโหลด ลงบอร์ดทดลองของเรา ซึ่งจากตัวอย่างนี้ เราจะได้ HEX File มีข้อมูลดังนี้

                      S105F80020FEE4

S105FFFEF80005

S9030000FC

นอกจากนี้ Cross-32 ยังสามารถสร้างไฟล์ List ได้อีกด้วย ซึ่งไฟล์ List นี้จะบอกรายละเอียดของการแปลได้ดีกว่าไฟล์ฐานสิบหก ทั้งนี้เพราะเรานิยมใช้ไฟล์ List เป็นข้อมูลบอกรายละเอียดว่า คำสั่งที่เราเขียนนั้น เมื่อถูกแปลเป็นรหัสเครื่องแล้ว มีค่าเท่าไร การสั่งให้สร้างไฟล์ List นั้นทำได้โดยสั่งว่า

                        C32D4CL hc11w01.asm –L hc11w01.lst

ข้อมูลในไฟล์จะเป็นดังนี้

                        ;

                        ; Filename  : hc11w01.asm

                        ; Author    : Supachai Budsaratij

                        ; Assembler : Cross-32 version 4

                        ;

                       

 0000                           CPU     "68HC11.TBL"

 0000                           HOF     "MOT8"

 0000                           ORG     0000H   ; Data memory (128Bytes)

                       

 F800                           ORG     0F800H  ; Start point (for 68HC811E2)

 F800                   MAIN:

                       

 F800                   END_LOOP:

 F800 20FE                      BRA     END_LOOP

                       

 FFFE                           ORG     0FFFEH  ; Reset vector

 FFFE F800                      DFB     0F8h,00h

                       

 0000                           END

 F800  END_LOOP           F800  MAIN       

                หรือจะสั่งครั้งเดียวแต่สร้างทั้งสองไฟล์เลยก็ได้ วิธีการก็คือสั่งว่า                           

            C32D4CL  hc11w01.asm –H hc11w01.hex –L hc11w01.lst

 

การอัพโหลดลงบอร์ด

                และแล้วเราก็มาถึงขั้นตอนสุดท้ายของบทความตอนนี้กันแล้วล่ะครับ นั่นคือเราจะนำไฟล์ฐานสิบหก ส่งไปบันทึกลงใน EEPROM ของบอร์ดทดลอง โปรแกรมที่ใช้ อัพโหลด (Upload เป็นการส่งไฟล์จากเครื่องเราไปยังอีกเครื่องหนึ่ง) คือ เรียกใช้โปรแกรมสำหรับทำการ upload ซึ่งผมก็ใช้โปรแกรมที่แถมมากับชุด EXP4 LAB 1 MCU โปรแกรมนี้จะมีชื่อว่า dl6811e2.exe

                รูปแบบการใช้ก็เป็นดังนี้ครับ  

DL6811E2  ชื่อไฟล์  /1

DL6811E2  ชื่อไฟล์  /2  

               คำสั่งแรกเป็นการอัพโหลดโดยใช้พอร์ต COM1 และคำสั่งที่ 2 เป็นการใช้ COM2

                ก่อนที่เราจะทำการอัพโหลดนั้น เราต้องทำการ Reset ให้บอร์ดพร้อมสำหรับการรับไฟล์เสียก่อน วิธีการทำก็คือ กดปุ่ม Load ค้างเอาไว้ แล้วกดปุ่ม Reset หลังจากนั้นก็ปล่อยปุ่ม Reset เพียงเท่านี้บอร์ดทดลองของเราก็พร้อมที่จะรับไฟล์ฐานสิบหกที่เราจะส่งไปแล้วล่ะ

                เมื่อบอร์ดพร้อมเราก็เหลือเพียงส่งข้อมูลใช่ไหม จะรอช้าทำไมล่ะ ส่งเลยเถอะครับ คำสั่งคือ

                                DL6811E2   hc11w01.hex  /1

                หรือ

                                DL6811E2  hc11w01.hex  /2

                 เมื่อส่งเสร็จ (ไม่มีการร้องโวยวายใดๆ จากโปรแกรม DL6811E2) ขั้นตอนสุดท้ายของเราคือ ทำการ Reset อีกครั้ง (กดปุ่ม Reset แล้วปล่อย) โปรแกรมของเราก็จะเริ่มทำงานล่ะครับ อ๊ะๆ แต่โปรแกรมที่เราเขียนนั้นมันไม่ได้ทำอะไรเลย ดังนั้น ก็เลยไม่มีอะไรเกิดขึ้น ถือซะว่าเป็นการซ้อมมือไปก่อนล่ะกัน ... (ฮา)

 

สรุป

                จากบทความตอนนี้ ผมหวังเอาไว้ว่า ผู้อ่านคงได้มองเห็นภาพ ขั้นตอนการพัฒนาระบบโดยใช้ 68HC811E2 กันมากขึ้น ในตอนต่อไป เราจะศึกษาถึง สิ่งที่เราต้องใช้ประกอบ การเขียนโปรแกรมกันต่อครับ นั่นคือ คำสั่งที่เกี่ยวข้องการกับ ส่งข้อมูลไปที่ LED ทั้งนี้เพราะ บอร์ด 68HC811E2 ปกติ จะไม่มีการแสดงผลใดนอกจากส่งกลับไปที่พอร์ตสื่อสารแบบ RS232  แต่จะเป็นการยุ่งยากมากขึ้น เพราะ เราต้องใช้พอร์ต RS232 ในการอัพโหลดโปรแกรมจากเครื่องของเราไปยังบอร์ดทดลอง ผมจึงเลือกให้ใช้วงจรขับ LED เป็นอุปกรณ์ แสดงผลลัพธ์ของการทำงานในโปรแกรม

                รู้สึกว่า บทความตอนนี้จะยาวกว่าบทความแรกมากเลยทีเดียวครับ แล้วพบกันใหม่ตอนหน้าครับ ...

  


เขียนโดย : ศุภชัย  บุศราทิจ
Author : Supachai  Budsaratij
วันที่ทำการปรับปรุง : ๒๘ ก.ย. ๒๕๔๕