กลับไปหน้ารวมไฟล์
debugging-classic-attinys-and-atmegax8-a-quickstart-guide-ea0179.md

ขั้นตอนที่ 1: ติดตั้ง Arduino IDE

น่าจะลง Arduino IDE 2 กันไว้แล้วมั้ง ถ้ายัง ไปโหลดมาติดตั้งให้เรียบร้อยจากเว็บ Arduino เองเลย

เช็คหน่อย: เปิด IDE ขึ้นมา แล้วไปดูที่เมนู Arduino หรือ Help หัวข้อ About Arduino ดูเลขเวอร์ชันให้ดี มันต้องเป็น 2.3.4 ขึ้นไปนะ

ขั้นตอนที่ 2: ติดตั้งไฟล์นิยามบอร์ดใหม่

เปิดหน้าต่าง Preference ของ Arduino IDE ขึ้นมา แล้วก็วาง URL ของ Board Manager สองอันนี้ลงไปในลิสต์ให้หมด

https://felias-fogg.github.io/ATTinyCore/package_drazzy.com_ATTinyCore_plus_Debug_index.json
https://felias-fogg.github.io/MiniCore/package_MCUdude_MiniCore_plus_Debug_index.json

ปิดหน้าต่าง Preference ด้วย OK ไปเลย ตอนนี้เราจะลงสองคอร์ ATTinyCore กับ MiniCore:

  1. เลือก Tools -> Board -> Board Managers ... มันจะเปิดหน้าต่าง Boards Manager ออกมา
  2. ในช่องค้นหา พิมพ์ MiniCore ก่อน แล้วติดตั้งเวอร์ชันล่าสุด (หรืออัพเกรดไปเป็นล่าสุด) ที่มี suffix เป็น +debug-2.X
  3. เสร็จแล้วก็ทำแบบเดียวกันกับ ATTinyCore

เช็คอีกที: เลือก Tools -> Board -> ATTinyCore -> Attiny25/45/85 (no bootloader) แล้วลองเช็คว่ามีข้อความ Debug Compile Flags: "No Debug" โผล่มั้ย เวลาคลิกเข้า Tools อีกที อย่าลืมเช็คให้ Tools -> Board -> MiniCore -> Atmega328 ด้วยนะ

ขั้นตอนที่ 3: ติดตั้งเฟิร์มแวร์ dw-link

โหลดเฟิร์มแวร์ dw-link ไปไว้ในโฟลเดอร์ Arduino sketchbook ของตัวเองนะ หมายความว่าให้

  1. เปิดหน้าเว็บของ dw-link ขึ้นมา
  2. คลิกที่ Latest ในส่วน Releases
  3. เลือกระหว่าง zip กับ tar.gz
  4. ดาวน์โหลดแล้วก็คัดลอกไฟล์เก็บไว้ใน sketchbook
  5. แตกไฟล์เฟิร์มแวร์ออกมาด้วย unzip หรือ tar -xvzf

เพื่อติดตั้งเฟิร์มแวร์

  1. เริ่มด้วยการต่อบอร์ด Arduino UNO เข้ากับคอมด้วยสาย USB
  2. เปิด Arduino IDE ขึ้นมา แล้วเลือก Tools -> Board เป็น Arduino UNO
  3. บางทีอาจต้องเลือก Port ที่ถูกต้องในเมนู Tools ด้วย
  4. โหลดสเก็ตช์ dw-link เข้าไปใน IDE โดยไฟล์มันจะอยู่ที่ dw-link-x.y.z/dw-link/dw.link.ino
  5. สุดท้าย คอมไพล์แล้วอัพโหลดสเก็ตช์ลง UNO โดยกดปุ่มลูกศรขวา หรือกด CTRL-U (หรือ ⌘U บน Mac) ตอนนี้ UNO ของเราก็จะทำหน้าที่เป็นฮาร์ดแวร์ดีบักเกอร์แล้ว (แต่มันต้องมีฮาร์ดแวร์เสริมนิดหน่อย)

เช็คให้ชัวร์: เปิด Serial Monitor (ในเมนู Tools) เลือก 115200 baud พิมพ์ - (เครื่องหมายลบ) ลงในช่องบนสุด แล้วส่งออกไป ฮาร์ดแวร์ดีบักเกอร์ควรจะตอบกลับมาด้วย $#00

ขั้นตอนที่ 4: ตั้งค่าฮาร์ดแวร์

