จาก Atmel AVR Studio ไปสู่ Microchip MPLAB-X IDE
โดยปรกติแล้ว การเขียนโปรแกรมไมโครคอนโทรลเลอร์ Arduino เช่น Uno / Nano ก็มี Arduino IDE เป็นซอฟต์แวร์ให้เลือกใช้งานกัน และใช้งานได้สะดวก แต่ถ้าเราจะเขียนโค้ดภาษา C สำหรับ AVR 8-bit MCU เรายังมีตัวเลือกอื่น เช่น การใช้งาน Atmel AVR Studio 7 แต่เนื่องจากว่า บริษัท Atmel ได้กลายเป็นส่วนหนึ่งของบริษัท Microchip ไปแล้วตั้งแต่ปี ค.ศ. 2016 และทางบริษัทก็แนะนำให้ใช้ MPLAB-X IDE รวมถึง C/C++ Compiler Toolchains ที่เกี่ยวข้อง เป็นตัวเลือกใหม่สำหรับนักพัฒนา นอกจากนั้นยังมี MPLAB Xpress Cloud-based IDE ที่ใช้งานผ่าน Web Browser ในระบบคลาวด์ได้ด้วย
การติดตั้งซอฟต์แวร์ MPLAB-X IDE และ XC8 Compiler
ถ้ายังไม่มี MPLAB-X IDE และ XC8 Compiler ติดตั้งไว้ในคอมพิวเตอร์ ก็ให้ดาวน์โหลดและติดตั้งไปตามขั้นตอน (ในบทความนี้ เลือกใช้สำหรับระบบปฏิบัติการ Windows 10)
- MPLAB-X IDE: https://www.microchip.com/mplab/mplab-x-ide
- MPLAB-XC Compilers: https://www.microchip.com/mplab/compilers
ข้อสังเกต: ในการติดตั้งซอฟต์แวร์ MPLAB-X IDE จะมีให้เลือกว่า ต้องการใช้สำหรับไมโครคอนโทรลเลอร์ตระกูลใดบ้าง ซึ่งจำแนกเป็น 8 บิต 16 บิต และ 32 บิต ตามลำดับ ถ้าเลือกทั้งหมด จะต้องใช้พื้นที่ในฮาร์ดแวร์ดิสค่อนข้างมาก
เมื่อติดตั้งเสร็จแล้ว จะมีข้อความที่แนะนำให้ติดตั้งและใช้งานซอฟต์แวร์อื่นอีกที่เกี่ยวข้อง
เนื่องจากเราจะใช้งาน ATmega328P ถัดไปก็ให้ติดตั้ง XC8 Compiler เพื่อใช้งานร่วมกับ MPLAB-X IDE
ให้เลือกประเภทของ License เป็นแบบ Free
หลังจากการติดตั้งซอฟต์แวร์แล้ว ก็เปิดใช้งาน MPLAB-X IDE เพื่อเข้าสู่หน้าต่างหลัก
เริ่มต้นสร้างโปรเจกต์ใหม่ โดยเลือกประเภท “Standalone Project”
เลือก Device ที่จะใช้งานเป็น 8-bit AVR MCUs
ถัดไปเป็นการเลือกใช้ Tool สำหรับการดีบักและโปรแกรมไฟล์ไปยังบอร์ดไมโครคอนโทรลเลอร์ (ซึ่งมีหลายตัวเลือก เช่น Microchip PICKit 4, Microchip SNAP, J-Link) แต่ในกรณีนี้ให้เราเลือก Simulator ซึ่งจะสามารถจำลองการทำงานของโค้ดได้
ถัดไปให้เลือก Compiler Toolchains ที่จะใช้งาน ซึ่งในกรณีคือ XC8
ในกรณีที่ติดตั้ง XC8 Compiler ไว้แล้ว แต่ MPLAB-X IDE ตรวจสอบไม่พบ ก็สามารถตั้งค่าเองได้
ไปที่เมนู Tools > Options แล้วเลือก Embedded > Build Tools แล้วเพิ่มรายการ PATH สำหรับ Toolchain
ตั้งชื่อสำหรับโปรเจกต์ใหม่ และระบุ Folder สำหรับโปรเจกต์ดังกล่าว
กลับสู่หน้าต่างหลัก เมื่อสร้างโปรเจกต์ใหม่เสร็จแล้ว
ถัดไปให้สร้างไฟล์ main.c
และเพิ่มเข้าไว้ในโปรเจกต์ เพื่อทดลองโค้ดตัวอย่าง
โค้ดตัวอย่างเป็นการทำให้วงจร LED ที่อยู่บนบอร์ด Arduino Nano ที่ขา D13 (Arduino Pin) หรือขา PB5 ของ ATmega328P กระพริบได้ การหน่วงเวลา หรือเว้นระยะ จะใช้วิธีที่เรียกว่า Software Delay Loop
#include <xc.h>void sw_delay( uint32_t n) {
for (uint32_t i=0; i < n; i++) {
asm("nop");
}
}
void main(void) {
DDRB |= (1 << 5); // PB5 pin as output
while(1) {
PORTB |= (1<<5); // output high to PB5 pin
sw_delay( 100000ul );
PORTB &= ~(1<<5); // output low to PB5 pin
sw_delay( 100000ul );
}
return;
}
หรือจะลองใช้โค้ดตัวอย่างนี้ที่มีการเรียกใช้ฟังก์ชันสำหรับ AVR ดังนี้
#define F_CPU 16000000UL#include <xc.h>
#include <avr/io.h>
#include <util/delay.h>void main(void) {
DDRB |= (1 << 5); // PB5 pin as output
while(1) {
PORTB |= (1<<5); // output high to PB5 pin
_delay_ms(100);
PORTB &= ~(1<<5); // output low to PB5 pin
_delay_ms(100);
}
return;
}
เมื่อนำโค้ดตัวอย่างไปใส่ลงในไฟล์ main.c
แล้วบันทึก จากนั้นลองคอมไพล์โค้ด โดยทำขั้นตอน Build Main Project
ถ้าคอมไพล์โค้ดได้สำเร็จแล้ว และกดดูที่ Tab ชื่อ Files (ถัดจาก Projects) เราจะมองเห็นไฟล์ .hex
ซึ่งไฟล์นี้เราสามารถนำไปโปรแกรมลงบอร์ดไมโครคอนโทรลเลอร์ได้
ลองมาจำลองการทำงานของโค้ดดูบ้าง โดยใช้ Simulator ความถี่ของ CPU Clock ที่มีการตั้งไว้เป็น Default คือ 1 MHz
เราจะมาลองดูการเลือกบรรทัดในโค้ด เพื่อใช้เป็น Breakpoints และมีการเลือกตัวแปรแบบ Global หรือตัวแปรสำหรับ SFR (Special Function Register) ของ ATmgea328P เพื่อดูการเปลี่ยนแปลงเมื่อโปรแกรมทำงาน โดยเลือก PORTB เป็นตัวอย่าง เพราะเกี่ยวข้องกับสถานะการทำงานของขา PB5 ที่เราใช้เป็นขาเอาต์พุตสำหรับ LED ในตัวอย่างนี้
เมื่อเราเลือก Debug Tool เป็น Simulator เราจึงใช้วิธีดีบักแบบซอฟต์แวร์ และไม่ได้ใช้อุปกรณ์ฮาร์ดแวร์ประเภท In-Circuit Debugger / Programmer
ให้ลองเลือกบรรทัดในโค้ดสำหรับ Breakpoints ตามรูปตัวอย่าง ซึ่งมีสองตำแหน่ง (จะเห็นแถบสีของบรรทัดดังกล่าว)
ถัดไป จากเมนู Debug > New Watch เลือกตัวแปรประเภท SFR เพื่อดูค่าของตัวแปรดังกล่าว
เมื่อทำขั้นตอน Debug Main Project แล้วหลังจากนั้น จะเห็นได้ว่า มีการทำคำสั่งและมาหยุดที่ Breakpoint ตำแหน่งแรก และถ้าเรากดปุ่ม Continue ก็จะทำคำสั่งต่อ และจะไปหยุดอยู่ที่ Breakpoint ถัดไป นอกจากนั้นยังสังเกตเห็นการเปลี่ยนแปลงค่าของ PORTB
จาก 0x00
เป็น 0x20
การโปรแกรมไฟล์ .hex ไปยังบอร์ด Arduino Nano
ในขั้นตอน Build Project เราจะได้ไฟล์ .hex ซึ่งสามารถนำไปใช้โปรแกรมบอร์ด Arduino Uno / Nano เพื่อทดสอบการทำงานของโค้ดในฮาร์ดแวร์จริงได้
ในกรณีนี้ จะเลือกใช้อุปกรณ์เสริมคือ USBasp Programmer ซึ่งมีราคาถูก เชื่อมต่อกับพอร์ต USB ของคอมพิวเตอร์ ส่วนอีกปลายด้านหนึ่งของอุปกรณ์นี้ จะต้องต่อสายไฟจากคอนเนกเตอร์ ICSP แบบ 2x5 Pins ไปยังคอนเนกเตอร์แบบ 2x3 Pins บนบอร์ด Arduino
ในกรณีที่มีปัญหา Windows USB Driver สำหรับอุปกรณ์ USBasp ให้ศึกษาขั้นตอนจากเว็บนี้
ซอฟต์แวร์ที่ใช้ร่วมกับอุปกรณ์ USBasp คือ โปรแกรม AVRdude ซึ่งมาพร้อมกับ Arduino IDE ดังนั้นจึงต้องติดตั้งซอฟต์แวร์ดังกล่าวด้วย และเพื่อความสะดวกในการใช้งาน ได้เขียนคำสั่งไว้ในไฟล์ nano_usbasp.bat
ดังนี้ (อ้างอิงจากเอกสารนี้)
@echo OFF
set ARDUINO_TOOLS_PATH="C:\Users\%USERNAME%\AppData\Local\Arduino15\packages\arduino\tools"
%ARDUINO_TOOLS_PATH%\avrdude\6.3.0-arduino17\bin\avrdude.exe ^
-C%ARDUINO_TOOLS_PATH%\avrdude\6.3.0-arduino17\etc\avrdude.conf ^
-v -patmega328p -cusbasp -Pusb -Uflash:w:%1:i
ข้อสังเกต: ตัวเลขเวอร์ชันของ avrdude อาจมีการเปลี่ยนแปลงตามการอัพเดทซอฟต์แวร์สำหรับ Arduino
ตัวอย่างการมทำคำสั่งโดยใช้ไฟล์ nano_usbasp.bat
ซึ่งจะต้องระบุ PATH และไฟล์ .hex
ที่อยู่ในโปรเจกต์ของ MPLAB-X
ข้อสังเกต: การโปรแกรมไฟล์ .hex
จะทำให้ Arduino Bootloader ของ Arduino Nano ถูกเขียนทับ แต่ก็สามารถโปรแกรมลงไปใหม่ได้ โดยใช้ Arduino IDE + USBasp
การใช้งาน MPLAB-X IDE (Cloud-based)
นอกเหนือจากการติดตั้งและใช้งานแบบ Desktop แล้ว เราสามารถใช้แบบออนไลน์ได้ ผ่านเว็บเบราว์เซอร์ในระบบ Cloud
การสร้างโปรเจกต์และเขียนโค้ด ก็เหมือนแบบ Desktop และสามารถดาวน์โหลดไฟล์ .hex
ได้เมื่อทำขั้นตอน Build Project แล้ว
อีกความสามารถหนึ่งที่น่าสนใจคือ ถ้าใช้อุปกรณ์ PICKit4 ของ Microchip แล้วเชื่อมต่อกับบอร์ดไมโครคอนโทรลเลอร์เอาไว้ เราสามารถเชื่อมต่อผ่าน Web Browser ไปยังอุปกรณ์ PICKit4 และบอร์ดไมโคร ฯ ผ่านทางพอร์ต USB ได้เลย แต่จะต้องใช้โปรแกรมของ Microchip เป็นตัวช่วย ซึ่งมีชื่อว่า MPLAB Xpress USB Bridge (ใช้ JRE ในการทำงาน)
ตัวอย่างโค้ดสาธิตการใช้ Interrupt สำหรับ 16-bit Timer1 เพื่อทำให้เกิดการกระพริบของ LED
#define F_CPU 16000000UL#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>#include <xc.h>#define RELOAD_VALUE (0)ISR(TIMER1_OVF_vect) { // ISR for Timer1 overflow interrupt
TCNT1 = RELOAD_VALUE;
PORTB ^= (1 << PORTB5); // Toggle the LED
}int main(void) {
DDRB |= (1 << DDB5); // output pin for LED on PB5 pin
cli(); // Disable global interrupts
// Timer 1 normal operation, OC1A/OC1B disconnected
TCCR1A = TCCR1B = TCCR1C = 0;
TCNT1 = RELOAD_VALUE;
TCCR1B |= (1 << CS12); // Start timer 1 with Fcpu/256
TIMSK1 |= (1 << TOIE1); // Enable Timer1 Overflow interrupt
TIFR1 |= (1 << TOV1); // Clear Timer1 overflow interrupt flag
sei(); // Enable global interrupts
while(1) {}
return 0;
}
โดยสรุป เราได้ทดลองใช้งานซอฟต์แวร์ MPLAB-X IDE ร่วมกับ XC8 Compiler และสามารถเขียนโค้ดภาษา C พื้นฐาน และนำไปทดสอบการทำงานกับบอร์ด Arduino Nano ได้สำเร็จ