Hello world, I am AVR

Hello world, I am AVR

    มีคำกล่าว ที่บอกต่อๆ กันมาว่า ครั้งแรกของการเขียนโปรแกรม เราจะต้องประกาศให้โลกรู้ว่าเราได้เริ่มต้นสำเร็จแล้ว ด้วยการสั่งให้โปรแกรมปริ้นท์ หรือแสดงข้อความว่า "Hello world" ออกมา เช่นเดียวกันกับงานพัฒนา Embedded เราจะต้องให้เจ้า AVR ไมโครคอนโทรลเลอร์ของเราที่กำลังศึกษาตัวนี้ สามารถทักทายชาวโลกให้สำเร็จให้ได้ แต่ในขั้นตอน ที่จะให้ AVR แสดงข้อความออกมานั้น มันจะเป็นการเริ่มต้นที่ยากไปสำหรับมือใหม่ ธรรมเนียมนิยมก็เลยเลือกปฏิบัติด้วยการสั่งให้หลอด LED ที่ต่ออยู่กับขา Digital output ของไมโครคอนโทรลเลอร์สั่งให้หลอดไฟกระพริบติดับ ได้ตามจังหวะ นั่นก็ถือว่า เราได้ทักทายชาวโลก ด้วยการแสดงสัญญลักษณ์แทนการ "Hello world" เรียบร้อยแล้ว

    ในตอนนี้เราจะมาเริ่มต้นทำให้เจ้า AVR ของเรา "Hello world" ให้ได้ เพื่อเป็นการเช็คความเข้าใจขั้นพื้นฐาน และเช็คความพร้อมของเครื่องมือ ตลอดจนเช็คสภาพไอซีว่าอยู่ในสภาพที่ใช้งานได้ และวงจรอิเล็กทรอนิกส์ที่เรากำลังต่อให้มันถูกต้องตามหลักวงจรไฟฟ้าและคู่มือของมัน

    สิ่งที่เราต้องทราบเป็นอย่างแรกก็คือไอซีไมโครคอนโทรลเลอร์ที่เรามีอยู๋ในมือตอนนี้เบอร์อะไร สังเกตง่ายๆ ที่ด้านบนตัวไอซี อาจจะพิมพ์ด้วยตัวอักษรสีขาว (ด้วยหมึก) หรือสีทอง (ด้วยการพิมพ์ด้วยเทคโนโลยี ยิงแสงเลเซอร์) บนตัวไอซี

อย่างเช่นไอซีตัวนี้ เขียนไว้ ATMEL 1145A ATMEGA48V-10PU ซึ่งถ้าเห็นครั้งแรก เราอาจจะคิดไปว่าเลข 1145A ใช่หรือเปล่า หรือว่าเป็นเบอร์ ATMEGA48V-10PU กันแน่ที่เป็นเบอร์ของไอซีเบอร์นี้ วิธีง่ายที่สุดก็ลองเอาค้นดูใน Google ครับ แต่ถ้าเป็นคนที่เคยผ่านงานพวกนี้มาแล้ว ตอบได้ทันที ว่า เบอร์ ATMEGA48V-10PU นั่นแหละคือเบอร์ของไอซีตัวนี้ (ถ้านำหน้าด้วย ATMEGA แสดงว่าอยู่ในตระกูล atmega) ที่นี้ เราก็ต้องไปโหลด data sheet ของเบอร์นี้มาดูครับ โหลดได้ที่นี่

    พอเปิดไฟล์ pdf ขึ้นมาหลายคนอาจจะตกใจ ไม่รู้จะเริ่มต้นตรงไหนเป็นภาษาอังกฤษหมดเลย (ไม่รู้เมื่อไหร่จะทำภาษาไทยสักที) เป็นปัญหามากๆ กับคนไทยหลายๆคน  (รวมทั้งผมด้วย) แต่ ทุกอย่างต้องมีการเริ่มต้นครับ บนถนนสายนี้ ปฏิเสธไม่ได้เลย ที่คุณจะไม่อ่านดาต้าชีทที่เป็นภาษาต่างประเทศ อย่าเพิ่งท้อครับ ใหม่ๆ ก็ลำบากนิดหนึ่ง นานๆ ไปเราจะชินเอง เราจะรู้จุดทีั่ควรโฟกัสเป็นพิเศษ ซึ่งบางครั้งเราอาจจะไม่จำเป็นต้องดูทั้งหมดก็ได้ ซึ่งในครั้งแรกนี้ ผมจะบอกวิธีเอาตัวรอดครั้งนี้ไปให้ได้ก่อน เพื่อ "Hello world" ครั้งแรกของเราก่อน

    อันดับแรกก็ดูจากรหัสบนตัวไอซีก่อน ในที่นี้ เราได้เบอร์ ATMEGA48V-10PU เราก็มาดูกันว่า รหัสเลขนี้บอกอะไรเราบ้าง จากดาต้าชีทหน้า 350 จะบอกเกี่ยวกับรหัสบนตัวไอซี จากข้อมูลที่ได้มา บอกว่าไอซีเบอร์ ATMEGA48V-10PU ต้องการไฟเลี้ยง หรือ Power supply อยู่ในย่าน 1.8V- 5.5V ไฟกระแสตรง ทำงานที่สัญญาณนาฬิกา 10 MHz เกรดอุตสาหกรรม อุณหภูมิระหว่าง -40 ถึง 85 องศาเซลเซียส ที่รับประกันว่ามันจะยังทำงานได้ปกติ