คำอธิบายนี้สำหรับการดีบัก ATtiny85 นะ แต่จริงๆ ATtiny หรือ ATmegaX8 แบบคลาสสิคตัวอื่นๆ ก็ทำได้เหมือนกัน แค่ระวังหน่อยถ้าจะลองดีบักบอร์ด Arduino UNO จริงๆ เพราะต้องไปแก้ไขบอร์ดทางกายภาพ (เช่นตัดสะพานบัดกรี) วิธีตั้งค่า UNO อธิบายไว้ในคู่มือ dw-link

Hardware setup as Fritzing sketch

จำไว้ว่าให้หันรอยบากหรือจุดบนตัว ATtiny ไปทางซ้ายนะ

นี่คือตารางการต่อสายทั้งหมด เอาไว้เช็คว่าต่อครบทุกจุดรึยัง

Connections

LED ระบบ (สีเหลือง) จะบอกสถานะภายในของดีบักเกอร์ให้เรารู้:

  1. ยังไม่ได้ต่อ (LED ดับ)
  2. รอให้รีไซเคิลไฟเป้าหมาย (LED กะพริบทุกวินาทีเป็นเวลา 0.1 วินาที)
  3. ต่อกับเป้าหมายแล้ว (LED ติดค้าง)
  4. กำลังโปรแกรม ISP (LED กะพริบช้าๆ)
  5. สถานะผิดพลาด เช่น ต่อกับเป้าหมายไม่ได้ หรือมีข้อผิดพลาดภายใน (LED กะพริบเร็วถี่ทุก 0.1 วินาที)

จำไว้ว่าสถานะที่ 2 (รีไซเคิลไฟ) จะถูกข้ามไปในการตั้งค่านี้ของเรา เพราะดีบักเกอร์จ่ายไฟให้เป้าหมายผ่านสาย GPIO เองและจัดการรีไซเคิลไฟให้เราแล้ว

เช็ค: ไล่เช็คทุกจุดในตารางด้านบนให้ครบนะน้อง! การต่อสายผิดนี่แหละตัวดี มันทำให้เราต้องมานั่งไล่บั๊กโค้ดแบบไม่รู้เรื่องเป็นชั่วโมงได้เลย

ล้วงลึกเทคนิค

  • โปรโตคอล debugWIRE (ดีบั๊กแบบสายเดียว):
    • Reset Pin แบบหลายหน้าที่: ไม่เหมือน JTAG ที่ใช้หลายขา, debugWIRE ทำงานผ่านขา RESET ขาเดียวเท่านั้น เฟิร์มแวร์ dw-link จะสื่อสารกับ ATtiny เป้าหมายโดยการดึงสัญญาณ RESET ให้เป็น HIGH/LOW ในช่วงเวลาที่กำหนด ($T_{unit}$) เพื่อส่งแพ็กเก็ตคำสั่งตรงเข้าไปยังระบบ On-Chip Debug (OCD) ข้างในชิป
    • การเปิดใช้งานโปรโตคอล: การจะเปิด debugWIRE ได้ ต้องปิดฟังก์ชัน Reset มาตรฐานแบบถาวรโดยการเปลี่ยน fuse bit (DWEN fuse) ซะก่อน การนี้จะเปลี่ยนขา Reset ให้กลายเป็นบัสข้อมูลสองทิศทางความเร็วสูงแทน
  • สะพานเชื่อม GDB (GNU Debugger) Server:
    • แปลคำสั่งจาก Host ไป Hardware: ตอนที่น้องกด "Debug" ใน Arduino IDE มันจะเปิด GDB Server ขึ้นมา โปรเจคนี้สร้าง "สะพาน" ขึ้นมาเพื่อแปลคำสั่งมาตรฐานของ GDB (เช่น step, break, print var) ให้กลายเป็นแพ็กเก็ตข้อมูลเฮ็กซ์ที่พอร์ต debugWIRE ของชิปเป้าหมายเข้าใจ
    • ดีบั๊กแบบเห็นสัญลักษณ์: เพราะ IDE คอมไพล์ด้วย -g (debug symbols) น้องจะเห็นโค้ด C++ เดิมของตัวเองระหว่างเซสชันดีบั๊ก แทนที่จะเห็นแค่คำสั่งแอสเซมบลีดิบๆ ซึ่งช่วยลด "ช่องว่างทางความคิด" เวลาแก้งานได้อย่างมาก
  • การออปติไมซ์สำหรับการดีบั๊ก (-Og):
    • การคอมไพล์มาตรฐานจะออปติไมซ์โค้ดเพื่อ "ขนาด" หรือ "ความเร็ว" ซึ่งมักจะสลับลำดับคำสั่ง ทำให้ไม่สามารถดีบั๊กทีละบรรทัดได้จริงๆ ไกด์นี้สอนให้น้องเลือกใช้ฟลัก "Optimize for Debugging" ซึ่งจะรักษาความสัมพันธ์ระหว่างบรรทัดโค้ดต้นฉบับกับคำสั่งเครื่องไว้
  • State Machine ของไฟสถานะ:
    • ไฟ LED สีเหลือง (System LED) ให้ข้อมูลวินิจฉัยแบบเรียลไทม์ มันใช้รูปแบบการกะพริบเฉพาะเจาะจงเพื่อแยกสถานะระหว่าง "รอเป้าหมาย" (ที่ดีบักเกอร์จะควบคุมการปิด-เปิดไฟให้) กับ "สถานะผิดพลาด" (ซึ่งบ่งบอกถึงปัญหาการชนกันของบัสหรือความสมบูรณ์ของสัญญาณบนเส้น Reset)

