การใช้งาน Atmel Studio 7 กับ Arduino UNO ด้วยภาษา C
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 : สร้างโปรเจคสำหรับเขียนโค้ดภาษา C
เมื่อเปิดโปรแกรม Atmel Studio 7.0 ขึ้นมา ให้คลิกที่เมนู File -> New -> Project..
เลือกเป็น C/C++ -> GCC C Executable Project – ตั้งชื่อโปรเจค เป็น uno_c -> OK
ซึ่งบอร์ด Arduino UNO นั้น ใช้ IC ไมโครคอนโทรลเลอร์ เบอร์ ATmega328P ของ บริษัท Atmel ที่ Device Family : จึงเลือกเป็น ATmega -> ATmega328P -> OK
โปรแกรมจะสร้าง ไฟล์โค้ด main.c ให้โดยอัตโนมัติ
3 : เขียนโค้ดภาษา C
โค้ดตัวอย่างเป็นการทำให้ LED ที่อยู่บนบอร์ด Arduino Uno ที่ขา D13 หรือขา PB5 ของ ATmega328P กระพริบได้ ด้วยการหน่วงเวลา หรือเว้นระยะ จะใช้วิธีที่เรียกว่า Software Delay Loop
จากรูปด้านบน การเขียนโค้ดกำหนดขาของ Arduino UNO โซนสีม่วง ขาที่ 8 ถึง 13 ได้ดังนี้
- ขา 8 เขียนเป็น 0B000001 // PORTB0
- ขา 9 เขียนเป็น 0B000010 // PORTB1
- ขา 10 เขียนเป็น 0B000100 // PORTB2
- ขา 11 เขียนเป็น 0B001000 // PORTB3
- ขา 12 เขียนเป็น 0B010000 // PORTB4
- ขา 13 เขียนเป็น 0B100000 // PORTB5
เขียนโปรแกรมตามโค้ดด้านล่างนี้
#define F_CPU 16000000
#define BLINK_DELAY_MS 1000
#include <avr/io.h>
#include <util/delay.h>
int main (void)
{
// Arduino digital pin 13 (pin 5 of PORTB) for output
DDRB |= 0B100000; // PORTB5
while (1) {
// turn LED on
PORTB |= 0B100000; // PORTB5
_delay_ms(BLINK_DELAY_MS);
// turn LED off
PORTB &= ~ 0B100000; // PORTB5
_delay_ms(BLINK_DELAY_MS);
}
}
คอมไพล์โค้ด โดย คลิก Build -> Build Solution
โปรแกรมจะสร้าง ไฟล์โค้ด uno_c.hex ที่โฟลเดอร์ Output Files ให้โดยอัตโนมัติ
.hex คือไฟล์รหัสภาษาเครื่อง (machine code) เป็นไฟล์ต้นฉบับเลขฐานสิบหกที่มักใช้โดยอุปกรณ์ลอจิกที่โปรแกรมได้เช่นไมโครคอนโทรลเลอร์ มันมีการตั้งค่าข้อมูลการกำหนดค่าหรือข้อมูลอื่น ๆ ที่บันทึกในรูปแบบเลขฐานสิบหก
ซึ่งสามารถนำไปใช้โปรแกรมบอร์ด Arduino Uno เพื่อทดสอบการทำงานของโค้ดในฮาร์ดแวร์จริงได้
แสดงตำแหน่งไฟล์ uno_c.hex
4 : อธิบายโค้ด
กำหนดให้คอนโทรลเลอร์ทำงานที่ความถี่ 16MHz เพราะ Arduino UNO ใช้คริสตัล 16Mhz เป็นแหล่งสัญญาณนาฬิกา
#define F_CPU 16000000
กำหนดให้ BLINK_DELAY_MS มีค่าเท่ากับ 1000 มิลลิวินาที
#define BLINK_DELAY_MS 1000
เรียกใช้งานคำสั่งใน io.h ซึ่งอยู่ในโฟลเดอร์ avr สำหรับควบคุมอินพุท/เอาท์พุท (เช่น PORTD, DDRD)
#include <avr/io.h>
เรียกใช้งานคำสั่งเกี่ยวกับการหน่วงเวลา ที่อยู่ในไฟล์ delay.h ในโฟลเดอร์ util
#include <util/delay.h>
ฟังก์ชั่น main จะเป็นฟังชั่นแรกที่โปแกรมเริ่มทำงาน ดังนั้นจึงเป็นฟังก์ชั่นบังคับ
int main (void)
กำหนดให้ขา PฺฺB5 หรือขา 13 ของบอร์ด Arduino ทำหน้าที่เอาท์พุท
DDRB |= 0B100000; // PORTB5
ทำงานไปเรื่อยๆ จนกว่าเงื่อนไขจะเป็นเท็จ คือจะวนลูปไปเรื่อยๆ
while (1)
ส่งลอจิก 1 ไปที่ขา PB5 หรือขา 13 ของบอร์ด Arduino ให้เป็น HIGH
PORTB |= 0B100000; // PORTB5
หน่วงเวลารอ 1000 มิลลิวินาที ตามค่า BLINK_DELAY_MS ที่กำหนดไว้
_delay_ms(BLINK_DELAY_MS);
ส่งลอจิก 0 ไปที่ขา PB5 หรือ ให้ขา 13 ของบอร์ด Arduino ให้เป็น LOW
PORTB &= ~ 0B100000; // PORTB5
หน่วงเวลารอ 1000 มิลลิวินาที ตามค่า BLINK_DELAY_MS ที่ประกาศไว้
_delay_ms(BLINK_DELAY_MS);
รายละเอียดเพิ่มเติมเกี่ยวกับโปรแกรม
โปรแกรมข้างต้นเรียกใช้นิยามชื่อรีจีสเตอร์ (PORTB, DDRD ฯลฯ) จากไฟล์เฮดเดอร์ avr/io.h และฟังก์ชันหน่วงเวลา _delay_ms() จากไฟล์เฮดเดอร์ util/delay.h
ตัวเลขที่นำหน้าด้วย 0b ในโค้ดภาษาซีเป็นการบอกให้คอมไพเลอร์ตีความค่าตัวเลขที่ตามมาให้เป็นตัวเลขฐานสอง นอกจากเลขฐานสองแล้วภาษาซียังรองรับการระบุค่าจำนวนเต็มคงที่ในรูปฐานแปด (ขึ้นต้นด้วย 0) และฐานสิบหก (ขึ้นต้นด้วย 0x)
การคอมไพล์โปรแกรมให้เป็นภาษาเครื่อง
กระบวนการแปลโปรแกรมภาษาชั้นสูงให้เป็นภาษาเครื่องนั้นเรียกว่าเป็นการคอมไพล์ (compile) ซึ่งอาศัยโปรแกรมที่เรียกว่าคอมไพเลอร์ (compiler) เป็นตัวดำเนินการ เราอาศัยโปรแกรม avr-gcc
เป็นตัวคอมไพเลอร์
5 : อัพโหลดไฟล์ .hex ไปยังบอร์ด Arduino UNO
การอัพโหลดที่แนะนำมี 2 วิธีคือ
5.1 : อัพโหลดโค้ดผ่าน Arduino IDE
โดยทำตามขั้นตอนลิงค์ด้านล่าง
5.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 บนบอร์ด กระพริบ ติด-ดับ แสดงว่า การทดสอบการทำงานของโค้ด ภาษา C ในฮาร์ดแวร์จริง สําเร็จแล้ว