การเขียน ภาษา Assembly กับ Arduino Uno ATmega328P


ภาษา Assembly คือ ภาษาที่ใช้ในการเขียนโปรแกรมภาษาหนึ่ง ซึ่งจะทำงานโดยขึ้นกับรุ่นของไมโครโพรเซสเซอร์ หรือหน่วยประมวลผล (CPU) ของเครื่องคอมพิวเตอร์ การใช้ภาษาแอสเซมบลีจำเป็นต้องผ่านการแปลภาษาด้วยคอมไพเลอร์เฉพาะเรียกว่า แอสเซมเบลอร์ (Assembler)

ภาษาแอสเซมบลี จัดอยู่ในภาษาระดับต่ำ และเป็นภาษาที่พัฒนาต่อมาจากภาษาเครื่องในปี ค.ศ. 1952 ภาษาแอสเซมบลีมีความใกล้เคียงกับภาษาเครื่องมาก คือ 1 คำสั่งของภาษาแอสเซมบลีจะเท่ากับ 1 คำสั่งของภาษาเครื่อง โดยที่ภาษาแอสเซมบลีจะเขียนคำสั่งเป็นตัวอักษรภาษาอังกฤษ เพื่อใช้แทนคำสั่งภาษาเครื่อง ทำให้นักเขียนโปรแกรมสามารถเขียนโปรแกรมได้ง่ายขึ้น โดยการจดจำรหัสคำสั่งสั้นๆ ที่จำได้ง่าย ซึ่งเรียกว่า นิวมอนิกโค้ด ( Mnemonic code)

การใช้งาน Atmel Studio 7 กับ Arduino UNO ด้วยภาษา Assembly


Atmel Studio 7.0 คือ integrated พัฒนาการแพลตฟอร์ม (IDP) สำหรับการพัฒนาและดีบั๊กโปรแกรม Atmel ARM® Cortex™-M และ Atmel AVR® microcontroller-(MCU-) ซึ่งจะประกอบไปด้วย GCC C และ C++ Compiler (ที่ใช้แปลงภาษาซี ให้เป็น Machine Code), Assembly (ที่ใช้แปลงภาษาแอสแซมบลี ให้เป็น Machine Code) และ simulator บรรจุมาอยู่แล้ว

ขั้นตอนการทํางาน


1 : ติดตั้ง Atmel Studio 7.0


ดาวน์โหลดซอฟต์แวร์ Atmel Studio 7.0 ได้ที่ :


การติดตั้งเหมือนกับโปรแกรมทั่วๆไป



2 : สร้างโปรเจคสำหรับเขียนโค้ดภาษา Assembly


เมื่อเปิดโปรแกรม Atmel Studio 7.0 ขึ้นมา ให้คลิกที่เมนู File -> Project..


เลือกเป็น Assembler -> AVR Assembler Project – ตั้งชื่อโปรเจค เป็น uno_assy -> OK

การเขียน ภาษา Assembly กับ Arduino Uno ATmega328P


ซึ่งบอร์ด Arduino UNO นั้น ใช้ IC ไมโครคอนโทรลเลอร์ เบอร์ ATmega328P ของ บริษัท Atmel ที่ Device Family : จึงเลือกเป็น ATmega -> ATmega328P -> OK



การใช้งาน Atmel Studio 7 กับ Arduino UNO ด้วยภาษา C



โปรแกรมจะสร้าง ไฟล์โค้ด main.asm ให้โดยอัตโนมัติ

การเขียน ภาษา Assembly กับ Arduino Uno ATmega328P



3 : เขียนโค้ดภาษา Assembly


โค้ดตัวอย่างเป็นการทำให้ LED ที่อยู่บนบอร์ด Arduino Uno ที่ขา D13 หรือขา PB5 ของ ATmega328P กระพริบได้ จากการหน่วงเวลา

Arduino UNO

เขียนโปรแกรมตามโค้ดด้านล่างนี้ 

main:
   sbi 0x04, 5       ; PORTB5 output
 loop:               ; main loop begin
   sbi 0x05, 5       ; PORTB5 high
   call delay_1000ms ; delay 1s
   cbi 0x05, 5       ; 5 PORTB5 low
   call delay_1000ms ; delay 1s
   rjmp  loop        ; main loop
 delay_1000ms:       ; subroutine for 1s delay
                     ; initialize counters
   ldi r18, 0xFF     ; 255
   ldi r24, 0xD3     ; 211
   ldi r25, 0x30     ; 48
 inner_loop:
   subi  r18, 0x01   ; 1
   sbci  r24, 0x00   ; 0
   sbci  r25, 0x00   ; 0
   brne  inner_loop
   ret


การเขียน ภาษา Assembly กับ Arduino Uno ATmega328P


