พรายกระซิบบอก จะไปเช็คแฟลกทำใม เอาแฟลกออก ก็เออใช่สิ พออินเตอร์รัพท์ก็ตื่นจาก sleep มาทำไฟกระพริบ PD6 ได้เลย จะไปเช็คแฟลกทำใม
มีอีกจุด (ดูตารางแถวแรกของ 14. PM - Power Management and Sleep Modes ประกอบ)
Sleep Mode Idle นี่สัญญานนาฬิกา IO Clock(CKio) ยังทำงาน เราก็สามารถตั้ง INT0 interrupt ที่ขอบขาขึ้น(rising edge) ที่ขอบขาลง(falling edge) ที่ทั้งสองขอบขา(Any Logical change) หรือที่สัญญานเป็นศูนย์(low level)ได้ (ดูบท External Interrupt ในดาต้าชีทประกอบ)
แต่ Power Down, Power Save, Standby Mode จะหยุดสัญญานนาฬิกา IO Clock(CKio) ด้วยใช่ใหม ทำให้ IO ไม่มีสัญญานนาฬิกา ทำให้ INT0 interrupt ตรวจจับได้ด้วยสัญญานที่เป็นศูนย์(low level)เพียงอย่างเดียว เราก็ต้องตั้ง INT0 interrupt ได้เป็นอย่างนี้ (ดูบท External Interrupt ในดาต้าชีทประกอบ)
// The low level of INT0 generates an interrupt request
// low level config ISC0[1:0] = 00 , see External interrupt section
EICRA &= ~(1<<ISC00);
EICRA &= ~(1<<ISC01);
หรือจะไม่เขียนอะไรที่จุดนี้เลยก็ได้ เพราะค่าเริ่มแรกของรีจีสเตอร์จะเป็น 0 อยู่แล้ว มีตัวอย่างโปรแกรม
http://www.mediafire.com/file/svs0zxjbl2ehy13/sleep3%25283%2529.rar/file
คราวนี้การใช้งาน อย่างไปนอกสถานที่ เราก็ใช้ถ่าน 3 ก้อน 4.5V เราก็ให้มันเข้าสู่ sleep mode ก่อนก็ได้ ถ้าเราไม่ได้อยู่ดูตลอด จะได้ประหยัดพลังงานถ่านไฟ พอเรามาดูอีกครั้งหนึ่ง เราก็กดสวิชท์ให้มัน wake up จาก sleep mode ให้มันทำงานก็ได้
เราก็ตั้ง Brown Out Detection 4.3V ไว้ก็ได้ ถ้าถ่านไฟต่ำกว่านี้ ให้บอร์ดไม่ทำงาน ให้เราเปลี่ยนถ่านใหม่
หรือเราจะเขียนโปรแกรมให้เป็นว่า กดสวิชท์อีกสวิชท์นึง แล้วถึงจะเข้าสู่ sleep mode ตอนที่เราไม่ต้องการดูบอร์ดแล้วหรือเราจะจากไปแล้ว อย่างนี้ก็ได้ พอเรากลับมาดูบอร์ดอีกครั้ง เราถึงกดสวิชท์ INT0 interrupt ให้บอร์ดมันตื่น(wake up) เพือจะดูบอร์ด จะได้ประหยัดถ่านไฟ
ปล.มาถึงเรื่อง External Interrupt เลย ก็อ่านมาก่อนอีก มันจะบทเดียวไม่ได้เพราะใช้ร่วมกัน งั้นงานแปลจะเริ่มที่ interrupt ก่อนเลยนะ ดูจะง่ายกว่า IO port เอาง่ายๆก่อน จะได้มีกำลังใจในการแปล เอายากก่อนเดี๋ยวจะน๊อค การแปลจะเอาตามดาต้าชีทเก่านะ ดาต้าชีทใหม่นี่จะเอาตัวเบอร์อื่นมาผสมเพิ่มมาเยอะแยะเลย ดาต้าชีทเก่าเคยเอามาลงใน Arduino MEGA328P แถวที่ 17 นะ เผื่อใครหาไม่เจอ