MPLAB-X IDE with Arduino (ATmega328P)

<rawat.s>
6 min readJul 11, 2020

--

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

บทความนี้นำเสนอการใช้งานซอฟต์แวร์ Microchip MPLAB-X IDE + XC8 Compiler สำหรับนำมาใช้กับบอร์ด Arduino Uno/Nano ที่ใช้ชิป ATmega328P แทนที่การใช้งาน AVR Studio IDE

จาก 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 สำหรับ Windows 10

ข้อสังเกต: ในการติดตั้งซอฟต์แวร์ MPLAB-X IDE จะมีให้เลือกว่า ต้องการใช้สำหรับไมโครคอนโทรลเลอร์ตระกูลใดบ้าง ซึ่งจำแนกเป็น 8 บิต 16 บิต และ 32 บิต ตามลำดับ ถ้าเลือกทั้งหมด จะต้องใช้พื้นที่ในฮาร์ดแวร์ดิสค่อนข้างมาก

เมื่อติดตั้งเสร็จแล้ว จะมีข้อความที่แนะนำให้ติดตั้งและใช้งานซอฟต์แวร์อื่นอีกที่เกี่ยวข้อง

เนื่องจากเราจะใช้งาน ATmega328P ถัดไปก็ให้ติดตั้ง XC8 Compiler เพื่อใช้งานร่วมกับ MPLAB-X IDE

ให้เลือกประเภทของ License เป็นแบบ Free

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

หลังจากการติดตั้งซอฟต์แวร์แล้ว ก็เปิดใช้งาน MPLAB-X IDE เพื่อเข้าสู่หน้าต่างหลัก

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

เริ่มต้นสร้างโปรเจกต์ใหม่ โดยเลือกประเภท “Standalone Project”

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

เลือก Device ที่จะใช้งานเป็น 8-bit AVR MCUs

การเลือกตระกูลของไมโครคอนโทรลเลอร์ (Device Family) เป็น 8-bit AVR MCUs

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ถัดไปเป็นการเลือกใช้ Tool สำหรับการดีบักและโปรแกรมไฟล์ไปยังบอร์ดไมโครคอนโทรลเลอร์ (ซึ่งมีหลายตัวเลือก เช่น Microchip PICKit 4, Microchip SNAP, J-Link) แต่ในกรณีนี้ให้เราเลือก Simulator ซึ่งจะสามารถจำลองการทำงานของโค้ดได้

ขั้นตอนการเลือก Device และ Tool

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ถัดไปให้เลือก Compiler Toolchains ที่จะใช้งาน ซึ่งในกรณีคือ XC8

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ในกรณีที่ติดตั้ง XC8 Compiler ไว้แล้ว แต่ MPLAB-X IDE ตรวจสอบไม่พบ ก็สามารถตั้งค่าเองได้

ไปที่เมนู Tools > Options แล้วเลือก Embedded > Build Tools แล้วเพิ่มรายการ PATH สำหรับ Toolchain

การตั้งค่า Toolchain โดยเลือกเป็น XC8
การเพิ่ม Toolchain โดยเลือก XC8 เพื่อใช้สำหรับโปรเจกต์

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ตั้งชื่อสำหรับโปรเจกต์ใหม่ และระบุ 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;
}
ตัวอย่างการตั้งค่าสำหรับ XC8 Compiler เช่น Optimization Level with Debug

เมื่อนำโค้ดตัวอย่างไปใส่ลงในไฟล์ main.c แล้วบันทึก จากนั้นลองคอมไพล์โค้ด โดยทำขั้นตอน Build Main Project

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ถ้าคอมไพล์โค้ดได้สำเร็จแล้ว และกดดูที่ Tab ชื่อ Files (ถัดจาก Projects) เราจะมองเห็นไฟล์ .hex ซึ่งไฟล์นี้เราสามารถนำไปโปรแกรมลงบอร์ดไมโครคอนโทรลเลอร์ได้

เมื่อทำขั้นตอน Build Project ได้สำเร็จอแล้ว

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ลองมาจำลองการทำงานของโค้ดดูบ้าง โดยใช้ Simulator ความถี่ของ CPU Clock ที่มีการตั้งไว้เป็น Default คือ 1 MHz

ตัวอย่างการตั้งค่าสำหรับ Simulator

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

เราจะมาลองดูการเลือกบรรทัดในโค้ด เพื่อใช้เป็น Breakpoints และมีการเลือกตัวแปรแบบ Global หรือตัวแปรสำหรับ SFR (Special Function Register) ของ ATmgea328P เพื่อดูการเปลี่ยนแปลงเมื่อโปรแกรมทำงาน โดยเลือก PORTB เป็นตัวอย่าง เพราะเกี่ยวข้องกับสถานะการทำงานของขา PB5 ที่เราใช้เป็นขาเอาต์พุตสำหรับ LED ในตัวอย่างนี้

เมื่อเราเลือก Debug Tool เป็น Simulator เราจึงใช้วิธีดีบักแบบซอฟต์แวร์ และไม่ได้ใช้อุปกรณ์ฮาร์ดแวร์ประเภท In-Circuit Debugger / Programmer

ให้ลองเลือกบรรทัดในโค้ดสำหรับ Breakpoints ตามรูปตัวอย่าง ซึ่งมีสองตำแหน่ง (จะเห็นแถบสีของบรรทัดดังกล่าว)

ตัวอย่างการกำหนดบรรทัดในโค้ด main.c ให้เป็น Breakpoints

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ถัดไป จากเมนู Debug > New Watch เลือกตัวแปรประเภท SFR เพื่อดูค่าของตัวแปรดังกล่าว

การเลือก PORTB ซึ่งเป็นชื่อของตัวแปรแบบ SFR สำหรับ Watch

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

เมื่อทำขั้นตอน 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 ให้ศึกษาขั้นตอนจากเว็บนี้

รูปแสดงตำแหน่งขาต่าง ๆ ของคอนเนกเตอร์ ICSP และตัวอย่างอุปกรณ์ Adapter
รูปแสดงตำแหน่งของ ICSP / ISP Connector (2x3 Pins) บนบอร์ด Arduino Nano
ตัวอย่างอุปกรณ์ USBasp และบอร์ด Arduino Nano

‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍

ซอฟต์แวร์ที่ใช้ร่วมกับอุปกรณ์ 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

ข้อความที่ปรากฏเมื่อทำคำสั่ง nano_usbasp.bat
ข้อความที่ปรากฏ (ต่อ) เมื่อทำคำสั่ง nano_usbasp.bat

ข้อสังเกต: การโปรแกรมไฟล์ .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 ในการทำงาน)

การใช้ MPLAB-X (Xpress) IDE แบบ Cloud-based
การใช้ MPLAB-X (Xpress) IDE: Simulator-based Debugging
การใช้ MPLAB-X (Xpress) IDE: Simulator-based Debugging

ตัวอย่างโค้ดสาธิตการใช้ 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;
}
การรันโค้ดด้วยใช้ Simulator และกำหนด Breakpoint ไว้ใน ISR

โดยสรุป เราได้ทดลองใช้งานซอฟต์แวร์ MPLAB-X IDE ร่วมกับ XC8 Compiler และสามารถเขียนโค้ดภาษา C พื้นฐาน และนำไปทดสอบการทำงานกับบอร์ด Arduino Nano ได้สำเร็จ

--

--

<rawat.s>
<rawat.s>

Written by <rawat.s>

I'm Thai and working in Bangkok/Thailand.

No responses yet