ArduinoMyProject

เล่น AVR-ETT-Stamp ไม่ต้องง้อเครื่อง burn กันดีกว่า

By October 10, 2008 January 30th, 2011 9 Comments

ไมโครคอนโทรลเลอร์ เป็นอุปกรณ์ควบคุม ที่นิยมใช้กันมากๆ ซึ่งนับวันจะเล็กลงไปทุกวัน แต่การเรียนรู้ที่จะใช้ มักจะต้องลงทุน พอสมควร ถึงแม้ตอนนี้จะถูกลงกว่าแต่ก่อนแล้วก้อเถอะ

ในตอนนี้ ผมจะมาแนะนำเทคนิคที่น่าสนใจอีกอัน วิธีติดตั้ง 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
(คัดลอกจาก datasheet ของ ATmega64)

และในส่วนของ 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 ขึ้นมา ถ้าเข้ามาถึงหน้าต่างนี้ ท่านประสบความสำเร็จแล้ว (ฮ่าๆ ยึดครองโลก) Grin Grin Grin

ตอน นี้ท่านก้อสามารถ 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 ได้ไฟกระพริบแล้ว (สวยงาม)

ไฟดับ


ไฟติด

เอาล่ะครับ ยาวมากๆ หวังว่าคงจะมีประโยชน์กับเพื่อน สมาชิกบ้างนะครับ เอาไว้เจอกันใหม่ในโปรแกรมหน้า สวัสดีครับ

chang

ชื่อ “ช้าง” ส่วนมากเขาจะเรียกว่า “พี่ช้าง” แล้ว มีความสนใจทางเทคโนโลยีทางคอมพิวเตอร์ อิเล็กทรอนิกส์ และ หุ่นยนต์ เป็นทั้งนักคิด นักประดิษฐ์ ชอบทดลองเล่น จนเดี่ยวนี้รู้สึกว่าจะเล่นมากกว่ามืออาชีพไปสักแล้ว

9 Comments

  • samira says:

    อ่านแล้วก็ยังงง ว่า ที่ใช้ ett atmega64 เมื่อ load bootloader ลงได้แล้ว จะเขียน programm ที่พัฒนาลง ไปใน เจ้า mega64 แล้วละ

    พยายามอ่าน และดูในรูป ก็มองไม่ออก ว่า คุณใช้ connector แบบใหน อย่างไร

    งง ครับ (ทั้งๆ ที่ใช้ arduino เป็นนี่แหละ )

  • chang says:

    ผม upload ผ่านสาย serial ครับ ข้างบนจะใช้ ผมทำบอร์ด usb2serial มาเองครับ

    ที่ไม่มีรูป connector ให้เห็นจิงๆ ผมเสียบเข้าทางบอร์ดทดลองเลยครับ เอา serial ที่ระดับสัญญาณ TTL (เป็นระดับไฟ 5v,0v) ต่อเข้า tx ,rx ของ บอร์ด ett mega64 ครับ

  • samira says:

    Many thanks.

    samira

  • samira says:

    ที่ว่า ใช้ load ผ่าน serial โดยใช้ usb2serial ทำเอง นั้น ขาทีออกมา ต้องไปลดให้เป็น ttl อีกทีหรือเปล่า

    ผมมี usb2serial cable เหมือนกัน หากเข้าใจไม่ผิด มันยังไม่ใช่ ttl signal ใช่หรือเปล่าครับ ต้องเอาไป่ผ่าน rs232 chip เสียก่อน ใช่หรือเปล่า

    ผมไม่มีเครื่องตรวจ signal ซะด้วยซิ

  • ช่วยทีครับ says:

    ATMEGA88 เมื่อเสียบ Adamter เข้าออกบ่อย ๆ ทำให้ Flash Memory หายหมดเลย ข้อมูลที่ Burn เปนะครับ กับ Bootloader ยังอยู่ ต้องแก้อย่างไงครับ

    • chang says:

      หมายถึงทำอย่างไง ไม่ให้ โปรแกรมภายใน flash memory หายไปใช่หรือป่าวครับ

      ว่าแต่ atmega88 ใช้ bootloder แบบไหนครับ มีกด switch ก่อนเข้าโหมด หรือป่าวครับ

  • Contralooky says:

    ใช้โปรแกรมอะไรแก้ source cod ครับ และต้องการลง bootloader บน ATMEGA8535 ต้องทำอย่างไงบ้างครับรบกวนด้วยนะครับ

  • Mza_haha says:

    “ตอน นี้ท่านก้อสามารถ flash โปรแกรม หรือ เปลี่ยน fuse-bit ก้อได้ครับ (เปลี่ยนได้บางตัวนะครับ) ส่วน erase chip ไม่ทำงานนะครับ แต่ทุกครั้งที่ flash ใหม่ ที่ตัว firmware จะลบเองครับ”

    เพราะเหตุใด erase chip ไม่ทำงานครับ แล้วมีวิธีให้มันทำงานได้อีกครั้งไหมครับ

Leave a Reply to chang Cancel Reply