จริงๆ มีหมายเหตุอยู๋นิดหน่อย ถ้าสังเกตดีๆ ที่หมายเลข 10 ในช่อง Speed (MHz) จะมีเลข 3 อยู่ หากเราคลิกไปที่หมายเลขนั้น มันจะบอกให้ไปดู note ข้อ 3 ซึ่งจะทำลิ้งค์ให้ไปดูรูปที่ Figure29-1 หน้า 305 เมื่อตามไปดูจะพบรูปดังกล่าว

อธิบายได้ว่า หากต้องการป้อนความถี่สัญญาณนาฬิกา 10MHz (เราอยากได้แบบว่าทำงานได้เร็วสูงสุดที่มันจะทำได้) เราต้องป้อนแรงดัน VCC หรือ Power supply ให้ ATmega48V นี้ ไม่ต่ำกว่า 2.7V จึงจะถือว่าทำงานได้ปลอดภัยเป็นไปตามที่โรงงานได้ออกแบบและทดสอบมา

    พอเราทราบแรงดันแหล่งจ่ายไฟแล้ว และทราบว่าแหล่งสัญญานาฬิกาแล้ว คำถามต่อมาก็คือเราจะต่อวงจรให้มันอย่างไร เรามาดูกันต่อที่หน้าที่เขียนว่า Pin Configuration ซึ่งจะบอกรายละเอียดหน้าที่แต่ละขาของไมโครคอนโทรลเลอร์ ตลอดจนตำแหน่งที่เริ่มนับขาของมัน ว่าอยู่ตรงตำแหน่งไหน ซึ่งจากข้อมูลที่เราได้จากหน้า Order Information บอกไว้ว่าลักษณะ Package หรือตัวไอซีของเราเป็นแบบรหัส 28P3

28P3 28-lead, 0.300” wide, plastic dual inline package (PDIP)

นั่นแปลว่าเราจะต้องโฟกัสไปที่ภาพ PDIP จะเห็นการจัดเรียงขาและชื่อเรียกแต่ละขา ซึ่งชวนให้เรา งวยงง ต่อไปอีก ในขั้นต้นให้ตัดความสงสัยออกไปก่อน (แต่ถ้าใจร้อนก็อ่านดาต้าชีทให้จบไปเลย) เราจะสังเกตเห็นขาที่เขียนว่า VCC,GND ซึ่งนั่นแหละเป็นขาสำหรับจ่ายไฟเลี้ยงให้กับตัวไอซีนี้

จากรูปจะเห็นว่ามีขาที่ 7 เขียนว่า VCC ที่ตำแหน่งนี้ เราจะเอา Power supply ไฟกระแสตรงขั้วบวก(+) แรงดันไม่เกิน 5.5V จ่ายเข้าไปที่ขานี้ ส่วนขา ที่ 8 ซึ่งเขียนว่า GND เราจะเอาขั้วลบ(-) หรือ 0V ของ Power supply ของเราจ่ายเข้าที่ขานี้ ก็เป็นเรียบร้อยสำหรับเรื่องแหล่งจ่ายไฟที่จะป้อนให้กับ Atmega48V

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

