การใช้งาน PIC18Fxxxx กับ MPLAB X + XC8 ด้วย Peripheral Libraries (PLIBS)
การใช้งาน MPLAB X และ XC8 กับหนังสือ "PIC18F Programming กับ MPLAB C18 คอมไพเลอร์" ของบริษัท แอพซอฟต์เทค จำกัด
** บทความนี้นำเสนอการใช้งาน MPLAB X และ XC8 รวมกับไลบรารี PLIBS เพื่อใช้งานแทน MPLAB กับ MPLAB C18 คอมไพเลอร์ ซึ่งเป็นเวอร์ชันที่เก่ากว่า MPLAB X และ XC8
1. ติดตั้งโปรแกรม MPLAB X และ XC8 ได้ตาม Link ต่อไปนี้
http://www.microchip.com/pagehandler/en-us/family/mplabx/
http://www.microchip.com/pagehandler/en_us/devtools/mplabxc/
2. ติดตั้งโปรแกรม PIC18F Legacy Peripheral Libraries v1.0 Windows ด้วยขั้นตอนดังต่อไปนี้
ดาวน์โหลดไฟล์ peripheral-libraries-for-pic18-v2.00rc3-windows-installer
คลิกไฟล์ติดตั้ง
ยอมรับเงื่อนไข
เลือกไปยังโฟลเดอร์ที่ XC8 ติดตั้งอยู่
ตัวอย่างนี้ xc8 เวอร์ชัน 1.35 ติดตังอยู่ที่ ...ตามรูป
เลือกโฟลเดอร์เรียบร้อยแล้ว พร้อมติดตั้ง
ติดตั้งเสร็จเรียบร้อยแล้ว
3. ในขั้นตอนต่อไปเราจะสร้างไฟล์โปรเจคสำหรับ PIC18F ดังนี้
เปิด MPLAB X ขึ้นมา
ไปที่เมนู File > New Project...
เลือกตามนี้แล้วคลิก Next..
ที่ช่อง Family.. เลือก Advanced 8-bit MCUs(PIC18)
ที่ช่อง Device เลือก PIC18F4520 ซึ่งเป็นเบอร์ที่หนังสือเล่มนี้ใช้
เลือกเครื่องมือที่ใช้ในการโปรแกรมโค้ด ..hex ไฟล์
เลือกคอมไพลเลอร์ที่ใช้ เลือก xc8
ตั้งชื่อไฟล์โปรเจคพร้อมที่เก็บโปรเจค (ปุ่ม Brows..)
4. หลังจากที่สร้างไฟล์โปรเจคเสร็จแล้ว ขั้นตอนนี้สำคัญมากเพราะจะทำให้ XC8 สามารถใช้ไลบรารี PLIBS ได้
ไปที่เมนู RUN > Set Project Config... > Custom....
เลือกไปที่ XC8 Compiler และเลือกที่ Include directories เพื่อบอกว่า PLIBS อยู่ที่ไหน
เพิ่มพาร์ทของ plib โดยเลือกไปที่ปุ่ม Browse...
ไปที่โฟลเดอร์ที่ plib ติดตั้งอยู่ดังรูป ** ขั้นตอนนี้ XC8 จะรู้จักที่เก็บเฮดเดอร์ไฟล์ของไลบรารีแล้ว
กำหนดให้ XC8 ลิงเกอร์ ใช้ PLIBS โดยคลิก check box ที่ Link in Peripheral Library
เมื่อคลิกเลือกเรียบร้อยคลิกปุ่ม Apply และ OK ตามลำดับ
5. ทดลองโปรแกรมตัวอย่างจากตัวอย่างของหนังสือ "PIC18F Programming กับ MPLAB C18 คอมไพเลอร์" ของบริษัท แอพซอฟต์เทค จำกัด ดังนี้
เพิ่มไฟล์ตัวอย่าง
เลือกไฟล์ โดยไปที่มีไฟล์โปรแกรมตัวอย่างเก็บไว้อยู่
เลือกไปที่โฟลเดอร์ LAB_PIC18F_Book
เลือกไฟล์ LAB_0301.c
คอมไพล์โค้ดโปรแกรมตัวอย่าง
จากขั้นตอนที่กล่าวมาทั้งหมดได้แสดงวิธีการใช้งาน MPLAB X และ XC8 กับไลบรารี PLIBS เพื่อใช้งาน PIC18F ในรูปแบบการเรียกใช้งาน Peripheral ของ PIC18F ผ่านไลบรารี ในการใช้งานไลบรารีกับ xc8 นี้ มีส่วนที่ต้องเปลี่ยนแปลงเพิ่มเติมคือ เรื่องของฟังก์ชันที่เกี่ยวกับอินเตอร์รัปต์จะมีรูปแบบการเขียนแบบใหม่ดังนี้คือ
รูปแบบเดิมตามหนังสือ
//-----------------------------------------------:Interrupt vector
// High priority interrupt vector
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
}
// return to the default code section
#pragma code
//-----------------------------------------------:Interrupt routine
// High priority interrupt routine
#pragma interrupt InterruptHandlerHigh
void InterruptHandlerHigh (void)
{
if (INTCONbits.INT0IF) // Check for INT0 Interrupt
{
INTCONbits.INT0IF = 0; // Clear interrupt flag
LATAbits.LATA2 = 0; // RA2 High
delay_ms(500);
LATAbits.LATA2 = 1; // RA2 Low
}
if (INTCON3bits.INT1IF) // Check for INT1 Interrupt
{
INTCON3bits.INT1IF = 0; // Clear interrupt flag
LATAbits.LATA3 = 0; // RA3 High
delay_ms(500);
LATAbits.LATA3 = 1; // RA3 Low
}
}
แต่เมื่อนำมาใช้กับ xc8 จะต้องเปลี่ยนแปลงดังนี้คือ
ปิดโค้ดสวนนี้ทั้งหมดด้วยหมายเหตุ /* ... */ หรือจะลบทิ้งไปก็ได้
/*
//-----------------------------------------------:Interrupt vector
// High priority interrupt vector
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh (void)
{
_asm
goto InterruptHandlerHigh //jump to interrupt routine
_endasm
}
// return to the default code section
#pragma code
*/
พร้อมกับปิดโค้ดสวนนี้
//-----------------------------------------------:Interrupt routine
// High priority interrupt routine
ปิดโค้ดส่วนนี้ด้วยหมายเหตุ //
//#pragma interrupt InterruptHandlerHigh
//void InterruptHandlerHigh (void)
แล้วแทนด้วยข้อความ static void interrupt isr(void) แทน ตามตัวอย่างด้านล่างนี้
static void interrupt isr(void)
{
if (INTCONbits.INT0IF) // Check for INT0 Interrupt
{
INTCONbits.INT0IF = 0; // Clear interrupt flag
LATAbits.LATA2 = 0; // RA2 High
delay_ms(500);
LATAbits.LATA2 = 1; // RA2 Low
}
if (INTCON3bits.INT1IF) // Check for INT1 Interrupt
{
INTCON3bits.INT1IF = 0; // Clear interrupt flag
LATAbits.LATA3 = 0; // RA3 High
delay_ms(500);
LATAbits.LATA3 = 1; // RA3 Low
}
}
ความคิดเห็น
แสดงความคิดเห็น