วิศวกรรมและการใช้งาน

  • จัดการกับ Reset จากความจุไฟฟ้า: ขั้นตอนวิศวกรรมที่สำคัญคือการวาง ตัวเก็บประจุ 10µF ระหว่างขา Reset กับ GND ของ Arduino Debugger ตัวนี้ป้องกันไม่ให้ UNO รีเซ็ตตัวเองตอนที่ GDB server เปิดพอร์ตอนุกรม ทำให้การเชื่อมต่อไปยังชิปเป้าหมายยังคงอยู่
  • ปิด-เปิดไฟเป้าหมายอัตโนมัติ: เฟิร์มแวร์ dw-link สามารถควบคุมไฟเลี้ยงให้ชิปเป้าหมายผ่าน GPIO ดิจิตอลได้อย่างชาญฉลาด ทำให้ดีบักเกอร์สามารถทำ "การปิด-เปิดไฟอัตโนมัติ" ซึ่งเป็นข้อกำหนดสำหรับการเข้าสู่โหมด debugWIRE ในบางรุ่นซิลิคอนของตระกูล ATtiny
  • ความปลอดภัยและการคืนสถานะ Reset: หลุมพรางฮาร์ดแวร์ยอดฮิตคือการ "ล็อค" ชิปไว้ในโหมดดีบั๊ก คู่มืออธิบายวิธีทำ การออกจากระบบอย่างสะอาด ซึ่งจะส่งคำสั่งพิเศษ quit เพื่อคืนค่า fuse ของ Reset กลับมา นี่เป็นขั้นตอนสำคัญมากถ้าน้องคิดจะนำชิปกลับมาใช้โปรแกรมแบบ ISP มาตรฐานอีกครั้ง
  • บูรณาการกับทูลเชนระดับโปร: การติดตั้ง ATTinyCore และ MiniCore definitions แบบปรับแต่งเอง จะทำให้นักพัฒนามี access ไปยัง core ระดับอุตสาหกรรมที่ได้รับการแพตช์เฉพาะเพื่อรองรับแบ็กเอนด์ dw-link สร้างเวิร์กโฟลว์ที่ราบรื่นตั้งแต่เขียนโค้ดบรรทัดแรก ไปจนถึงการตรึงฮาร์ดแวร์

หยุดเดาและเริ่มมองเห็น: ปลดล็อกสถานะภายในของซิลิคอน AVR ของคุณด้วยความแม่นยำระดับฮาร์ดแวร์

ขั้นตอนที่ 5: ดีบักโค้ด (Debugging)