จากดาต้าชีทส่วนที่เกี่ยวข้องกับเรื่อง clock ในหัวข้อที่ 9. System clock and clock options จากตารางที่ 9.1 เขาบอกไว้ว่าเราสามารถเลือกแหล่งกำเนิดสัญญาณนาฬิกาได้หลายแบบ แต่ในที่นี้ผมเลือกแบบ Full swing crystal oscillator และในดาต้าชีทได้แสดงวิธีการต่อวงจรไว้ที่รูป Figure 9-2

ซึ่งจะต้องต่อเข้ากับขา XTAL1 และ XTAL2 ของตัวไอซี ATmega48 ที่ขา XTAL1 และ XTAL2 ซึ่งตรงกับขาที่ 9 และ 10 ของไอซี และจะต้องต่อคาปาซิเตอร์ C1 และ C2 ต่อขนานกับกราวด์ GND ด้วย ซึ่งในดาต้าชีทได้แนะนำค่า C1 และ C2 ไว้ อยู่ระหว่าง 12 - 22 pF ในที่นี้ผมใช้ค่า 22pF ทั้ง C1 และ C2 เป็น ตัวเก็บประจุชนิดเซรามิค (Ceramic Capacitor) ไม่มีขั้ว ก็เป็นอันเสร็จขั้นตอนการต่อสัญญาณนาฬิกาเข้ากับระบบ

กลับมาที่หัวข้อ Pin Configuration หัวข้อที่ 1.1.5 PC6/RESET ซึ่งในคู่มือบอกไว้ว่า

If the RSTDISBL Fuse is unprogrammed, PC6 is used as a Reset input. A low level on this pin

for longer than the minimum pulse length will generate a Reset

แปลว่าถ้ารีจิสเตอร์ RSTDISBL ไม่ได้ถูกโปรแกรม ขา PC6 จะทำหน้าที่เป็นตัวรับสัญญาณขาเข้า ซึ่งถ้าเกิดสัญญาณ Logic low ที่ขานี้แล้ว จะทำให้เกิดกระบวนการรีเซต ซึ่งก็เหมือนกับการที่เรากดปุ่มรีเซตที่หน้าเครื่องคอมพิวเตอร์เหมือนกัน จะทำให้ระบบรีบูตตัวเอง และกลับไปที่จุดเริ่มต้นใหม่ เอาเป็นว่าตอนนี้ เราข้ามความสงสัยไปก่อนว่า RSTDISBL คืออะไร สนใจเพียงว่า เราต้องต่อวงจรที่ทำหน้าที่เหมือนปุ่มรีเซตก่อน จากข้อมูลที่เราได้ ระบบจะเข้าสู่สภาวะรีเซตได้ เราจะต้องทำให้ที่ขา PC6 มีสภาวะเป็น 0 โวลท์ ในทางตรงกันข้าม หากไม่ต้องการให้ระบบเข้าสู่โหมดรีเซต เราก็ต้องทำให้ PC6 นั่นมีแรงดันเป็น Logic High ในทางดิจิตอล ในการที่จะทำให้เกิดการทำงานแบบนั้นได้ เราจะต่อวงจรแบบ Active Low (อ่านเพิ่มเติม) ไว้ที่ขา PC6 ซึ่งก็คือขาที่ 1 ของไอซีนั่นเอง

หมายเหตุ จะสังเกตว่าคำว่า RESET มีเส้นขีดบนตัวอักษร นั่นแปลว่า หากต้องการให้ทำงานโหมด RESET ต้องทำให้เกิด Logic low ที่ขานี้

มาถึงตรงนี้ ไอซีก็ได้รับการต่อวงจรที่จำเป็นในการทำงานแล้ว ในลำดับต่อไป เราจะมาเริ่มงานทางด้านซอร์ฟแวร์กันบ้าง โดยเราจะเริ่มทำการเขียนโปรแกรมเพื่อให้ไอซีทำการสั่งให้หลอด LED (ซึ่งเราจะมาต่อเพิ่มภายหลัง) ให้ทำการกระพริบติดดับให้ได้

เนื้อหาในตอนนี้ ชักจะยาวเกินจะอ่านไหวหล่ะ เราไปต่อกันใน ตอนที่ 2 ดีกว่า ซึ่งจะว่ากันในส่วนของโปรแกรมมิ่งล้วนๆ