การเขียน ภาษา 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
ซึ่งบอร์ด Arduino UNO นั้น ใช้ IC ไมโครคอนโทรลเลอร์ เบอร์ ATmega328P ของ บริษัท Atmel ที่ Device Family : จึงเลือกเป็น ATmega -> ATmega328P -> OK
โปรแกรมจะสร้าง ไฟล์โค้ด main.asm ให้โดยอัตโนมัติ
3 : เขียนโค้ดภาษา Assembly
โค้ดตัวอย่างเป็นการทำให้ LED ที่อยู่บนบอร์ด Arduino Uno ที่ขา D13 หรือขา PB5 ของ ATmega328P กระพริบได้ จากการหน่วงเวลา
เขียนโปรแกรมตามโค้ดด้านล่างนี้
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
แม้ว่าโปรแกรมหลักจะค่อนข้างเข้าใจง่าย แต่ก็อาจไม่ชัดเจนว่าฟังก์ชัน 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
โปรแกรมจะสร้าง ไฟล์โค้ด uno_assy.hex ที่โฟลเดอร์ Output Files ให้โดยอัตโนมัติ
.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 ในฮาร์ดแวร์จริง สําเร็จแล้ว