เอาล่ะวัยรุ่น ถึงเวลาจัดการดีบักสเก็ตช์บนชิปเป้าหมายแล้ว ตรวจสอบให้แน่ใจว่า host (คอมพิวเตอร์ที่นั่งอยู่ตรงหน้า) เชื่อมต่อกับ hardware debugger (บอร์ด UNO) ด้วยสาย USB แล้ว และ hardware debugger ก็ต้องเชื่อมต่อไปยังชิป target (ATtiny85) ด้วยสายไฟ 6 เส้น ตามที่เราต่อไว้ในขั้นตอนที่ 4

  1. โหลดสเก็ตช์ที่ต้องการดีบักเข้า IDE โดยเลือก Open... ในเมนู File
  2. เลือกบอร์ดเป็น ATtiny25/45/85 (no bootloader) ภายใต้ Tools -> Board -> ATTinyCore
  3. ในเมนู Tools เลือก Clock Source เป็น 1 MHz (internal) (สมมติว่า ATtiny ยังเป็นค่าจากโรงงาน ยังไม่ได้เปลี่ยน fuse ใดๆ)
  4. ในเมนู Sketch เลือก Optimize for Debugging
  5. คอมไพล์โค้ดโดยคลิกปุ่ม Verify ที่มุมซ้ายบน
  6. เปิดหน้าต่างดีบักโดยคลิกไอคอนรูปแมลงเต่าทอง (บั๊กกับสามเหลี่ยม) ในแถบด้านซ้าย
  7. คลิกไอคอนดีบักในแถบบนเพื่อเริ่มดีบัก การกระทำนี้จะเริ่มต้นดีบักเกอร์และดีบักเซิร์ฟเวอร์ โดยจะแสดงล็อกใน Debug Console และ gdb-server console ที่มุมขวาล่างของหน้าต่าง
  8. หลังจากดีบักเกอร์และดีบักเซิร์ฟเวอร์เริ่มทำงานแล้ว ดีบักเกอร์จะเริ่มรันโปรแกรมบน target การทำงานจะหยุดที่บรรทัดแรกของฟังก์ชัน setup
  9. ถึงตรงนี้ก็เริ่มงานได้เลย! สามารถเซ็ตเบรกพอยต์, รันโปรแกรมต่อ, หยุดโปรแกรมแบบ asynchronous, ตรวจสอบและเปลี่ยนค่าตัวแปร, หรือดู stack frames ต่างๆ ได้เลย อยากจบเซสชันดีบักก็คลิกปุ่มสี่เหลี่ยมสีแดงในแถบดีบัก อย่าลืมไปศึกษาวิธีการใช้งานดีบักเกอร์เพิ่มเติมให้คล่องแคล่ว

อะไรจะพังได้บ้าง? (What can go wrong?)

อย่างแรก ปุ่มเริ่มดีบักอาจเป็นสีเทาและกดไม่ได้ นี่มักเกิดกับ MCU ที่ IDE ดีบักไม่ได้ ถ้าน้องคิดว่ามันผิดปกติ ลองติดตั้งไฟล์บอร์ดที่ถูกต้อง หรือเลือก Reload Board Data ในเมนู Tools ดู

อย่างที่สอง ดีบักเซิร์ฟเวอร์อาจหยุดทำงานก่อนเวลา ถ้าเป็นแบบนี้ควรมีข้อความแสดงข้อผิดพลาดในคอนโซล gdb-server

ถ้าอะไรไม่เป็นไปตามคาด ส่วนใหญ่ปัญหามักมาจาก การต่อสายผิด แหล่งปัญหาต่อมาคือการติดตั้งผิดพลาด เช่น ติดตั้งโปรแกรมไม่ถูกที่, ไม่มีสิทธิ์ที่เหมาะสม, ตัวแปร PATH ไม่ถูกต้อง, หรือติดตั้งไฟล์บอร์ดเมเนเจอร์ผิดเวอร์ชัน เวลาเห็นข้อความแปลกๆ โผล่มา นั่นอาจเป็นสัญญาณว่ามีบางส่วนยังไม่ได้ติดตั้ง ลองเสิร์ชหาข้อความผิดพลาดนั้นในกูเกิลดู มักจะมีคำแนะนำแก้ไขอยู่

ปัญหาที่น่ารำคาญสุดๆ คือ หลังจากจบเซสชันดีบัก MCU อาจไม่ตอบสนองอีกเลย สาเหตุอาจเป็นเพราะสัญญาณ RESET ซึ่งถูกใช้เป็นช่องทางการสื่อสารระหว่างดีบัก ยังไม่ถูกเปิดใช้งานกลับคืน แม้ว่าการออกจากดีบักเกอร์แบบปกติจะคืนค่า RESET line ให้ แต่ถ้าดีบักเกอร์ถูกปิดกะทันหันโดยไม่ได้คืนค่า ก็อาจเกิดปัญหานี้ได้ วิธีแก้ไขง่ายๆ คือ เข้าโหมดดีบักอีกครั้ง แล้วออกมาอย่างถูกต้อง (หลังจากเชื่อมต่อกับชิป target แล้ว) ด้วยคำสั่ง quit

