การเซตค่า Fuse bits ของ AVR

วันที่โพสต์: Oct 13, 2011 8:36:6 AM

การเซตค่า Fuse bits ของ AVR

การเซตค่า Fuse bits ของ AVR ในการเซตค่า Fuse bits ก็เป็นเหมือนกัน การที่เราได้ตั้งค่าในสัญญาณนาฬิกาของไมโครคอนโทรลเลอร์ ทำงานที่ความถี่ช่วงไหน ซึ่งถ้าหากเราตั้งค่าไม่ตรงกับอุปกรณ์สร้ัางสัญญาณนาฬิกาที่เราต่อเข้าไป ก็จะทำให้ ไมโครคอนโทรลเเลอร์ของเราทำงานได้ไม่ตรง หรือไม่ทำงานเลย วันนี้ เราจะมาดูตัวอย่างการตั้งค่า Fuse bits ของ Atmega48V กับ Crystal Oscillator 10 MHz กันสักหน่อยนะครับ 

อุปกรณ์ที่ใช้ทดลอง

 ในที่นี้ ผมขอยกตัวอย่าง AVR เบอร์ Atmega48V นะครับ ก่อนอื่นเราต้องโหลด Data sheet มาก่อน นะครับ เพราะทั้งหมด ทุกอย่าง อยู่ในดาต้าชีท แทบจะทุกอย่างอยู่แล้ว แต่อาจจะมีบางจุด บางเทคนิคที่เราต้องเก็บเกี่ยวประสบการณ์กันต่อไป

ส่วนแรกที่เราต้องสนใจก่อนเลย คือ ไมโครคอนโทรลเลอร์ที่เรากำลังเล่นอยู่นี้ มันสามารถที่จะทำงานได้ตั้งแต่ Clock ที่เท่าไหร่ ถึงเท่าไหร่ ในตระกูล AVR นี้ เค้าจะใช้คำว่า Speed Grade (อยู่หน้าแรก ของดาต้าชีทเลย)

จะเห็นว่า เบอร์ที่ลงท้ายด้วยตัว V นี้ จะสามารถใส่ Crystal ได้น้อยกว่า ตัวที่ไม่มีตัว V ต่อท้ายนะครับ ซึ่งผมก็เพิ่งจะทราบหลังจากที่ซื้อไอซีมาแล้ว เหมือนกัน T_T

ในหัวข้อใหญ่ข้อที่ 8 ดาต้าชีท จะอธิบายเกี่ยวกับ System Clock and Clock Options ซึ่งหัวข้อนี้แหละ เป็นหัวข้อสำคัญที่เราจะต้องให้ความสนใจเป็นอันดับแรก ก่อนที่เราจะทำการโปรแกรม Fuse bit ลงไป ซึ่งอย่างที่บอกไปแล้ว Fuse bits เป็นสิ่งที่เราจะทำก็ต่อเมื่อ เราได้ทำการออกแบบวงจร และต้องการให้ไมโครคอนโทรลเลอร์ของเราทำงานที่สัญญาณนาฬิกา ความถี่เท่าไร ซึ่งถ้าเราไม่ได้เปลี่ยนแปลง Crystal หรือแหล่งกำเนิดสัญญาณนาฬิกาแล้ว เราก็ไม่จำเป็นที่จะต้องเปลี่ยนแปลงค่าใน Fuse bits อย่างไร พูดง่ายๆก็คือ โปรแกรมไปแล้วครั้งแรก ครั้งเดียวก็พอ ไม่จำเป็นต้องโปรแกรมใหม่ ถึงแม้เราจะแก้โค๊ดไปมา ในระหว่างการเขียนโค๊ด และทดสอบก็ตาม

ในหัวข้อ 8.2 เรื่อง Clock Source เค้าได้บอกไว้ว่า แหล่งกำเนิดของสัญญาณนาฬิกา ที่เราเลือกใช้แตกต่างกัน เราก็ต้องกำหนดค่า Register CKSEL ต่างกันด้วย จากตาราง 8.1 

แรกเริ่มเดิมที หากเราไม่ได้โปรแกรม Fuse bits ลงไปก่อน สำหรับไอซี Atmega48V นี้ เราสามารถเอาไอซีมาต่อไฟเลี้ยงให้ แล้วสามารถเขียนโปแกรม แล้วสั่งให้มันสามารถทำงานได้เลย เพียงแต่ว่า ไอซีตัวนี้ จะทำงานด้วยความถี่สัญญาณนาฬิกา 1 MHz ซึ่งเป็นค่าปกติของไอซีตัวนี้ ที่ออกมาจากโรงงานเลย เราสามารถทำการตรวจสอบกับไอซีได้ด้วยใช้โปรแกรม เช่น Ponyprog200 หรือโปรแกรมอื่นๆ ที่เครื่องโปรแกรมเราสามารถทำงานได้ ในที่นี้ ผมมีเครื่องโปรแกรม ET-AVR ISP ซึ่งสามารถใช้งานได้บนโปรแกรม PonyProg2000 ผมก็เลยทำการอ่านค่า Fuse bits ของมันออกมาก่อน ดูสิว่าจะตรงกับค่าที่โรงงานโปรแกรมมาให้เราหรือเปล่า

 ค่าจากโรงงาน

