Atmega328P Datasheet 14. PM - Power Management and Sleep Modes

Started by tha, November 01, 2017, 11:51:44 AM

Previous topic - Next topic

tha

พรายกระซิบบอก จะไปเช็คแฟลกทำใม เอาแฟลกออก ก็เออใช่สิ พออินเตอร์รัพท์ก็ตื่นจาก 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 ในดาต้าชีทประกอบ)

Quote
   // 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 นะ เผื่อใครหาไม่เจอ

tha

  นี่เอาสวิทช์อีกตัวมาคุม พอเราจะจากไปแล้ว เราก็กดสวิทช์ให้บอร์ดเข้าสู่ sleep mode เพื่อประหยัดพลังงาน พอเรากลับมาจะดูก็กดสวิทช์อีกตัว ให้บอร์ดมัน wake up ขึ้นมาทำงานอีก อย่างนี้

http://www.mediafire.com/file/y2bzx49tf11z3vo/sleep3_1.rar/file


tha



tha

  ขอแก้ใขโปรแกรม sleep4 หน่อย ตัวนี้ไม่ใช้ไลบรารี่เฮดเดอร์ไฟล์(เรียกว่ายังไงนะ) sleep.h ก็จะเซตเป็นบิทเอา แต่สรูปแล้วก็จะเหมือนกัน แต่โดยที่เฮดเดอร์ไฟล์ sleep.h จะรวมกันหลายๆเบอร์หน่อย เทคนิคการเขียนโปรแกรมก็จะไม่ค่อยจะคุ้นหน่อย เลยดูยาก แต่พอชำนาญแล้วก็จะเก่งเลยนะ ก็ลองไล่เช็คดู ไฟล์ sleep.h ใน  C:\WinAVR-20100110\avr\include\avr\sleep.h

http://www.mediafire.com/file/jro82or7d84byl6/sleep4_1.rar/file

ไล่ดูไฟล์ io.h ใน C:\WinAVR-20100110\avr\include\avr แล้วจะต่อมาหาไฟล์ iom328p.h เนื่องจากตอนที่เราสร้างโปรเจ็คใหม่ เราเลือกเบอร์ ATmega328p มาใช่ใหม ลองดูไฟล์ iom328p.h มีอะไรบ้าง

ไฟล์ interrupt.h ไฟล์ delay.h ก็ลองไล่เช็คดู ว่ามีฟังชั่นอะไรให้เราใช้ได้บ้าง