ถ้าน้องเจอบั๊กจริงๆ ลองไปรายงานปัญหาพร้อมรายละเอียดให้ครบถ้วน จะได้ช่วยกันพัฒนาต่อไป

หลังจากดีบั๊กเสร็จแล้ว

แล้วเราจะเอาเครื่องมือดีบั๊กฮาร์ดแวร์ที่เพิ่งสร้างเสร็จไปทำอะไรต่อหลังจากดีบั๊กทุกอย่างเสร็จแล้วล่ะ? ไม่ต้องโยนทิ้งนะตัวนี้ มันยังทำหน้าที่เป็นโปรแกรมเมอร์ ISP (STK500 v1) ได้ด้วย ใน Arduino IDE โปรแกรมเมอร์แบบนี้จะเรียกว่า AVR ISP หรือ Arduino as ISP

หรือจะคิดต่อยอดไปอีกขั้น เอาไปใส่เคสให้มันดูทนทานขึ้นเป็นรูปเป็นร่างก็ได้ เรื่องพวกนี้มีอธิบายไว้ในคู่มือ dw-link แล้ว

ขอบคุณพี่ๆ ทุกคน

รุ่นพี่คนนี้ทุ่มเทแรงกายแรงใจสร้าง dw-link ขึ้นมา แต่ไม่ได้ทำทุกอย่างคนเดียวนะ เราใช้ประโยชน์จากซอฟต์แวร์โอเพ่นซอร์ส ไอเดีย และผลงานตีพิมพ์ของคนอื่นๆ มาอย่างหนัก ขอบคุณพวกเขามากๆ ที่แบ่งปันไอเดียดีๆ:

  1. RiskusW ที่ reverse engineering debugWIRE
  2. Jon Dolany และโปรเจกต์ avr_gdb ที่สร้าง gdb-stub สำหรับ ATmega328 และ ATmega ตัวอื่นๆ
  3. David C W Brown กับดีบักเกอร์ debgWIRE ชื่อ dwire-debug
  4. Wayne Holder กับ DebugWireDebuggerProgrammer
  5. ccrause กับ debugwire-gdb-bridge

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "dw-link firmware"
  - "ATTinyCore / MiniCore (Debug-Enabled Cores)"
author: "fogg"
category: "Lab Stuff"
components:
  - "1x Arduino Uno Rev3 (Hardware Debugger)"
  - "1x ATtiny85 (Target MCU)"
  - "1x 10µF Capacitor (Reset-Disable)"
  - "1x 10k Ohm Resistor (Pull-up)"
  - "1x 100nF Ceramic Capacitor (Bypass)"
  - "2x 220-ohm Resistors (LED Current Limiting)"
  - "1x red LED (Status)"
  - "1x yellow LED (Processing)"
  - "1x Breadboard & Jumper Wire Set"
description: "เปลี่ยน Arduino UNO ของเราให้เป็น Hardware Debugger เทพๆ สำหรับงาน Embedded ไปเลย! แค่ 5 ขั้นตอนง่ายๆ งานง่ายแต่หล่อ ใช้เวลาไม่เกินชั่วโมงก็เสร็จแล้ววว"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://github.com/felias-fogg/dw-link"
encryptedPayload: "U2FsdGVkX18G/PviISk1Ztp4g0UWS2QUnzz1TYCFcJoe6U+sT+OWD/6E8J7QatiQcJP97pd5IiOT/nqXp3vBEcpEYYPqgEjq3OcDOLP8zCA="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/debugging-classic-attinys-and-atmegax8-a-quickstart-guide-ea0179_cover.jpg"
lang: "en"
likes: 0
passwordHash: "7a73444a275ab780914216672d5d567aef073e9f79ef2aa96d6badd8275b3199"
price: 99
seoDescription: "Turn Arduino UNO into a hardware debugger for ATtiny and ATmegaX8 chips in Arduino IDE 2. Quick 5-step guide for embedded debugging."
tags:
  - "hardware-debugging"
  - "avr-architecture"
  - "debugwire"
  - "gdb-server"
  - "embedded-development"
title: "Debugging Classic ATtinys and ATmegaX8 in the Arduino IDE 2: A Quickstart Guide"
tools:
  - "Arduino IDE 2.3.4+"
videoLinks: []
views: 1760