รู้จัก In System Programming (ISP) เบิร์นไอชีได้อย่างไง

Posted by | September 21, 2009 | Embeded System | No Comments

กลับมาแล้วครับ รอบนี้ผมก้อมีบทความ ละเอียดอีกแล้ว บทความนี้เป็นของพี่ samira ผมยืมมาช่วยเผยแพร่ทางเวปนี้อีกช่องทางครับ หวังว่าคนเพิ่งมาจะได้ประโยชน์นะครับ (ท่าน CEO ไอยาราฟันส์ขี้เกียจขึ้นเรื่อยๆ) ส่วนมากคนที่เพิ่งเข้ามาจับ จะเจอคำศัพท์ใหม่ๆเยอะเลย ซึ่งมันต้องใช้เวลานะครับ วันนี้ผมมาแนะนำเรื่องพื้นฐานก่อน เรื่อนการเบิร์นครับ

กว่าจะเป็น เบิร์นโปรแกรมได้แบบ ทุกวันนี้
เมื่อก่อน เวลาเราพัฒนาคอนโทรลเลอร์ การเขียนข้อมูล ( data หรือ program ) ลงใน EEPROM (erasable rom) นั้น เขาจะต้องถอดเอา chip ไปล้างข้อมูลด้วยแสง ultraviolet ถึงจะเขียนโปรแกรมเข้าไปในใหม่ได้ ( ไม่รู้ว่าเกิดกันทัน ผมมาก้อไม่เห็นแล้วนะครับ ) และอายุการใช้งานจำกัด ดังนั้นจะเห็นว่า เวลาจะพัฒนาโปรแกรมอะไรใหม่ จะมีกระบวนการที่วุ่นวายมากๆเลย

PROM ตัวแรกๆ ของโลก รูปจาก http://en.wikipedia.org/wiki/Read-only_memory

ต่อมาความก้าวหน้าทาง Technology ทาง flash memory พัฒนามากขึ้น ได้บรรจุ flash memory ลงไปใน chip ด้วยทำให้การทำงานลบล้างข้อมูลบน chip ง่ายขึ้น อาจจะไม่ต้องใช้แสง ultraviolet เพื่อลบข้อมูล ใช้ไฟ ปกติก้อสามารถ อ่านเขียน ลบ โปรแกรมได้ แตก้อ่ยังต้องมีเครื่องมือ หรือ วงจรที่ต้องออกแบบมาเพื่อใช้งานนี้อยู่ดี

(อ่านต่อ click เลย)

เครื่องเบิร์นโปรแกรม (flash programmers)

การอัดโปรแกรมเข้าไปในชิป หรือเรียกภาษาเราบ่อยๆว่า “เบิร์นโปรแกรม” จะต้องใช้ไฟสูง หรือ สัญญาณระดับไฟมากกว่า 12 โวลต์ เข้าไป tick ขาสัญญาณ เพื่อให้ไมโครฯ รับรู้ว่าจะมีการเขียนโปรแกรม ซึ่งในอดีตต้องมีการถอดเข้า ถอดออก ชิปบ่อยๆ เพื่อย้ายชิปจากบอร์ดที่เราใช้ ไปยังเครื่องโปรแกรม ซึ่งจะมีวงจรที่ทำไฟสูง แต่ด้วยความต้องการปัจจุบัน ทางบริษัทผลิต chip ได้บรรจุวงจร เพิ่มแรงดันเข้าไปใน chip ด้วยจึงทำให้สามาร flash โปรแกรม เข้าไปใน chip ได้ด้วย เรียกว่า??In Circuit System Programming ( ICSP or ISP) พูดตามภาษาชาวบ้านก็คือ การเขียน การเบิร์น (burn) อุปกรณ์วงจรต่าง จึงลดลงไป

ส่วนการเบิร์นโปรแกรม (flash programmers) (ISP) จะสามารถเบิร์นโปรแกรมได้สองวิธี เรียกว่า แบบ Parallel Programming Mode (Parallel Mode) และแบบ Serial Downloading Mode (ISP mode)
ถ้าเป็นแบบ pararell คือการต่อตรงเข้าไป mcu ไม่ได้ผ่านชุดคำสั่งพิเศษ แต่ถ้าเป็น spi จะใช้ชุดคำสั่งใช้ในการ flash โปรแกรม เข้าไป ที่นี้ขอกล่าวเฉพาะเขียนโปรแกรมแบบ serial ผ่านโมดุลสื่อสาร SPI

