ไมโครคอนโทรลเลอร์ เป็นอุปกรณ์ควบคุม ที่นิยมใช้กันมากๆ ซึ่งนับวันจะเล็กลงไปทุกวัน แต่การเรียนรู้ที่จะใช้ มักจะต้องลงทุน พอสมควร ถึงแม้ตอนนี้จะถูกลงกว่าแต่ก่อนแล้วก้อเถอะ
ในตอนนี้ ผมจะมาแนะนำเทคนิคที่น่าสนใจอีกอัน วิธีติดตั้ง boot-loader ซึ่งถ้าท่านใช้ AVR Studio ท่านจะได้ไม่ต้องเปลี่ยนโปรแกรมเลย และยังประหยัด ไม่ต้องใช้ เครื่องโปรแกรม อีกแล้ว เหมาะมากกับ class หรือ workshop จะได้ไม่ต้องมีเยอะ ประหยัดเงิน ไว้ทำซื้ออย่างอื่นดีกว่า ช่วยชาติครับ
Boot loader เป็น firmware ส่วนมากจะทำหน้าที่ ช่วย upload data เข้าไปใน flash หรือ eeprom หรือเรียกให้ง่าย ทำให้ mirco-controller burn ตัวมันเองได้ (เผาตัวเองได้)
bootloader มีกันหลายแบบ มีทั้ง upload ผ่าน mmc card ได้ upload ผ่าน lan อย่างพวก Embeded linux ส่วนอันที่ผมจะมาแนะนำ upload ผ่านสาย serial ครับ หรือจะใช้ usb2serial ก้อได้ notebook เหมาะมาก
วิธีทำก้อไม่ยากครับ แต่ขอแนะนำว่า ผู้ใช้คุ้นเคยกับ AVR มาพอสมควรนะครับ ไม่เหมาะกับมือใหม่มากๆๆ
ส่วน bootloader ผมได้มาจากที่เขาพัฒนา bootloader ไว้แล้วอีกที่ อันนี้ที่ผม เอามาใช้ มาจาก http://www.avride.com/article/wiring/ ของคุณ Worapoht Kornkaewwattanakul พัฒนาเพิ่มเติมไว้
ซึ่งใน wiring ก้อเป็นอีกอันคุ้นๆ กัน
http://wiring.uniandes.edu.co/source/trunk/wiring/bootloader/
ผมขออุณญาตินำมาใช้ และ ขออนุญาติ เอามาเผยแพร่ความรู้ ให้สมาชิกในเวปด้วยนะครับ ส่วนของ bootloader ส่วนนี้จะทำให้ ATmega มี Protocol สื่อสาร แบบเดียวกับ เครื่องโปรแกรม STK-500v2 ของ ATmel ซึ่งทำให้ ท่าน burn เข้า mcu โดยไม่ต้องมีเครื่องโปรแกรมได้
ซึ่งจาก source code เขาไว้ใช้งานกับ ATmega128 ในส่วนใน src เขาได้ทดสอบกับ ATmega8, ATmega16 ,ATmega32 ,ATmega8515 ,ATmega8535, ATmega162, ATmega128 ซึ่งยังไม่มี ATmega64 ผมเลยพยายามเพิ่มเติมส่วนที่จำเป็น
ผมมีบอร์ด ETT-ATmega64 อยู่นานแล้ว ยังไม่ผ่านจ่ายไฟ เข้า VCC ซึ่งถ้าท่านใช้ ATmega ตัวอื่นๆ ลองทำต่อวิธีผม น่าจะทำให้นำไปใช้งานได้เลย
วิธีการแก้ไขให้ src ใช้ ATmega64 ได้นะครับ ต้องแก้ไข file ส่วนของ Makefile กับ stk500boot.c
ใน Makefile
เลือก MCU ใหม่
เปลี่ยน
MCU = atmega128เป็น
MCU = atmega64
ในส่วน Bootloader Address ครับ ตำแหน่ง start ของ bootloader (ขอบคุณท่าน DEV-Zone ที่วันนั้นแนะนำในเวปบอร์ด)
# Bootloader
# Please adjust if using a different AVR
# 0x0e00*2=0x1C00 for ATmega8 512 words Boot Size
# 0xFC00*2=0x1F800 for ATmega128 1024 words Boot Size
# 0x7C00*2=0x0F800 for ATmega64 1024 words Boot Size
#BOOTLOADER_ADDRESS = 1F800
BOOTLOADER_ADDRESS = 0F800
ผมได้เปลี่ยนจาก
BOOTLOADER_ADDRESS = 1F800
เป็น
BOOTLOADER_ADDRESS = 0F800
ตัวเลขได้มาจากใน datasheet Atmel64 ส่วนของ bootloader support
หัวข้อ ตาราง Boot Size Configuration ขึ้นอยู่กันขนาด bootloader ที่ทำขึ้นมา ซึ่ง firmware นี้ขนาดไม่เกิน 1024 words
boot reset address อยู่ที่ 0x7C00 ซึ่งเปลี่ยน word ทำกันคูณสอง ได้ 0xF800
BOOTSZ1 | BOOTSZ0 | Boot Size | Application Flash Section |
BootLoader Flash Section |
EndApp Section Address |
BootReset Address |
1 | 1 | 512 | 0?0000-0?7DFF | 0?7E00-0?7FFF | 0?7DFF | 0?7E00 |
1 | 0 | 1024 | 0?0000-0?7BFF | 0?7C00-0?7FFF | 0?7BFF | 0?7C00 |
0 | 1 | 2048 | 0?0000-0?77FF | 0?7800-0?7FFF | 0?77FF | 0?7800 |
0 | 0 | 4096 | 0?0000-0?6FFF | 0?7000-0?7FFF | 0?6FFF | 0?7000 |
และในส่วนของ source code stk500boot.c
เพิ่ม Signature Bytes ของ Atmega64 เข้าไป
#define SIGNATURE_BYTES 0x1E9602
ซึ่งดูได้จากใน datasheet อีกเช่นกันครับ
นอกนั้นไม่จำเป็นต้องแก้ไขอะไรครับ ในขั้นนี้ ท่านจะสามารถ compile source ได้แล้ว
compile โดยพิมพ์ make ที่ ไดเร็กทรอรีนั้น ซึ่งไม่มี error เกิดขึ้นก้อใช้งานได้ครับ
ส่วนใน รายละเอียด bootloader จาก src ทำอะไรบ้างให้ท่านศึกษาด้วยตัวเองนะครับ มันละเอียดมาก
โดยสรุปหลักๆ bootloader จะมี LED แสดงผลเมื่อเข้าทำงานในส่วน และการใช้งานbootloader มีสองแบบ
– แบบแรก start bootloader ตั้งแต่แรก ที่ จ่ายไฟ ให้ mcu แล้วกลับไปทำงานปกติ ถ้าไม่มีการใช้ภายเวลาที่กำหนด
– แบบที่สอง start bootloader เมื่อ pin ที่กำหนด active low
ซึ่งในบางส่วน ท่านอาจจะต้องเพิ่ม hardware LED เพื่อแสดงสถานนะของ mcu หรือ เพื่อ Switch เพื่อ เข้า bootloader
โดย default bootloader นี้ จะใช้ switch กับ LED ผมทดสอบต่อแบบ defalut ก่อนครับ
ท่านอยากแก้ไขอะไร ผมจะตัวอย่างให้ เช่น อยากให้มี LED แสดง ท่านไป comment
//#define REMOVE_BOOTLOADER_LED // no LED to show active bootloader
แล้วกำหนด led อยู่ pin ไหน ท่านแก้ไขได้ที่ ส่วนนี้ของไฟล์
/*
* LED on pin "PROGLED_PIN" on port "PROGLED_PORT"
* indicates that bootloader is active
* PG2 -> LED on Wiring board
*/
#define PROGLED_PORT PORTG
#define PROGLED_DDR DDRG
#define PROGLED_PIN PING2
อันนี้กำหนดว่า LED อยู่ port G,pin2 ครับ
นี้เป็นการยกตัวอย่างให้ดูนะครับ จริงๆ เอาละเอียด มันจะเยอะมาก ก้อให้ท่านไปศึกษา ดูกันต่อเอง
ตัวอย่างที่ต่อบน บอร์ดผม Atmega64 เพิ่ม Switch ที่ช่อง E2 กับเพิ่ม LED ที่ช่อง G2 ตามวงจรของ WiringIO ครับ
หลังจากนั้น compile ได้แล้ว ท่านก้อ flash เข้าไปครับ
และกำหนด fusebit ดังนี้ครับ
– กำหนดขนาด firmware อันนี้กำหนด 1kWords (program BOOTSZ01)
– เลือกให้เข้า BOOT Reset Vector (program BOOTRST)
– Lock Mode 3 ป้องกันเขียนในโปรแกรมส่วน bootloader (program BootLock 11 and BootLock 12)
เข้าไปดูที่ http://www.avride.com/article/wiring/
ถ้าท่านใช้ pony-prog จะ fusebit ดังรูปครับ
หรือใช้ avr-dude ใช้ fuse-bit แบบนี้นะครับ
(โปรแกรม คำนวณ fuse-bit ส่วนตัว)
Atmega64
High-Byte=0x2c
Low-Byte=0ef
Ext-Byte ใส่ตอนหลังได้
– ทดสอบการใช้งาน
ท่าน ต้องทดสอบก่อน compile มาแล้วใช้ได้หรือ ป่าว บาง avr-gcc มันมีปัญหาแปลก อย่าง คอมไฟล์เลอร์ คนล่ะเวอร์ชั่น คอมไฟล์ไฟล์เดียวกันทำงานไม่ได้ ถ้าไม่ได้ อันนี้ ผมเสียใจด้วยนะครับ ผมคงอธิบายทั้งหมดไม่ได้ทั้งหมด มันจะเยอะมาก ต้องพยายามแก้ๆ ไปครับ
ทดสอบแรก ถ้าท่านต่อวงจร ถูกต้อง ให้ท่านกด switch prog กับ reset ถ้าไฟ led ติด ก้อ bootloader ทำงานแล้ว
หรือ ท่านใช้แบบ ไม่มีสวิตซ์ ไฟจะกระพริบ สองที่ แสดงว่า bootloader ทำงานแล้วเช่นกัน ดังรูปครับ ไฟ led ติด (สีแดงเล็กๆ) แผ่นวงจรผม อาจจะดูยุ่งๆหน่อยครับ พื้นที่มีจำกัด
ทดสอบใช้งานกับ AVR-Studio
อันแรกต้อง config comport ก่อนครับ เลือก AUTO ก้อได้ครับ
จากนั้น เรียก AVRISP ขึ้นมา ถ้าเข้ามาถึงหน้าต่างนี้ ท่านประสบความสำเร็จแล้ว (ฮ่าๆ ยึดครองโลก)
ตอน นี้ท่านก้อสามารถ flash โปรแกรม หรือ เปลี่ยน fuse-bit ก้อได้ครับ (เปลี่ยนได้บางตัวนะครับ) ส่วน erase chip ไม่ทำงานนะครับ แต่ทุกครั้งที่ flash ใหม่ ที่ตัว firmware จะลบเองครับ
*** ทุกครั้งก่อนจะ connect ท่านต้องเข้า bootloader mode ก่อน ไม่งั้น โปรแกรม AVRISP หาไม่เจอ และต้องปิดหน้าต่าง AVRISP ถึงจะสามารถใช้ serial port ได้เหมือนเดิม
เขียนโปรแกรมง่าย ทดสอบกันไฟกระพริบเทพก่อน (ตอนนี้ผมสามารถทำไฟกระพริบได้กับทุก MCU แล้ว)
#include <avr/io.h> #include <util/delay.h> void delay_ms(unsigned int time) { while (time -->0) { _delay_ms(1.0); } } int main(void) { PORTB=0x00; // PB7..0 = 0 DDRB=0x01; // PB0 = Output while (1) { PORTB = 0x00; delay_ms(200); PORTB = 0xFF; delay_ms(200); } return 0; }
จากนั้นกด flash to current settings ที่เมนูของ avr-studio ได้ไฟกระพริบแล้ว (สวยงาม)
ไฟดับ
ไฟติด
เอาล่ะครับ ยาวมากๆ หวังว่าคงจะมีประโยชน์กับเพื่อน สมาชิกบ้างนะครับ เอาไว้เจอกันใหม่ในโปรแกรมหน้า สวัสดีครับ
อ่านแล้วก็ยังงง ว่า ที่ใช้ ett atmega64 เมื่อ load bootloader ลงได้แล้ว จะเขียน programm ที่พัฒนาลง ไปใน เจ้า mega64 แล้วละ
พยายามอ่าน และดูในรูป ก็มองไม่ออก ว่า คุณใช้ connector แบบใหน อย่างไร
งง ครับ (ทั้งๆ ที่ใช้ arduino เป็นนี่แหละ )
ผม upload ผ่านสาย serial ครับ ข้างบนจะใช้ ผมทำบอร์ด usb2serial มาเองครับ
ที่ไม่มีรูป connector ให้เห็นจิงๆ ผมเสียบเข้าทางบอร์ดทดลองเลยครับ เอา serial ที่ระดับสัญญาณ TTL (เป็นระดับไฟ 5v,0v) ต่อเข้า tx ,rx ของ บอร์ด ett mega64 ครับ
Many thanks.
samira
ที่ว่า ใช้ load ผ่าน serial โดยใช้ usb2serial ทำเอง นั้น ขาทีออกมา ต้องไปลดให้เป็น ttl อีกทีหรือเปล่า
ผมมี usb2serial cable เหมือนกัน หากเข้าใจไม่ผิด มันยังไม่ใช่ ttl signal ใช่หรือเปล่าครับ ต้องเอาไป่ผ่าน rs232 chip เสียก่อน ใช่หรือเปล่า
ผมไม่มีเครื่องตรวจ signal ซะด้วยซิ
ATMEGA88 เมื่อเสียบ Adamter เข้าออกบ่อย ๆ ทำให้ Flash Memory หายหมดเลย ข้อมูลที่ Burn เปนะครับ กับ Bootloader ยังอยู่ ต้องแก้อย่างไงครับ
หมายถึงทำอย่างไง ไม่ให้ โปรแกรมภายใน flash memory หายไปใช่หรือป่าวครับ
ว่าแต่ atmega88 ใช้ bootloder แบบไหนครับ มีกด switch ก่อนเข้าโหมด หรือป่าวครับ
ใช้โปรแกรมอะไรแก้ source cod ครับ และต้องการลง bootloader บน ATMEGA8535 ต้องทำอย่างไงบ้างครับรบกวนด้วยนะครับ
“ตอน นี้ท่านก้อสามารถ flash โปรแกรม หรือ เปลี่ยน fuse-bit ก้อได้ครับ (เปลี่ยนได้บางตัวนะครับ) ส่วน erase chip ไม่ทำงานนะครับ แต่ทุกครั้งที่ flash ใหม่ ที่ตัว firmware จะลบเองครับ”
เพราะเหตุใด erase chip ไม่ทำงานครับ แล้วมีวิธีให้มันทำงานได้อีกครั้งไหมครับ