(CKSEL = "0010", SUT = "10", CKDIV8 = "0")

 

ค่าที่อ่านได้จากโปรแกรม PonyProg2000

อย่าลืมว่า ถ้าติ๊กที่ช่อง ค่าจะถูกเซตเป็น “0” และถ้าปล่อยว่างไว้ ค่าจะถูกเซตเป็น “1” นะครับ

จะเห็นได้ว่า ค่าที่ได้ตรงกัน ตามที่ดาต้าชีทได้บอกไว้ แสดงว่า ผมได้ไอซีตัวนี้ ตัวใหม่เอี่ยม ออกมาจากโรงงานแน่ๆ (หรือเปล่า)

ที่นี้ ก็มาถึงขั้นตอนสำคัญ คือ เราจะเปลี่ยนแปลงแก้ไข ค่าของ Fuse bits ให้เป็นไปตามวงจรที่เราออกแบบกันนะครับ ในที่นี้ ผมต้องการให้ Atmega48V ของผมตัวนี้ ทำงานที่สัญญาณนาฬิกา 10 MHz นะครับ โดยรับสัญญาณนาฬิกามาจาก Crystal ที่ต่อเข้ากับขา 9 และ 10 ของ Atmega48V ตัวนี้ นะครับ

กลับมาที่ ตาราง 8.1 อีกครั้ง เราจะพบว่า ถ้าหากต้องการ ให้ Atmega48V ทำงานที่ Full swing Crystal Oscillator เราต้องให้ ให้ CLKSEL บิตที่ 0  ถึง บิต ที่  3 มี ค่า เป็น 0111 หรือ 0110  แต่ ถ้ามันมี สองค่า ให้เลือกอย่างนี้ แสดงว่า ต้องมีปะไร ที่แตกต่างกันแน่นอน เราลองมาดูตางรางข้างล่างต่อ มานะครับ 

จากตารางที่ 8.6 เราจะเห็นว่า เป็นเรื่อง Start up time สำหรับโหมด Full Swing โหมด (ตอนนี้ ให้เราสนใจไปที่ Full Swing mode ของทุกตารางเท่านั้น ) เราจะเห็นว่า ค่าที่เราจะเลือกนี้ มันจะสอดคล้องกับค่าในตาราง 8.1 ด้วย จะเห็นว่า ที่ CLKSEL0 นั้น จะเป็นตัวบอกว่า ถ้าเราเลือกให้ Start up time ที่แตกต่างกัน ย่อมทำให้ CLKSEL0 และ SU1..0 ต่างกันด้วย ในที่นี้ ผมเลือก CLKSEL0 = 1 และ SUT1..0 = 11 ซึ่งเป็นการสั่งให้ไมโึครคอนโทรลเลอร์ เริ่มทำงาน หลังจากที่เราป้อนไฟให้กับวงจรไปแล้ว โดยให้ทำงานช้ากว่าสภาวะ Reset เป็นเวลารวม 14 clock รวมกับเวลา delay time เพิ่มอีก 65ms เหตุผลก็เพราะว่า เราต้องการให้สัญญาณนาฬิกา มีความคงที่ก่อน หลังจากที่เราป้อนไฟเลี้ยงให้วงจร 

ฉะนั้น เราจะได้ค่าในการตั้งค่า Fuse bits ให้กับ Atmega48V ให้ทำงานกับคลิสตอลภายนอก 10 MHz ด้วยค่า Fuse bits ที่ได้จากตารางต่อไปนี้

CLKSEL3 = 0 (programmed)

CLKSEL2 = 1 (unprogrammed)

CLKSEL1 = 1 (unprogrammed)

CLKSEL0 = 1 (unprogrammed)

SUT1 = 1     (unprogrammed)

SUT0 = 1     (unprogrammed)

CKDIV8 = 1  (unprogrammed)

ทำการติ๊กเครื่องหมายถูกที่ PonyProg2000 ที่ช่อง CLKSEL3 เท่านั้นนะครับ เพราะถ้าไม่ติ๊ก (Unprogrammed)  มีค่าเท่ากับ 1 

แต่ถ้าติ๊กเครื่องหมายถูก (Programmed) มีค่าเท่ากับ 0  ฉะนั้นเราจึงติ๊ก เฉพาะที่ช่อง CLKSEL3 แล้วให้ทำการกดปุ่ม Write แล้วลอง Read กลับมาดู ก็จะพบว่า เฉพาะที่ช่อง CLKSEL3 เท่านั้น ที่มีเครื่องหมายถูกอยู่ 

แล้วถ้าเราใช้โปรแกรมอื่นๆ ในการตั้งค่า Fuse bits หล่ะ ก็ตอบได้ไม่ยากครับ หลักการก็ยังคล้ายๆกัน ผมยกตัวอย่างเช่น ผมใช้โปรแกรม STK500 โปรแกรมแบบ Command line ได้ดังนี้

ซึ่งก็ให้ผลลัพธ์เหมือนกัน 

ในที่นี้ ผมได้ทำวีดีโอตัวอย่างการตั้งค่า Fuse bits ด้วยโปรแำกรม CodeVision มาให้เพื่อนๆ ได้รับชมกันด้วย ลองดูครับ