การทำงานของ In System Programming (ISP)

อย่างที่บอกไว้ตอนแรก flash memory สามารถเขียนได้ต้องใช้ไฟสูง ในการขับขา gate จึงได้มีการพัฒนาเพิ่มทวีแรงดัน เพื่อสร้างไฟสูงภายในวงจร การเบิร์นจึงทำได้ง่ายขึ้น

ในโมดุล ISP จะประกอบด้วยส่้วนการเขียนโปรแกรม ลบโปรแกรม โดยมีรูปแบบ การส่ง command และ data ตาม datasheet หน้า 299
http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf

บทความนี้ไม่ได้ มาชวนเขียนวิธีการเขียนโปรแกรมเพื่อลง flash เพียงต้องการให้เข้าใจพื้นฐาน

ขา MCU ที่ใช้ใน In System Programming

(ภาพ : ด้วยความเอื้อเฟื้อ จากเว็ปท่าน elmchan.org )

หากเข้าไปดูใน Atmel Chip จะเห็นว่า ขาของ chip เหล่านั้น มีคำอธิบายไว้แทบทุกขาว่ามันทำอะไรบ้าง แต่เราจะสนใจแต่ ขาที่ใช้สำหรับ ISP
http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf
หน้า 2 ของเอกสารนี้ ท่านจะเห็น pin out ของ chip Atmega 44/88/168

MOSI == Master Out Slave In: data input
MISO == Master In Slave out : data output
SCK == Serial ClocK : clock input
RST == RESET: used to activate the serial Programming

จากข้างบนจะเห็นว่า ขาที่บ่งว่า MOSI นั้น จะเป็นขาส่งข้อมูลออก( Output ) ของตัวแม่ ( master )
MISO นั้น เป็นขาที่รับข้อมูล (input ) ที่ส่งมาจากลูก ( slave )
SCK นั้น เป็นตัวนาฬิกาคอยให้จังหวะการส่งข้อมูล
ขาสุดท้ายก็คือ RST นั้น คือตัวที่เริ่มให้มีการเขียนโปรแกรมลง chip

ขั้นตอนการทำงาน In System Programming ผ่าน SPI ( จาก datasheet ของ Atmel )

ขั้นตอนการเขียนโปรแกรม ( code ) ลงบน chip นั้นจะส่งข้อมูลเป็นแบบ serial หรือ ISP จะเริ่มต้นทำงานด้วยขณะที่ขา RST ถูกปรับให้มีค่า Logic high ( ระดับสัญญาณ เท่ากับ Vcc )

สำหรับขา RST นั้น ปกติ ใช้สำหรับ reset โปรแกรม กล่าวคือสัญญาณ Reset จะหยุดโปรแกรมและเริ่มต้นการทำงานใหม่ โดยเราทำให้ขา RST มีระดับสัญญาณต่ำ ( logic ต่ำ )
เมื่อขา RST ถูกตั้งให้เป็น High คำสั่งพิเศษที่เรียกว่า Programming Enable instruction จะทำงานก่อน

สำหรับการรับส่งข้อมูลแบบ Serial คือการส่งข้อมูลจาก ด้วยช่องสัญญาณเพียงช่องเดียว หรืือ ขาสัญญาณขาเดียว ในที่นี้คือขาสัญญาณ MISO และ MOSI
โดยข้อมูลจะส่งผ่าน MOSI ทีละ bit โดยแต่ละ bit สัญญาณจาก SCK จะเป็นตัวควบคุมจังหวะของการรับส่ง และทางขา MISO ใช้สำหรับรับข้อมูลจากลูกส่งกลับไปยังต้วแม่

โดยเริ่มจากข้อมูลใน chip จะถูกลบหมด (chip erase) การลบข้อมูลใน flash memory และจะตามด้วยการเขียนค่า “FF” (hexadecimal number) ลงไปในแต่ละตำแหน่งใน flash or ram memory ของ chip