แม้ว่าโปรแกรมหลักจะค่อนข้างเข้าใจง่าย แต่ก็อาจไม่ชัดเจนว่าฟังก์ชัน delay_1000ms ทำงานอย่างไร งานของฟังก์ชันหน่วงเวลาหนึ่งวินาทีเป็นหลักเพื่อให้ CPU ไม่ว่างเป็นเวลา 16 ล้านรอบนาฬิกา

คำแนะนำสาม ldi แรก (“ โหลดค่าคงที่ 8 บิตโดยตรงเพื่อลงทะเบียน 16 ถึง 31”) คำแนะนำใช้เวลาทั้งหมดสามรอบ

subi ใช้เวลาหนึ่งรอบเช่นกันและ“ ลบรีจิสเตอร์และค่าคงที่และวางผลลัพธ์ในรีจิสเตอร์ปลายทาง Rd.” ค่าคงที่คือ 0x01 ในข้อมูลโค้ดและเวลาดำเนินการจะเป็นอีกครั้งหนึ่งรอบนาฬิกา

คำสั่ง sbci สองคำต่อไปนี้ “ลบค่าคงที่ออกจากรีจิสเตอร์และลบด้วยแฟล็ก C และวางผลลัพธ์ในรีจิสเตอร์ปลายทาง Rd” ค่าคงที่คือ 0x00 ในทั้งสองกรณีดังนั้นสิ่งเดียวที่ถูกลบออกคือค่าสถานะ C อย่างไรก็ตามค่าสถานะ C จะถูกตั้งค่าก็ต่อเมื่อการลบก่อนหน้านี้ส่งผลให้เกิด underflow ()

สุดท้ายคำสั่ง brne“ […] ทดสอบ Zero Flag (Z) และแตกแขนงไปยังพีซีถ้าล้าง Z” การดำเนินการนี้จะใช้เวลาสองรอบหากแตกกิ่งก้านหรือหนึ่งรอบ


คอมไพล์โค้ด โดย คลิก Build -> Build Solution

การเขียน ภาษา Assembly กับ Arduino Uno


การเขียน ภาษา Assembly กับ Arduino Uno


โปรแกรมจะสร้าง ไฟล์โค้ด uno_assy.hex ที่โฟลเดอร์ Output Files ให้โดยอัตโนมัติ


การเขียน ภาษา Assembly กับ Arduino Uno

.hex คือไฟล์รหัสภาษาเครื่อง (machine code)  เป็นไฟล์ต้นฉบับเลขฐานสิบหกที่มักใช้โดยอุปกรณ์ลอจิกที่โปรแกรมได้เช่นไมโครคอนโทรลเลอร์ มันมีการตั้งค่าข้อมูลการกำหนดค่าหรือข้อมูลอื่น ๆ ที่บันทึกในรูปแบบเลขฐานสิบหก


ซึ่งสามารถนำไปใช้โปรแกรมบอร์ด Arduino Uno เพื่อทดสอบการทำงานของโค้ดในฮาร์ดแวร์จริงได้

แสดงตำแหน่งไฟล์ uno_assy.hex

4 : อัพโหลดไฟล์ .hex ไปยังบอร์ด Arduino UNO

การอัพโหลดที่แนะนำมี 2 วิธีคือ


4.1 : อัพโหลดโค้ดผ่าน Arduino IDE

โดยทำตามขั้นตอนลิงค์ด้านล่าง


4.2 : อัพโหลดโค้ดผ่าน XLoader


ติดตั้ง XLoader โดยดาวน์โหลดซอฟต์แวร์ XLoader ได้ที่ :


เมื่อดาว์นโหลดไฟล์เสร็จแล้ว คลายไฟล์ แล้วคลิกเปิดไฟล์ XLoader

คลิก … เลือกไฟล์ .hex ที่ได้จากขั้นตอนที่ 3

คลิก Open

Device เลือกเป็น Uno(ATmega328)


เชื่อมต่อสาย USB จาก คอมพิวเตอร์ ไปที่บอร์ด Arduino UNO


คลิกขวา ที่ Start เลือกไปที่ Device Manager



ไปที่ Ports (COM & LPT) จะพบ Arduino Uno ในตัวอย่างเป็น (COM3) แสดงว่าคอมพิวเตอร์ของเราสามารถ ติดต่อสื่อสารกับ บอร์ด Arduino Uno ได้แล้ว


ที่ COM port เลือก ตามรูปด้านบนในตัวอย่างคือ COM3 (COM แต่ละเครื่องไม่เหมือนกันให้เลือก COM ตามที่ปรากฏ)


คลิก Upload


ถ้าอัพโหลดได้สำเร็จจะแสดง uploaded


ไฟ LED ที่เชื่อมต่อที่ขา PB5 บนบอร์ด กระพริบ ติด-ดับ แสดงว่า การทดสอบการทำงานของโค้ด Assembly ในฮาร์ดแวร์จริง สําเร็จแล้ว



5 : อุปกรณ์ที่ใช้

Leave a Reply

Your email address will not be published. Required fields are marked *

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

Privacy Preferences

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

Allow All
Manage Consent Preferences
  • Always Active

Save