ความเร็วของสัญญาณนาฬิกา ของ ISP จะถูกกำหนดโดยสัญญาณนาฬิกาอ้างอิงจาก external clock ทีต่อที่ขา Xtal1 หรือ crystal ที่ต่อกับขา Xtal1&Xtal2 โดยมีข้อกำหนดว่า ความเร็วของขา SCK นั้นจะเร็วไม่เกิน 1/16 ของ ความเร็วของ crystal ไม่ได้

ฉะนั้น หากระบบของเรา ใช้ Crystal 16 MHz ความเร็วสูงสุดของ SCK ก็จะได้แค่ 1 MHz แค่นั้น

โปรแกรมเบิร์นทำงานได้อย่างไง

โปรแกรมเบิร์น (Software programmer) สำหรับ AVR ที่นิยม ได้แก่ BASCOM ( basic ), avrstudio, ponyprog , AVR Prog ซึ่ง โปรแกรมบางตัวสื่อสารตรง กับ mcu เลย อย่างเช่น ponyprog ใช้สาย pararell สื่อสารแบบ SPI ตรงเข้า mcu เลย หรือบางตัวต้องผ่าน usb ติดต่อกับ บอร์ดของเรา ซึ่ง hardware เหล่านี้จะสื่อสารข้อมูลโดยอาศัย protocol แบบ spi ติดต่อกับ mcu อยู่ดี

ฉะนั้นโปรแกรมเบิร์นจึงเป็นการเขียนข้อมูล firmware (hex code) เข้าไปในตัวชิปบนบอร์ดเรา
software เช่น AVR studio, averdude หรือ BASCOM ที่เราจะใช้เขียนโปรแกรมลง chip นั้น โปรแกรมเหล่านี้ จะมี Option ให้เราเลือกใช้สายต่อ( hardware programmer ) ระหว่าง PC กับ บอร์ดที่เราพัฒนา

สาเหตุที่เราต้องเลือกว่าจะใช้ programmer ตัวไหนนั้น เพราะผู้สร้าง programmer แต่ละอัน ใช้ขาที่ใช้ทางฝั่ง PC สำหรับติดต่อกับ ขา MOSI, MISO, SCK และ RST นั้น ไม่เหมือนกัน

ตัว hardware programmer ซึ่งมีหลายรูปแบบ ไม่ว่าจะเป็น แบบต่อผ่าน สาย parallel สาย serial หรือ สาย USB ให้เราเลือกใช้ เช่น จาก http://www.captain.at/electronics/atmel-programmer/

ต้วอย่าง serial programmer จาก http://www.serasidis.gr/circuits/avr_isp/avr_isp.htm

จากข้างบน จะเห็นว่าสายต่อไปยัง MOSI ของparallel programmer สองแบบนี้ มาจากคนละแหล่ง ของ parallel pin

อย่างไรก็ดี ไม่ว่าสายที่ออกมาจาก ขาใหนก็ตามของ parallel or serial port??ตัวรับที่อยู่บนบอร์ดของเรา จะมีมาตรฐานเดียวกันหมด กล่าวคือ??10 pin ICSP header จะมีมาตรฐานเดียวกัน

http://www.olimex.com/dev/pdf/avr-pg2b.pdf

ขา 1 == MOSI
ขา 2??== Vcc
ขา 1??== LED หรือ เว้นว่าง
ขา 4??== GND
ขา 5??== RST
ขา 6??== GND
ขา 7??== SCK
ขา 8??== GND
ขา 9??== MISO
ขา 10??==GND

เอาล่ะครับ จบสักที่นะครับ อาจจะเข้าใจยากสักนิดนะครับ บทความนี้ เป็นบทความเขียนร่วมกัน ผู้เขียนทั้งสอง คุณพี่ @samira จาก? St. Louis, MO กับผม @ayarafun ช่วยแต่งเติม? หวังว่าบทความคงจะมีประโยชน์บ้าง

บทความเขียนเรียบเรียงโดย samira ,St. Louis, MO
แนะนำ ตรวจ เพิ่มเติม แก้ใข โดย ChANg,??BKK, Thailand

เอกสารอ้างอิง

http://www.ikalogic.com/isp.php
http://www.olimex.com/dev/pdf/avr-pg2b.pdf
http://www.captain.at/electronics/atmel-programmer/

ข้อมูลเพิ่มเติมเกี่ยวกับ Memory
http://en.wikipedia.org/wiki/Read-only_memory
http://en.wikipedia.org/wiki/Flash_memory

About chang

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