Electoday 4.0

ไมโครคอนโทรลเลอร์ => AVR and Arduino => Topic started by: tha on November 01, 2017, 11:51:44 am

Title: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 01, 2017, 11:51:44 am
รอตัวโปรแกรม ET-AVR ISP mkII ยังไม่ได้สักที จะขึ้นเรื่องใหม่เรื่อง clock ก็ยังไม่จบ ยังไม่ได้ลองกับตัวเอง จะขึ้นเรื่องใหม่ก็จะมั่วกันไปมา พรายกระซิบบอกให้ขึ้นหัวข้อใหม่แยกกันไปเลย จะได้ไม่สับสน ก็ดีเหมือนกัน

14. PM - Power Management and Sleep Modes

14.1. Overview
Sleep modes ทำให้ the application สามารถ shut down โมดูลที่ไม่ได้ใช้งานใน the MCU,  ซึ่งช่วยประหยัดพลังงาน. The device จัดให้มี sleep modes อย่างหลากหลายทำให้ผู้ใช้สามารถปรับการใช้พลังงานให้เหมาะสมกับความต้องการใช้งาน

เมื่อเปิดใช้งาน, the Brown-out Detector (BOD) จะโมนิเตอร์ตรวจสอบ the power supply voltage ในระหว่าง the sleep periods. เพื่อประหยัดพลังงานมากขึ้นคุณสามารถปิดการใช้งาน the BOD ในบาง sleep modes. ดูที่หัวข้อ BOD Disable ด้วย.
Note: BOD disable มีให้ใช้แต่ใน ATmega328P เท่านั้น.

14.2. Sleep Modes
ตารางต่อไปนี้แสดง sleep modes ต่างๆ, ความสามารถของ BOD disable และ wake-up sources ของพวกมัน.

(https://i.imgur.com/ZSOPx0f.png)

Note:
1. แนะนำเฉพาะกับ external crystal หรือ resonator ถูกเลือกเป็น clock source เท่านั้น.
2. ถ้า Timer/Counter2 กำลังรันใน asynchronous mode.
3. สำหรับ INT1 และ INT0, มีเพียง level interrupt เท่านั้น

เพื่อที่จะเข้า the six sleep modes ใดโหมดหนึ่ง, the Sleep Enable bit ใน the Sleep Mode Control Register (SMCR.SE) ต้องถูกเขียนให้เป็น '1' และ a SLEEP instruction ต้องถูกปฏิบัติ. Sleep Mode Select bits (SMCR.SM[2:0]) ที่เลือก sleep mode ใดโหมดหนึ่ง(Idle, ADC Noise Reduction, Power-down, Power-save, Standby, or Extended Standby) จะถูกทำให้เป็นผลโดยคำสั่ง the SLEEP instruction.

หมายเหตุ: The block diagram ใน the section System Clock and Clock Options จัดให้มีภาพรวมที่คอบคุม the different clock systems ต่างๆใน the device, และการแจกจ่ายของมัน. รูปนี้เป็นตัวช่วยในการเลือก an appropriate(ที่เหมาะสม) sleep mode.

ถ้า an enabled interrupt เกิดขึ้นขณะที่ the MCU อยู่ใน a sleep mode, the MCU จะ wakes up. จากนั้นThe MCU จะหยุดเป็นเวลา 4 cycles นอกเหนือจาก the start-up time, การปฏิบัติ the interrupt routine, และหวนคืนปฏิบัติการคำสั่งที่ต่อจาก SLEEP. สิ่งที่บรรจุอยู่ใน the Register File and SRAM จะไม่เปลื่ยนแปลงเมื่อ the device ตื่นจาก sleep. ถ้า a reset เกิดขึ้นในระหว่าง sleep mode, the MCU จะ wakes up และปฏิบัติการจาก the Reset Vector.
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: 9arduino on November 02, 2017, 05:59:24 am
ขอบคุณมากครับ  ;)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 21, 2017, 12:48:46 pm
พรายกระซิบมาบอกว่าให้เรียงลำดับไป ไม่เอาข้าม เลยไล่มาตามคำขอ ก็ดีเหมือนกัน ข้ามไปบางทีก็ไม่รู้เรื่อง  :)

14.3. BOD Disable
เมื่อ the Brown-out Detector (BOD) ถูกเปิดใช้งานโดย BODLEVEL fuses (ดูที่ section Fuse Bits ด้วย), the BOD จะทำงานคอยตรวจสอบ the power supply voltage ในระหว่าง a sleep period. เพื่อประหยัดพลังงาน, มันสามารถปิดการใช้งาน the BOD โดย software สำหรับบาง the sleep modes. ดังนั้น The sleep mode power consumption จะอยู่ในระดับเดียวกันเหมือนกับเมื่อ BOD ถูกปิดใช้งานโดยรวมโดยการเซท fuses. ถ้า BOD ถูกปิดใช้งานใน software, the BOD function จะถูก turned off โดยทันทีหลังจากการเข้าสู่ the sleep mode. เมื่อ wake-up จาก sleep, BOD จะเปิดใช้งานอย่างอัตโนมัติอีกครั้ง. นี้เพื่อให้แน่ใจว่าการทำงานจะปลอดภัยในกรณีที่ the VCC level ลดลงในช่วง the sleep period.

เมื่อ the BOD อยู่ในระหว่างการปิดใช้งาน, the wake-up time จาก sleep mode จะอยู่ประมาณ 60μs เพื่อให้แน่ใจว่า the BOD ทำงานได้ถูกต้องก่อนที่ the MCU จะปฏิบัติ code ต่อไป

BOD disable ถูกควบคุมโดย the BOD Sleep bit ใน the MCU Control Register (MCUCR.BODS). การเขียนบิทนี้เป็น '1' จะ turns off the BOD ใน relevant sleep modes, ในขณะที่เขียนศูนย์ในบิตนี้ทำให้ BOD ทำงานอยู่ ค่าเริ่มต้นที่เซทไว้คือ BODS = 0 ทำให้ BOD ทำงาน

Note: การเขียนถึง the BODS bit ถูกควบคุมโดย a timed sequence และ an enable bit.
Note: BOD disable มีให้ใช้งานเฉพาะสำหรับ ATmega328P เท่านั้น
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 25, 2017, 10:11:28 am
14.4. Idle Mode
เมื่อ the SM[2:0] bits ถูกเขียนให้เป็น '000', คำสั่ง the SLEEP instruction ทำให้ the MCU เข้าสู่ Idle mode, จะหยุด the CPU แต่ยอมให้ the SPI, USART, Analog Comparator, 2-wire Serial Interface, Timer/Counters, Watchdog, และ the interrupt system ทำงานต่อไป. sleep mode นี้จะหยุด clkCPU และ clkFLASH, ขณะที่ยอมให้ clocks อื่นๆรัน.

Idle mode เปิดใช้งาน the MCU ให้ wake up จาก external triggered interrupts เช่นเดียวกันกับอินเตอร์รัพท์จากภายในอย่างเช่น the Timer Overflow และ USART Transmit Complete interrupts. ถ้า wake-up จาก the Analog Comparator interrupt ไม่ถูกต้องการ, the Analog Comparator สามารถถูกลดพลังงานลงโดยการเซท the ACD bit ใน the Analog Comparator Control และ Status Register – ACSR. นี้จะลดการกินพลังงานใน Idle mode ลง.
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 25, 2017, 10:40:22 am
14.5. ADC Noise Reduction Mode
เมื่อ the SM[2:0] bits ถูกเขียนด้วย '001', คำสั่ง the SLEEP instruction ทำให้ the MCU เข้าสู่ ADC Noise Reduction mode, จะหยุด the CPU แต่ยอมให้ the ADC, the external interrupts, the 2-wire Serial Interface address watch, Timer/Counter2(1), and the Watchdog to  ทำงานต่อไป (ถ้าเปิดใช้งาน). sleep mode นี้โดยทั่วไปแล้วจะหยุด clkI/O, clkCPU, และ clkFLASH, ขณะที่ยอมให้ clocks อื่นๆรัน

นี้จะปรับปรุง the noise environment สำหรับ the ADC ให้ดีขึ้น, ทำให้สามารถทำการวัดด้วยความละเอียดที่สูงขึ้น. ถ้า the ADC ถูกเปิดใช้งาน, การแปลง ADC จะเริ่มโดยอัตโนมัติเมื่อเข้าสู่โหมดนี้. นอกเหนือจาก the ADC Conversion Complete interrupt, เหตุการณ์เหล่านี้สามารถ wake up the MCU จาก ADC Noise Reduction mode:

• External Reset
• Watchdog System Reset
• Watchdog Interrupt
• Brown-out Reset
• 2-wire Serial Interface address match
• Timer/Counter2 interrupt
• SPM/EEPROM ready interrupt
• External level interrupt on INT
• Pin change interrupt
Note: 1. Timer/Counter2 จะรันต่อไปใน asynchronous mode เท่านั้น.
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 27, 2017, 02:10:24 am
ลองทำ Idle Sleep Mode ดู ใช้บอร์ด atmega328p ที่ทำเอง ทำทั้งแบบ เซท register และใช้ library
ถ้าเซท register ก็เช็ค register ใน data sheet บิทไหนเป็นบิทไหนบ้าง
ถ้าใช้ library ก็ดูไฟล์ตาม folder นี้  C:\WinAVR-20100110\avr\include\avr

การต่อสวิทช์ใช้ R pull up ภายนอก เลยต้องเช็ค interrupt ที่ขอบขาลง ของ INT0 ขา PD2 เพื่อ wake up จาก idle sleep mode

http://www.mediafire.com/file/51dyu5j7jk5898o/sleep1.rar (http://www.mediafire.com/file/51dyu5j7jk5898o/sleep1.rar)
http://www.mediafire.com/file/x98xj8ukp7ip81v/sleep2.rar (http://www.mediafire.com/file/x98xj8ukp7ip81v/sleep2.rar)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 28, 2017, 06:19:16 am
ตัวอย่างโปรแกรมผมก็เอามาจากหนังสือ การเขียนโปรแกรมควบคุมไมโครคอนโทรลเลอร์ AVR ด้วยภาษา C กับ WinAVR (C Complier) นั่นแหละ มาดัดแปลงเอา ในหนังสือเขาใช้ atmega16 ส่วนผมใช้ atmega328p ใครอยากรู้รายละเอียดแน่นๆ ก็หาซื้อหนังสือมาอ่านเอานะครับ
http://www.appsofttech.com/store/product/view/C_Programming_for_AVR_Microcontroller_Book_1-19590643-en.html (http://www.appsofttech.com/store/product/view/C_Programming_for_AVR_Microcontroller_Book_1-19590643-en.html)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 28, 2017, 07:35:20 am
นี่ก็มี http://www.thaieasyelec.com/products/education/books/avr-programming-using-c-vol-1-detail.html (http://www.thaieasyelec.com/products/education/books/avr-programming-using-c-vol-1-detail.html)

เรื่อง ADC Noise Reduction Mode คงยังไม่ได้ทำ เพราะว่ายังทำ ADC ไม่เป็นครับ
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 29, 2017, 05:36:41 am
พรายกระซิบบอก ให้ลองทำตัวอย่าง ADC Noise Reduction Mode ดู เอ๊ะแล้วในเน็ตมีมั๊ยนี่ ทำยังไงหล่ะทีนี้ ลองเช็คตัวอย่างของ ETT กับของหนังสือ การเขียนโปรแกรมควบคุมไมโครคอนโทรลเลอร์ AVR ด้วยภาษา C กับ WinAVR (C Complier) ดู คงต้องร่ายจาก usart ไป adc แล้วถึงจะทำ ADC Noise Reduction Mode ได้ ลุยไปหลายบทเลยนะ data sheet นี่ก็ดันเอาเรื่องยากขึ้นก่อน ม๊ะ มาลองดูกัน เช็คบิทกันเวียนหัวเลย แต่ arm 32 bit ก็ผ่านมาแล้ว 8 bit เลยกลายเป็นของหมูๆ  ;D
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 29, 2017, 09:55:23 am
เลยต้องทำ usart ไปด้วย เพื่อที่จะเอาค่า adc มาแสดง ได้ตัวอย่างของ ETT มา เลยเร็วหน่อย ตัวอย่าง usart ของหนังสือดูค่อนข้างยากเพราะใช้ stdio file ยังไม่ได้ไล่เช็ค library เลยงงหน่อย ต้องขอขอบคุณทั้งสองจ้าวมา ณ ที่นี้ด้วย ไม่ว่ากันนะที่เอาตัวอย่างมาแสดง  :D

http://www.mediafire.com/file/jf9a49odcvwewc9/usart1.rar (http://www.mediafire.com/file/jf9a49odcvwewc9/usart1.rar)

ระวังตั้งค่า hyper terminal ด้วยเพราะบิท stop มี 2 bits
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 29, 2017, 10:04:17 am
ดูตัวอย่างนี้แล้ว น่าจะตรงหน่อย (ยังดูไม่จบ) เลยเก็บเอาไว้ก่อนครับ

https://www.youtube.com/v/ad7gD7WHm0E
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 29, 2017, 12:29:36 pm
ลองทำตัวอย่าง adc แสดงใน usart ก่อน ก็ทำงานได้ บอร์ด atmega328p รายละเอียดดูในหนังสือกับตัวอย่างของ ETT กับลิ้งค์นี่ก็ดีครับ
http://maxembedded.com/2011/06/the-adc-of-the-avr/ (http://maxembedded.com/2011/06/the-adc-of-the-avr/)

http://www.mediafire.com/file/i276ln9767u6cu3/adc_usart1.rar (http://www.mediafire.com/file/i276ln9767u6cu3/adc_usart1.rar)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 29, 2017, 01:40:00 pm
คราวนี้ทำ ADC Noise Reduction Mode บอร์ด atmega328p เข้า sleep mode ครั้งแรกมันสามารถแปลง ADC ได้พร้อมทั้ง wake up เอาค่ามาแสดงผลได้ พอวนกลับมา sleep mode ครั้งที่สอง มันเงียบไปเลย ไม่ wake up มาแสดงผลเลย ไม่รู้เป็นไร ต้อง reset เอาถึงจะแปลงที ช่วยเช็คดูให้หน่อยครับ มึนแล้ว

http://www.mediafire.com/file/ac6xd7zjc9nwxa8/adc_usart2.rar (http://www.mediafire.com/file/ac6xd7zjc9nwxa8/adc_usart2.rar)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 30, 2017, 12:33:29 pm
พบจุดที่ผิดแล้วครับ มันเป็นความเข้าใจผิดของผมเอง ที่ต้องการให้บิทไหนเป็น "0" แล้วทำแบบนี้
// Interrupt ADC
ISR (ADC_vect)
{
   ADCSRA &= (0<<ADIF);  // clear interupt flag
}
ถ้าทำแบบนี้แล้ว หมายถึงทั้ง register ถูก and ด้วย "0" ทั้งหมด ที่จริงต้องกลับเฉพาะบิทนั้นเป็น "0" ส่วนบิทอื่นเป็น "1" แล้วค่อย and อย่างนี้
// Interrupt ADC
ISR (ADC_vect)
{
   ADCSRA &= ~(1<<ADIF);  // clear interupt flag
}
ถึงจะกระทบเพียงบิทเดียว อย่างนี้ถูกต้องใหมครับ  ;D
คราวนี้ก็ได้แล้ว ADC Noise Reduction Mode ลดสัญญานรบกวนขณะทำการแปลง adc พอเข้า sleep mode แล้วปิด clock ที่ไม่จำเป็น แล้วทำการแปลง adc เมื่อเสร็จแล้ว ก็ ADC interrupt complete แล้ว wake up เข้า code ส่วนแสดงผล
http://www.mediafire.com/file/5a745ea1zc8t6n5/adc_usart2%282%29.rar (http://www.mediafire.com/file/5a745ea1zc8t6n5/adc_usart2%282%29.rar)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on November 30, 2017, 01:07:05 pm
ติดพันทำ adc เลยทำแบบ adc interrupt complete ด้วย เวลาได้แล้วได้หมด ลองเอาไปดูกันครับ ข้ามเรื่องไปแล้ว  :)
http://www.mediafire.com/file/jsxqad2xaafsj2d/adc_usart3.rar (http://www.mediafire.com/file/jsxqad2xaafsj2d/adc_usart3.rar)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: ROM on November 30, 2017, 01:17:14 pm
ติดตามผลงานท่าน tha ตลอดเลยครับ ได้ข้อมูลที่ดีมากขึ้นเรื่อยๆ ขอบคุณมากครับ
แต่ท่าน tha ลองใช้ Github ( https://github.com ) ทำการจัดการ source code ดูซิครับ จะได้ไม่ต้อง ฝาก file หลายครั้ง
และได้งานเป็นที่ง่ายต่อการจัดการมากกว่านะครับ รวมถึงอาจมีคนอื่นๆมาช่วยท่านได้ง่ายขึ้นครับ
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 01, 2017, 08:51:43 am
ขอบคุณครับ คุณ ROM ที่แนะนำ เดี๋ยวจะลองศึกษาดูครับ ผมคนรุ่นเก่าใช้อะไรใหม่ๆไม่ค่อยเป็น โลกแคบไปหน่อย เดี๋ยวจะลองหัดใช้ดูครับ  >:(
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: ROM on December 01, 2017, 11:34:03 am
ขอบคุณครับ คุณ ROM ที่แนะนำ เดี๋ยวจะลองศึกษาดูครับ ผมคนรุ่นเก่าใช้อะไรใหม่ๆไม่ค่อยเป็น โลกแคบไปหน่อย เดี๋ยวจะลองหัดใช้ดูครับ  >:(

เพิ่งเริ่มหัดใช้ git อยู่เหมือนกันครับ แต่เห็นว่าน่าจะมีประโยชน์ดี
ตอนนี้ก็เริ่มต้นศึกษาจากตรงนี้  http://www.select2web.com/git/git-1.html แต่ก็ยังไม่คล่องเท่าไหร่ครับ
( ถ้าใจร้อนก็ไปตอนที่ 7 เลยก็ได้ http://www.select2web.com/git/git-7.html )
เลยอยากแนะนำท่าน tha มาใช้ด้วยกันไปเลย เห็นท่านเขียน Code เจ๋งๆอยู่
น่าจะเป็นอีกเรื่องที่น่าสนุกนะครับ
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 01, 2017, 12:40:07 pm
เดี๋ยวจะลองศึกษาดูครับ ตอนนี้ลอง บอร์ด atmega328p ทำ adc 3 channel ดู ไม่ใช้ interrupt ก็ทำงานได้ครับ

http://www.mediafire.com/file/768tfodccmzs10r/adc_usart4.rar (http://www.mediafire.com/file/768tfodccmzs10r/adc_usart4.rar)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 01, 2017, 02:31:47 pm
ทำ adc 3 channel แบบใช้ interrupt  ต้องใช้วิธีเซท flag a, b ถึงจะทำงานได้ นอกหัวข้อไปเยอะเลย adc ยังไม่ได้แปลเลย หาซื้อหนังสือมาอ่านเอานะครับ

http://www.mediafire.com/file/fmopnld36u1vuo1/adc_usart5.rar (http://www.mediafire.com/file/fmopnld36u1vuo1/adc_usart5.rar)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 01, 2017, 02:39:13 pm
เอาตัวแปร a, b ขึ้นก่อน สตาร์ทการแปลงจะแน่นอนกว่าหรือป่าว พรายกระซิบบอกมาอีกแล้ว  ;)
 
Quote
  a = ch;
  b = 1;
  // start single convertion
  // write ’1' to ADSC
  ADCSRA |= (1<<ADSC);
 
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 02, 2017, 07:37:51 am
ผิดอีกจุด ใน interrupt routine ไม่ต้องเช็ค interrupt flag แล้ว เพราะมันถูกเคลียร์โดย hardware เมื่อเข้า interrupt ผมไม่ได้ดู data sheet ผมก็นึกว่ามันจะเหมือน stm32 โปรแกรมจุดนี้มันก็ผิดด้วยถึงผ่านได้ แก้ใขด้วยครับ เร่งๆก็เป็นอย่างนี้มีผิดพลาดเยอะ
(https://i.imgur.com/RV5UBXQ.png)

ดีบักลอยๆ ก็ได้ไม่ต้องต่อไมโครคอนโทรลเลอร์ ถ้า compile มีไฟล์ .elf แล้ว
เริ่ม start debug -> set break point -> run ดูบิท ADIF ก็ไม่ติดเป็น "1" ครับ
(https://i.imgur.com/ywzoA4S.png)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 03, 2017, 01:01:08 pm
อยู่ว่างๆก็ทำโปรแกรมเล่นไป ลองจัดโปรแกรมให้เป็นระเบียบ พยายามทำโปรแกรมย่อย ให้ส่วน main เรียกใช้โปรแกรมย่อยมากๆ ทำให้ code size ลดลง ก็ ok
Quote
// UART Buffer
char uart_buf[32];    
ต้องเพิ่ม uart_buf[] จาก 16 เป็น 32 ไม่งั้น ADC0 ขึ้นไม่ตรงและค้าง คงจะเป็นจาก uart_buf กำหนด size ไว้น้อยเกินไป ไม่พอเก็บอักขระที่ยาว
http://www.mediafire.com/file/yq28clqcod4wzzj/adc_usart6.rar (http://www.mediafire.com/file/yq28clqcod4wzzj/adc_usart6.rar)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 04, 2017, 02:10:13 pm
Quote
เพิ่งเริ่มหัดใช้ git อยู่เหมือนกันครับ แต่เห็นว่าน่าจะมีประโยชน์ดี
ตอนนี้ก็เริ่มต้นศึกษาจากตรงนี้  http://www.select2web.com/git/git-1.html แต่ก็ยังไม่คล่องเท่าไหร่ครับ
( ถ้าใจร้อนก็ไปตอนที่ 7 เลยก็ได้ http://www.select2web.com/git/git-7.html )
เลยอยากแนะนำท่าน tha มาใช้ด้วยกันไปเลย เห็นท่านเขียน Code เจ๋งๆอยู่
น่าจะเป็นอีกเรื่องที่น่าสนุกนะครับ

มันลงตามนี้ใช่หรือเปล่าคุณ ROM http://www.select2web.com/git/git-4.html (http://www.select2web.com/git/git-4.html) หรือเป็นตัวอื่นสำหรับ windows 7 32bit ผมอัฟไฟล์ยังไม่ได้เลย แต่ฝั่งเว็ปเป็นแบบนี้ https://github.com/thamanoon/adc_usart6 (https://github.com/thamanoon/adc_usart6) ถูกต้องใหม อัฟโหลดยังไม่ได้ครับ
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 06, 2017, 02:37:01 pm
14.6. Power-Down Mode
เมื่อ the SM[2:0] bits ถูกเขียนเป็น '010', คำสั่ง the SLEEP instruction ทำให้ the MCU เข้าสู่ Power-Down mode. ใน mode นี้, the external
Oscillator ถูกหยุด, ขณะที่ the external interrupts, the 2-wire Serial Interface address watch, and the Watchdog ทำงานต่อไป (ถ้า enabled).

มีเพียงหนึ่งของ events เหล่านี้ที่สามารถ wake up the MCU:
• External Reset
• Watchdog System Reset
• Watchdog Interrupt
• Brown-out Reset
• 2-wire Serial Interface address match
• External level interrupt on INT
• Pin change interrupt

sleep mode นี้ โดยพื้นฐานแล้วจะหยุด clocks ทั่วไปทั้งหมด, ยอมให้เพียงแต่การทำงานของ asynchronous modules เท่านั้น.

หมายเหตุ: ถ้า a level triggered interrupt ถูกใช้สำหรับ wake-up จาก Power-Down, the required level ต้องถูกยึดไว้นานเพียงพอสำหรับ the MCU เพื่อเสร็จสิ้น the wake-up เพื่อ trigger the level interrupt. ถ้า the level หายไปก่อนการสิ้นสุดของ the Start-up Time, the MCU จะยังคง wake up, แต่ไม่มี interrupt ใดจะถูกทำให้เกิดขึ้น. The start-up time ถูกกำหนดโดย the SUT and CKSEL Fuses.

เมื่อ waking up จาก Power-Down mode, มันจะมี a delay จาก the wake-up condition เกิดขึ้นจนกระทั่ง the wake-up เป็นผล. นี้ยอมให้ the clock รีสตาร์ทใหม่และมั่นคงหลังจากที่ถูกทำให้หยุดไป The wake-up period ถูกกำหนดโดย the same(เดียวกัน) CKSEL Fuses ที่กำหนด the Reset Time-out period.
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: ROM on December 06, 2017, 06:34:07 pm
Quote
เพิ่งเริ่มหัดใช้ git อยู่เหมือนกันครับ แต่เห็นว่าน่าจะมีประโยชน์ดี
ตอนนี้ก็เริ่มต้นศึกษาจากตรงนี้  http://www.select2web.com/git/git-1.html แต่ก็ยังไม่คล่องเท่าไหร่ครับ
( ถ้าใจร้อนก็ไปตอนที่ 7 เลยก็ได้ http://www.select2web.com/git/git-7.html )
เลยอยากแนะนำท่าน tha มาใช้ด้วยกันไปเลย เห็นท่านเขียน Code เจ๋งๆอยู่
น่าจะเป็นอีกเรื่องที่น่าสนุกนะครับ

มันลงตามนี้ใช่หรือเปล่าคุณ ROM http://www.select2web.com/git/git-4.html (http://www.select2web.com/git/git-4.html) หรือเป็นตัวอื่นสำหรับ windows 7 32bit ผมอัฟไฟล์ยังไม่ได้เลย แต่ฝั่งเว็ปเป็นแบบนี้ https://github.com/thamanoon/adc_usart6 (https://github.com/thamanoon/adc_usart6) ถูกต้องใหม อัฟโหลดยังไม่ได้ครับ

ท่าน tha ติดตรงไหนครับ ใช้ Source Tree หรือเปล่า ?
ลองอ่าน https://www.atlassian.com/git  ตรงหัวข้อ  How Git works น่าจะพอช่วยได้


Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 07, 2017, 11:04:22 am
ไม่ไหวหล่ะคุณ ROM ผมคนรุ่นเก่าไฟฟ้ากำลังไม่ได้เรียนเน็ตมา
ทำใม Github for windows 32bit ถึงไม่มี มีแต่ 64bit โน๊ตบุ๊คของผมลงไม่ได้ครับ
https://desktop.github.com/ (https://desktop.github.com/)

ต่อเรื่อง sleep mode กันต่อ มีใครลองทำ sleep mode power down กันไปก่อนกันแล้วมั่ง ก็ง่ายๆ เหมือนกันกับ idle mode ส่วนหยุด clock ตัวไหนบ้างก็อ่านกันเอาเองนะครับ

http://www.mediafire.com/file/5qo04xyp9ohf223/sleep3.rar (http://www.mediafire.com/file/5qo04xyp9ohf223/sleep3.rar)
http://www.mediafire.com/file/suubau5r5zz3gbs/sleep4.rar (http://www.mediafire.com/file/suubau5r5zz3gbs/sleep4.rar)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: ROM on December 07, 2017, 02:17:12 pm
ไม่ไหวหล่ะคุณ ROM ผมคนรุ่นเก่าไฟฟ้ากำลังไม่ได้เรียนเน็ตมา
ทำใม Github for windows 32bit ถึงไม่มี มีแต่ 64bit โน๊ตบุ๊คของผมลงไม่ได้ครับ
https://desktop.github.com/ (https://desktop.github.com/)

ต่อเรื่อง sleep mode กันต่อ มีใครลองทำ sleep mode power down กันไปก่อนกันแล้วมั่ง ก็ง่ายๆ เหมือนกันกับ idle mode ส่วนหยุด clock ตัวไหนบ้างก็อ่านกันเอาเองนะครับ

http://www.mediafire.com/file/5qo04xyp9ohf223/sleep3.rar (http://www.mediafire.com/file/5qo04xyp9ohf223/sleep3.rar)
http://www.mediafire.com/file/suubau5r5zz3gbs/sleep4.rar (http://www.mediafire.com/file/suubau5r5zz3gbs/sleep4.rar)

โอ้ เสียใจด้วยครับ ไม่เจอ git desktop ที่เป็น GUI 32 bit เหมือนกัน  :'(
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 11, 2017, 01:20:09 pm
Quote
โอ้ เสียใจด้วยครับ ไม่เจอ git desktop ที่เป็น GUI 32 bit เหมือนกัน  :'(

ทำได้แล้วแจ้งด้วยนะ คุณ ROM ตอนนี้ถ้าผมมีทำผิดหรืออยากแก้ให้ดีกว่าด้วยวิธีอื่นๆที่แตกต่างก็แก้ได้เลยนะครับ แก้ใน electoday นี่แหละ แก้สั้นๆก็เขียนบอกวิธีแก้มา ถ้าแก้ยาวเลยก็แก้แล้วอัฟโหลดมาก็ได้ ไม่ต้องเกรงใจ
ไปเที่ยงลำปางมาสองสามวัน หมู่นี้เลยไม่ได้แปล
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 11, 2017, 01:56:30 pm
14.7. Power-save Mode
เมื่อ the SM[2:0] bits ถูกเขียนด้วย 011, the SLEEP instruction ทำให้ the MCU เข้าสู่ Power-save mode. โหมดนี้ก็เหมือนกันกับ Power-down, โดยมีข้อยกเว้นอยู่ข้อหนึ่ง :

ถ้า Timer/Counter2 ถูกเปิดใช้งาน, มันจะทำงานต่อไปในระหว่างที่ sleep อยู่. The device สามารถ wake up จาก Timer Overflow หรือ Output Compare event จาก Timer/Counter2 ถ้า the corresponding Timer/Counter2 interrupt enable bits ถูกเซทใน TIMSK2, และ the Global Interrupt Enable bit ใน SREG ถูกเซท

ถ้า Timer/Counter2 ไม่ได้รันอยู่, แนะนำให้ใช้ Power-down mode แทนการใช้ Power-save mode.

The Timer/Counter2 สามารถถูกให้สัญญานนาฬิกาได้ทั้งแบบ synchronously และ asynchronously ใน Power-save mode. ถ้า Timer/Counter2 ไม่ได้ใช้ the asynchronous clock, the Timer/Counter Oscillator จะถูกหยุดในระหว่าง sleep. ถ้า Timer/Counter2 ไม่ได้ใช้ the synchronous clock, the clock source ถูกหยุดในระหว่าง sleep. ถึงแม้ว่า the synchronous clock กำลังรันใน Power-save, clock นี้สามารถใช้สำหรับ Timer/Counter2 เท่านั้น.

งงแล้วสิงานนี้  synchronously และ asynchronously
synchronously หมายถึง ใช้สัญญานนาฬิกาภายนอกใช่หรือเปล่า?
asynchronously หมายถึง ใช้สัญญานนาฬิกาภายในใช่หรือเปล่า?   
ท่านใดพอทราบมาช่วยเคลียร์หน่อย Timer/Counter ก็ยังแปลไปไม่ถึงเลย จะยกตัวอย่างได้ใหมนี่  :(
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 12, 2017, 09:26:43 am
ตกลง Power-save Mode ยังไม่ทำจะดีกว่า เพราะทำจริงๆจะข้ามขั้นตอนมากเกินไป และไม่ค่อยจะใช้งานมากนัก ใช้ Power-down Mode แทนก็ได้ ต่อ

14.8. Standby Mode
เมื่อ the SM[2:0] bits ถูกเขียนเป็น '110' และ an external crystal/resonator clock option(ทางเลือก) ถูกเลือก, the SLEEP instruction ทำให้ the MCU เข้าสู่ Standby mode. โหมดนี้ก็เหมือนกันกับ Power-Down โดยมีข้อยกเว้นที่ให้ the Oscillator รันต่อไป. จาก Standby mode, the device จะ wakes up ใน six clock cycles.
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 13, 2017, 08:18:15 am
ตัวอย่าง standby mode ครับ library ก็เช็คเอาใน folder นี้ C:\WinAVR-20100110\avr\include\avr
http://www.mediafire.com/file/xbygyr9iawmcy4d/sleep5.rar (http://www.mediafire.com/file/xbygyr9iawmcy4d/sleep5.rar)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 13, 2017, 08:27:07 am
14.9. Extended Standby Mode
เมื่อ the SM[2:0] bits ถูกเขียนเป็น '111' และ an external crystal/resonator clock option ถูกเลือก, คำสั่ง the SLEEP instruction ทำให้ the MCU เข้าสู่ Extended Standby mode. โหมดนี้ก็เหมือนกันกับ Power-Save mode โดยมีข้อยกเว้นที่ให้ the Oscillator รันต่อไป จาก Extended Standby mode, the device จะ wakes up ใน 6 clock cycles.

ไม่ยกตัวอย่างนะ พิมพ์ได้คล่องแล้ว ค่อยยังชั่วหน่อย  :)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 14, 2017, 11:42:29 am
14.10. Power Reduction Register
The Power Reduction Register (PRR) จัดให้มีวิธีหยุด the clock ของแต่ละ individual peripherals เพื่อลด power consumption. สถานะปัจจุบันของ the peripheral ถูกแช่แข็งและ the I/O registers ไม่สามารถถูกอ่านและเขียนได้. ทรัพยากรถูกใช้โดย the peripheral เมื่อหยุด the clock ก็ยังคงถือครองอยู่, ดังนั้น the peripheral โดยมากแล้วควรที่จะถูกปิดการใช้งานก่อนที่จะหยุด the clock. การ Waking up a module, ซึ่งทำโดยการเคลียร์ the corresponding bit ใน the PRR รีสจีสเตอร์, ผลัก the module ไปอยู่ในสถานะเดียวกันกับก่อนที่จะ shutdown.

Module shutdown สามารถถูกใช้ใน Idle mode และ Active mode เพื่อลด the overall power consumption. ใน sleep modes อื่นๆทั้งหมด, the clock ถูกหยุดอยู่แล้ว.

(ดูที่รีสจีสเตอร์ PRR ท้ายบทว่า บิทไหนหยุดอะไรบ้าง จะยังไม่ยกตัวอย่างเพราะ peripheral อย่าง spi, i2c, uart ยังไปไม่ถึงเลย ลืมไปหมดแล้ว)  :o
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 15, 2017, 11:28:23 am
14.11. Minimizing Power Consumption(ลดการสิ้นเปลืองพลังงาน)
มีความเป็นไปได้หลายอย่างที่จะต้องพิจารณาเมื่อพยายามลดการใช้พลังงานลงใน an AVR controlled system. โดยทั่วไป, sleep modes ควรถูกใช้ให้มากที่สุดเท่าที่จะเป็นไปได้และ the sleep mode ควรถูกเลือกเพื่อให้ฟังก์ชั่นของอุปกรณ์ทำงานให้น้อยที่สุดเท่าที่จะเป็นไปได้. โดยเฉพาะอย่างยิ่งโมดูลต่อไปนี้อาจต้องได้รับการพิจารณาเป็นพิเศษเมื่อพยายามทำให้การใช้พลังงานต่ำสุด  ฟังก์ชันทั้งหมดที่ไม่จำเป็น ต้องปิดใช้งาน โดยเฉพาะอย่างยิ่งโมดูลต่อไปนี้อาจต้องได้รับการพิจารณาเป็นพิเศษเมื่อพยายามทำให้การใช้พลังงานต่ำสุด

14.11.1. Analog to Digital Converter
หากเปิดใช้งาน ADC จะถูกเปิดใช้งานใน sleep modes ทั้งหมด เพื่อเป็นการประหยัดพลังงานควรปิดใช้งาน ADC ก่อนเข้าโหมด sleep ใด ๆ เมื่อ ADC ถูกปิดและเปิดใหม่อีกครั้งการแปลงครั้งต่อไปจะเป็นการแปลงแบบ an extended conversion.

14.11.2. Analog Comparator[/size]
เมื่อเข้าสู่ Idle mode, the Analog Comparator ควรถูกปิดการใช้งานถ้าไม่ได้ใช้. เมื่อเข้าสู่ ADC Noise Reduction mode, the Analog Comparator ควรถูกปิดการใช้งาน. ใน sleep modes อื่น, the Analog Comparator จะถูกปิดการใช้งานโดยอัตโนมัติ อย่างไรก็ตาม, ถ้า the Analog Comparator ถูกตั้งค่าโดยใช้ the Internal Voltage Reference เป็นอินพุท, the Analog Comparator ควรถูกปิดการใช้งานในทุกๆ sleep modes. มิฉะนั้น, the Internal Voltage Reference จะถูกเปิดใช้งาน โดยไม่ขึ้นอยู่กับ sleep mode.
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 15, 2017, 02:50:18 pm
14.11.3. Brown-Out Detector (ตรวจจับแรงดัน)
หาก the Brown-Out Detector (BOD) ไม่ถูกต้องการโดย the application, โมดูลนี้ควรถูกปิด. หาก the BOD ถูกเปิดใช้งานโดย the BODLEVEL Fuses, มันจะถูกเปิดใช้งานในทุก sleep modes, และดังนั้น, มันจะกินพลังงานเสมอ. ใน the deeper sleep modes, นี้จะมีส่วนอย่างมีนัยสำคัญกับ the total current consumption.

14.11.4. Internal Voltage Reference
The Internal Voltage Reference จะถูกเปิดใช้งานเมื่อถูกต้องการโดย the Brown-Out Detection, the Analog Comparator หรือ the Analog-to-Digital Converter. ถ้าโมดูลเหล่านี้ถูกปิดการใช้งานดังอธิบายในส่วนข้างบนนี้, the internal voltage reference จะถูกปิดการใช้งานและมันจะไม่กินพลังงาน. เมื่อเปิดอีกครั้ง, ผู้ใช้ต้องยอมให้ the reference นี้ start up ก่อนที่ the output จะถูกใช้. หาก the reference นี้ถูก on อยู่ใน sleep mode, the output สามารถถูกใช้ได้โดยทันที.

14.11.5. Watchdog Timer
หาก the Watchdog Timer ไม่ถูกต้องการใน the application(โปรแกรมนี้), the module นี้ควรถูก turned off. หาก the Watchdog Timer ถูกเปิดการใช้งาน, มันจะถูกเปิดใช้งานในทุก sleep modes และดังนั้นมันจะกินพลังงานเสมอ. ใน the deeper(ลึกๆนานๆ) sleep modes, นี้จะมีส่วนอย่างมีนัยสำคัญกับ the total current consumption.
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 16, 2017, 10:08:21 am
14.11.6. Port Pins
เมื่อเข้าสู่ a sleep mode, all port pins ควรถูกกำหนดให้ใช้พลังงานต่ำสุด. สำคัญที่สุดนั้นคือเพื่อให้แน่ใจว่าไม่มี pins ไหนขับ resistive loads. ใน sleep modes ที่ทั้ง the I/O clock(clkI/O) และ the ADC clock (clkADC) ถูกหยุด, the input buffers ของ the device จะถูก disabled.  นี้เพื่อให้แน่ใจว่าไม่มีการใช้พลังงานโดย the input logic เมื่อไม่ต้องการ. ในบางกรณี, the input logic ถูกต้องการสำหรับการตรวจจับ wake-up conditions, และมันจะต้องถูก enabled. ดูที่ส่วน Digital Input Enable and Sleep Modes สำหรับรายละเอียดเกี่ยวกับ pins ถูก enabled. ถ้า the input buffer ถูก enabled และ the input signal ถูกปล่อยลอยหรือมีระดับสัญญาณอนาล็อกใกล้กับ VCC/2, the input buffer จะใช้พลังงานมากเกินไป.

สำหรับ analog input pins, the digital input buffer ควรถูก disabled ทุกครั้ง. An analog signal level ใกล้กับ VCC/2 บน an input pin อาจทำให้เกิดคู่ของกระแสได้อย่างมีนัยสำคัญใน active mode. Digital input buffers สามารถถูก disabled โดยการเขียนถึง the Digital Input Disable Registers (DIDR0 for ADC, DIDR1 for AC).

14.11.7. On-chip Debug System
ถ้า the On-chip debug system ถูก enabled โดย the Fuse และ the chip เข้าสู่ sleep mode, the main clock source ถูก enabled และดังนั้นจะกินพลังงานเสมอ.  ใน the deeper(ลึกๆนานๆ) sleep modes, นี้จะมีส่วนอย่างมีนัยสำคัญกับ the total current consumption.

ปล. เป็นเหมือนตูนเลย มองคอมนานๆชักแย่ ตาขวาเริ่มพร่ามัว ไปตรวจที่รพ.คลองขลุง หมอบอกมันเป็นไปตามอายุ แล้วทำเรื่องส่งต่อไปรพ.กำแพงเพชร(ยังไม่ได้ไป) ไม่รู้จะยังไง แต่ก็พอไหวอยู่ ตาเดียวก็เริ่มจะชินแล้ว  ;)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 16, 2017, 11:41:49 am
14.12. Register Description

14.12.1. Sleep Mode Control Register
The Sleep Mode Control Register บรรจุ control bits สำหรับ power management.
เมื่อระบุที่อยู่ I/O Registers ราวกับเป็น data space โดยใช้ LD and ST instructions, การจัดให้มีระยะชดเชยต้องถูกใช้ เมื่อใช้ the I/O specific commands IN and OUT, the offset ถูกลดลงไป 0x20, เป็นผลให้ an I/O address offset อยูภายใน 0x00 - 0x3F.

(https://i.imgur.com/qPcCm7e.png)

Bit 3 – SM2: Sleep Mode Select 2
The SM[2:0] bits เลือกในระหว่าง 5 sleep mode ที่มีให้ใช้ประโยชน์ (the five available sleep modes)

(https://i.imgur.com/IrtYpJh.png)

Note:
1. Standby mode แนะนำให้สำหรับใช้กับ external crystals หรือ resonators เพียงเท่านั้น.

Bit 2 – SM1: Sleep Mode Select 1
ดูที่ SM2.
Bit 1 – SM0: Sleep Mode Select 0
ดูที่ SM2.

Bit 0 – SE: Sleep Enable
The SE bit ต้องถูกเขียนด้วย 1 (logic one) เพื่อทำให้ the MCU เข้าสู่ the sleep mode เมื่อคำสั่ง SLEEP ถูก executed(ปฏิบัติ). เพื่อหลีกเลี่ยง the MCU เข้าสู่ the sleep mode เว้นแต่ว่ามันเป็นความมุ่งหมายของโปรแกรมเมอร์, แนะนำให้เขียน the Sleep Enable (SE) bit เป็น "1" เพียงแค่ก่อนการปฏิบัติคำสั่ง SLEEP และเคลียร์มันโดยทันทีหลังจาก waking up

ตัวอย่างยกกันไปก่อนแล้วนะท่านๆ มีอะไรก็บอกมานะ  ;D
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 17, 2017, 12:21:18 pm
14.12.2. MCU Control Register
เมื่อระบุที่อยู่ I/O Registers ราวกับเป็น data space โดยใช้ LD and ST instructions, การจัดให้มีระยะชดเชยต้องถูกใช้ เมื่อใช้ the I/O specific commands IN and OUT, the offset ถูกลดลงไป 0x20, เป็นผลให้ an I/O address offset อยูภายใน 0x00 - 0x3F.

(https://i.imgur.com/7mX5cU2.png)

Bit 6 – BODS: BOD Sleep
The BODS bit ต้องถูกเขียนเป็น '1' เพื่อที่จะ turn off BOD ในระหว่าง sleep. การเขียนถึง the BODS bit ถูกควบคุมโดย a timed sequence และ the enable bit BODSE. เพื่อ disable BOD ใน relevant(ซึ่งสัมพันธ์กัน) sleep modes, ทั้ง BODS และ BODSE ต้องถูกเขียนเป็น '1'ก่อน. จากนั้น, BODS ต้องถูกเขียนเป็น '1' และ BODSE ต้องถูกขียนเป็น "0" ภายใน 4 clock cycles

The BODS bit จะ active อยู่ three clock cycles หลังจากที่มันเซท. A sleep instruction ต้องถูก executed ขณะที่ BODS แอคทีฟอยู่เพื่อที่จะ turn off the BOD สำหรับ the actual sleep mode. The BODS bit ถูกเคลียร์โดยอัตโนมัติหลังจาก three clock cycles
Note: BOD disable มีให้ใช้ใน ATmega328P เท่านั้น

Bit 5 – BODSE: BOD Sleep Enable
BODSE เปิดใช้งานการเซทของ BODS control bit, ตามที่อธิบายในคำอธิบายบิตของ BODS. BOD disable ถูกควบคุมโดย a timed sequence.
Note: BOD disable มีให้ใช้ใน ATmega328P เท่านั้น

ป.ล. BOD disable ปิด brown-out detector เพื่อลดกระแส และไม่ให้มัน BOD Reset เวลาเข้าสู่ sleep mode อันนี้ไม่ยาก ลองเสริจกูเกิ้ล "avr bod sleep" พอจะมีตัวอย่างอยู่ ดูที่ดาต้าชีทบท Reset ด้วย ก้จะเข้าใจ brown-out detector มากขึ้น ดูที่เราตั้งค่า fuse bit ไว้ด้วยว่าเราตั้ง BOD ไว้กี่โวลท์ ถ้ามี power supply ที่ปรับค่าได้ ก็จะได้ทดลองปรับดูให้ power supply ของ mcu ต่ำกว่า Vbod ที่เราตั้งใน fuse bit ไว้ว่าจะมีผลเป็นอย่างไรในแบบต่างๆ ตอนนี้ผมขอเวลาศึกษาทำความเข้าใจกับมันก่อนครับ  >:(
ไล่เช็ค library ในนี้ด้วย C:\WinAVR-20100110\avr\include\avr
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 18, 2017, 05:49:52 am
ลองทำโดยใช้ library ดู ตามนี้ ทำ bod disable ก่อนเข้า sleep mode
http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html (http://www.nongnu.org/avr-libc/user-manual/group__avr__sleep.html)
เขาบอกว่าใช้ library ทำตามนี้แล้ว timed sequence มันได้
ส่วนรายละเอียดของ library ว่าบิทไหนเป็นบิทไหน ก็ไล่เช็คเอาที่ sleep.h
ส่วน cli();, sei(); ก็อยู่ใน interrupt.h
ลองเปรียบเทียบดูระหว่างที่มี BOD disable กับเอา BOD disable ออก ว่ามันกินกระแสต่างกันหรือเปล่า อันนี้มันเหมาะกับที่เราใช้ถ่านจ่ายให้ mcu แล้วต้องการประหยัดไฟ
ถ้าเซทเป็นบิทเอาก็ทำตามนี้ http://www.avrfreaks.net/forum/turn-bod-during-sleep-atmega324p (http://www.avrfreaks.net/forum/turn-bod-during-sleep-atmega324p)

http://www.mediafire.com/file/ji8zwxk4dy487bc/sleep_bod1.rar (http://www.mediafire.com/file/ji8zwxk4dy487bc/sleep_bod1.rar)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 18, 2017, 07:01:49 am
เซทเป็นบิทเอาก็จะได้เป็นแบบนี้ครับ ไม่รู้  timed sequence มันได้หรือเปล่า
http://www.mediafire.com/file/phmf8lrvhe79amd/slepp_bod2.rar (http://www.mediafire.com/file/phmf8lrvhe79amd/slepp_bod2.rar)
ลองเอามิเตอร์วัดกระแสไฟเลี้ยงดู เวลาเข้าสู่ sleep วัดได้ประมาณ 12.8 mA ทั้งที่มี BOD disable กับเอา BOD disable ออกเลย ทั้งสองแบบด้วย งง เราทำผิดหรือดาต้าชีทมันหลอกเราว่ะเนี้ย  :'(
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 18, 2017, 07:21:00 am
ส่วนค่า BOD เราสามารถเลือกโปรแกรมได้ที่ fuse bit

(https://i.imgur.com/Xgf09H0.png)

ถ้าใครมี power supply ที่ปรับค่าได้ ก็ลองปรับไฟเลี้ยงให้ต่ำกว่าค่า brown-out ดูว่าผลจะเป็นอย่างไร ครับ
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 19, 2017, 02:51:24 pm
ลองเอา power supply ที่ปรับค่าได้มาลองทั้งสองโปรแกรมนี้ พอปรับ volt ลงให้ต่ำกว่า 4.3v แล้วปรับขึ้นมาพอผ่าน 4.3v ขึ้นมาแล้ว LED PD7 กระพริบขึ้นมา แสดงว่ามัน BOD reset ได้ มันไม่ได้ถูก disable อย่างที่เราโปรแกรม เป็นเพราะอะไรหนอ ท่านใดพอทราบ
พอลองตั้ง BOD disable ที่ fuse bit  พอปรับ volt ลงให้ต่ำกว่า 4.3v แล้วปรับขึ้นมาพอผ่าน 4.3v ขึ้นมาแล้ว LED PD7 ไม่กระพริบขึ้นมา แสดงว่าทำ BOD disable อย่างนี้ได้  :-\
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 19, 2017, 03:41:47 pm
ทราบปัญหาแล้วครับ sleep mode IDLE ทำ BOD disable ไมได้ (ดูที่ตารางต้นบท) ทำ BOD disable ได้แต่ power down กับ standby ครับ ที่โปรแกรม sleep_bod1 ตั้งเป็น
Quote
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
หรือ
Quote
set_sleep_mode(SLEEP_MODE_STANDBY);
ก็ใช้ได้แล้ว พอปรับ volt ลงให้ต่ำกว่า 4.3v แล้วปรับขึ้นมาพอผ่าน 4.3v ขึ้นมาแล้ว LED PD7 ไม่กระพริบขึ้นมา แสดงว่าทำ BOD disable อย่างนี้ได้

แต่ที่โปรแกรม slepp_bod2 ที่ตั้งเป็นบิท ทั้ง power down และ standby พอปรับ volt ลงให้ต่ำกว่า 4.3v แล้วปรับขึ้นมาพอผ่าน 4.3v ขึ้นมาแล้ว LED PD7 กระพริบขึ้นมา แสดงว่าทำ BOD disable ไม่ได้ คงจะเกิดจาก การเซทบิทอย่างนี้ time squence มันไม่ได้ เลย BOD disable ไม่ได้ ท่านใดมีความสามารถก็ทำการตรวจแก้ให้ด้วยนะครับ  ;)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 19, 2017, 04:03:20 pm
โปรแกรม sleep_bod1 ที่ตั้ง sleep mode power down วัดกระแสตอนที่เข้าสู่ sleep ได้ 3.35mA
พอเอา
Quote
sleep_bod_disable();       // BOD disable
ออก วัดกระแสได้ 3.36mA
ก็ไม่หนีกันเท่าไหร่ระหว่าง bod disable กับไม่ bod disable
ต่างกันที่ ถ้าทำ bod disable แล้ว เวลาเข้าสู่ sleep แล้วไฟตกต่ำกว่า 4.3v(ตามที่เราตั้ง)แล้วกลับคืนมาเป็นปกติจะไม่เกิดการ reset เนื่องจาก BOD
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 20, 2017, 06:58:59 am
โปรแกรม slepp_bod2 ถ้ากำหนด register ตรงๆแบบนี้
Quote
void sleep_mode_bod(void)
  {
    //if (some_condition)
    sleep_enable();            // set SE bit to enable sleep
    //sleep_bod_disable();       // BOD disable
    //MCUCR |= (1<<BODS)|(1<<BODSE);  // first set BODS and BODSE to 1
    //MCUCR |= (1<<BODS);             // then set BODS to 1
    //MCUCR &= ~(1<<BODSE);           // clear BODSE to 0
    MCUCR = 0x60;            // BOD sleep, datasheet page 48
    MCUCR = 0x40;               // then set BODS to 1, clear BODSE to 0
    sei();                     // set globol interrupt
    sleep_cpu();               // executed sleep instruction
    sleep_disable();           // clear SE bit to disable sleep

   //sleep = 0;
  }
 
สามารถทำงานได้ถูกต้อง code size ลดลงจาก 316 เหลือ 306 คงจะลดลงมาเนื่องจากโปรแกรมเราไม่ได้ shift , or ,and แล้ว time squence เลยได้ แต่การกำหนดตรงๆแบบนี้มันก็กระทบกระเทือนบิทอื่นด้วย ใน register เดียวกัน(เป็น 0 หมด)

เพลินดีมีอะไรทำ  :)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on December 27, 2017, 11:17:33 am
Bit 4 – PUD: Pull-up Disable
เมื่อบิทนี้ถูกเขียนให้เป็น "1", the pull-ups ใน the I/O ports ถูก disabled ถึงแม้นว่า the DDxn and PORTxn Registers ถูกกำหนดเพื่อ enable the pull-ups ({DDxn, PORTxn} = 0b01).

Bit 1 – IVSEL: Interrupt Vector Select
เมื่อ the IVSEL bit ถูกเคลียร์ (0), the Interrupt Vectors ถูกบรรจุลงที่จุดเริ่มต้นของ the Flash memory. เมื่อบิทนี้ถูกเซท ("1"), the Interrupt Vectors ถูกย้ายไปที่จุดเริ่มต้นของ the Boot Loader section ของ the Flash. ตำแหน่งจริงๆของจุดเริ่มต้นของ the Boot Flash Section ถูกกำหนดโดย the BOOTSZ Fuses. เพื่อหลีกเลี่ยงการไม่ได้ตั้งใจเปลี่ยนของ Interrupt Vector tables, ขบวนการเขียนเป็นพิเศษที่ต้องปฏิบัติตามเพื่อเปลี่ยน the IVSEL bit:
     1. เขียน the Interrupt Vector Change Enable (IVCE) bit ให้เป็น "1".
     2. ภายใน 4 cycles, เขียนค่าที่ต้องการไปยัง IVSEL ขณะที่เขียน "0" ไปยัง IVCE.
Interrupts จะถูก disabled โดยอัตโนมัติขณะที่ขั้นตอนนี้ถูกปฏิบัติ. Interrupts ถูก disabled ในไซเกิลที่ IVCE ถูกเซท, และมันยังคง disabled จนกระทั่งหลังจากคำสั่งที่ตามหลังการเขียนถึง IVSEL. ถ้า IVSEL ไม่ได้ถูกเขียน, interrupts ยังคง disabled เป็นเวลา 4 cycles. The I-bit ใน the Status Register ไม่ได้รับกระทบโดย the automatic disabling นี้
หมายเหตุ : ถ้า Interrupt Vectors ถูกบรรจุลงใน the Boot Loader section และ Boot Lock bit BLB02 ถูกโปรแกรม, interrupts ถูก disabled ขณะที่กำลังปฏิบัติจาก the Application section. ถ้า Interrupt Vectors ถูกบรรจุลงใน the Application section และ Boot Lock bit BLB12 ถูกโปรแกรม interrupts ถูก disabled ขณะที่กำลังปฏิบัติจาก the Boot Loader section.

Bit 0 – IVCE: Interrupt Vector Change Enable
The IVCE bit ต้องถูกเขียนด้วยลอจิก "1" เพื่อ enable การเปลี่ยนของ the IVSEL bit. IVCE จะถูกเคลียร์โดยฮาร์ดแวร์ 4 cycles หลังจากที่มันถูกเขียนหรือเมื่อ IVSEL ถูกเขียน. การเซท the IVCE bit จะ disable interrupts, ตามที่อธิบายใน the IVSEL คำอธิบายด้านบน ดูตัวอย่างรโค็ดด้านล่าง

(https://i.imgur.com/p2k2yYK.png)

จะเอาไปใช้ในงานอย่างไรนี่ arduino หรือเปล่า? แต่เขาก็ทำสำเร็จรูปแล้วมั้ง ไม่ยกตัวอย่างหล่ะ  :o
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on January 03, 2018, 08:45:47 am
 :) สวัสดีปีใหม่ครับ ชาว electoday  :)
ขอให้มีความสุข สุขภาพแข็งแรง จิตใจแจ่มใสเบิกบานไปตลอดปีนะครับ  :)
ขอให้ประดิษฐ์คิดค้นอะไรใหม่ๆขึ้นมาได้ด้วย  :)
มาว่ากันต่อนะ  :)

14.12.3. Power Reduction Register

(https://i.imgur.com/SrCb32y.png)

Bit 7 – PRTWI0: Power Reduction TWI0
เขียนลอจิก "1"ไปยังบิทนี้จะ shuts down the TWI0 โดยการหยุด the clock ที่ไปยัง the module นี้. เมื่อปลุกให้ the TWI ตื่นอีกครั้ง, the TWI ควรถูกเริ่มต้นซ้ำเพื่อให้แน่ใจว่าการทำงานได้อย่างเหมาะสม

Bit 6 – PRTIM2: Power Reduction Timer/Counter2
เขียนลอจิก "1"ไปยังบิทนี้จะ shuts down the Timer/Counter2 module ใน synchronous mode (AS2 เป็น 0). เมื่อ the Timer/Counter2 ถูก enabled, การทำงานจะดำเนินต่อไปเหมือนก่อนที่จะ the shutdown.

Bit 5 – PRTIM0: Power Reduction Timer/Counter0
เขียนลอจิก "1"ไปยังบิทนี้จะ shuts down the Timer/Counter0 module. เมื่อ the Timer/Counter0 ถูก enabled, การทำงานจะดำเนินต่อไปเหมือนก่อนที่จะ the shutdown.

Bit 3 – PRTIM1: Power Reduction Timer/Counter1
เขียนลอจิก "1"ไปยังบิทนี้จะ shuts down the Timer/Counter1 module. เมื่อ the Timer/Counter1 ถูก enabled, การทำงานจะดำเนินต่อไปเหมือนก่อนที่จะ the shutdown.

Bit 2 – PRSPI0: Power Reduction Serial Peripheral Interface 0
ถ้ามีการใช้ debugWIRE On-chip Debug System, บิทนี้ควรไม่ถูกเขียนให้เป็น "1". เขียนลอจิก "1"ไปยังบิทนี้จะ shuts down the Serial Peripheral Interface โดยการหยุด the clock ที่ไปยัง the module นี้..เมื่อปลุกให้ the SPI ตื่นอีกครั้ง, the SPI ควรถูกเริ่มต้นซ้ำเพื่อให้แน่ใจว่าการทำงานได้อย่างเหมาะสม

Bit 1 – PRUSART0: Power Reduction USART0
เขียนลอจิก "1"ไปยังบิทนี้จะ shuts down the USART โดยการหยุด the clock ที่ไปยัง the module นี้. เมื่อปลุกให้ the USART ตื่นอีกครั้ง, the USART ควรถูกเริ่มต้นซ้ำเพื่อให้แน่ใจว่าการทำงานได้อย่างเหมาะสม

Bit 0 – PRADC: Power Reduction ADC
เขียนลอจิก "1"ไปยังบิทนี้จะ shuts down the ADC. The ADC ต้องถูก disabled ก่อน shut down. The analog comparator ไม่สามารถใช้ the ADC input MUX เมื่อ the ADC ถูก shut down.

ถ้าจะหยุดตัวไหน ก็ทำอย่างนี้ตรงที่ต้องการหยุดได้เลย อย่างนี้หรือเปล่า
Quote
PRR |= (1<<PRTWI0);
 
เมื่อปลุกให้ the TWI ตื่นอีกครั้ง ก็ทำอย่างนี้
Quote
PRR &= ~(1<<PRTWI0);
แล้วก็ re initialized ตัวโมดูลนี้ซ้ำอีกครั้ง ถูกต้องใหมอย่างนี้ ตัวอย่างอาจมีภายหลัง เนื่องจากแปลยังไม่ถึงตัว Module ต่างๆเลย
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on January 04, 2018, 06:11:46 am
ไปเจอตัวอย่างมา เยอะเลย
http://exploreembedded.com/wiki/Interfacing_Seven_Segment_Displays_with_AVR (http://exploreembedded.com/wiki/Interfacing_Seven_Segment_Displays_with_AVR)
https://github.com/maxEmbedded/avr-code-gallery (https://github.com/maxEmbedded/avr-code-gallery)
ท่านใดเจออะไรดีๆมาบอกกันด้วยนะ
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: az on January 04, 2018, 04:16:53 pm
http://www.avrfreaks.net/forums/tutorials

อันนี้พอได้ไหมฮ่ะ
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on January 04, 2018, 07:39:46 pm
ตาลาย ไม่ไหวอ่ะ  :( :o ;D
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on June 27, 2019, 06:53:41 pm
อ่านมาหลายปีสำนวณไมโครฯ มีคำศัพย์ไม่กี่ตัวหรอก แต่ไม่ต้องเปิดดิกนี่ก็เล่นเอาแก่สี่สิบห้าสิบไปเหมือนกัน ;D

รูปประโยคก็เป็น passive voice มีซะเป็นส่วนมาก
                                           ประธาน + verb to be + verb(กริยา) ช่องที่ 3 อาจมี by(โดย) ใครหรืออะไร ระบุต่อท้ายด้วย

ก็จะเป็นรูปประโยคที่เน้นว่าประธานเป็นผู็ถูกกระทำ อาจมีระบุว่าถูกกระทำโดยใครหรืออะไรต่อท้ายด้วย
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on July 22, 2019, 08:50:20 am
กำลังไล่ทบทวน ก็มาเจอจุดที่ผิด เขาบอกว่า สัญญานนาฬิกาของ ADC ต้องไม่เกิน 200khz ใช่ใหม แต่ก่อนผมทำไว้ใช้ต้อง 1Mhz ก็แก้เป็น
ADC Clock Prescale = 128  ได้เท่าไหร่หล่ะ เอา 16M/128 = 125khz ก็ถึงจะใช้ได้ ถ้าอยากได้ 200khz เป๊ะๆ ก็ต้องเปลี่ยน crystal เอานะ ให้เป็นเท่าไหร่ก็คำนวณเอานะ ชักจะงงๆ
Quote
  ADCSRA |= ((1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0));            // ADC Clock Prescale = 128

pin ไหนถ้าเราใช้เป็นขา ADC แล้ว เราก็ปิดการใช้งาน Digital Input pin นั้นเสีย เพื่อประหยัดพลังงาน
Quote
DIDR0 |= (1<<ADC0D);                                      // ADC5...0 Digital Input Disable

อีกอย่างใน ADC interrupt service routine เราก็ไม่ต้องเช็คบิทเคลียร์บิทอินเตอรับท์แฟลก ADIF แล้ว ในดาต้าชีทเขาบอกว่า มันถูกเคลียร์โดยฮาร์ดแวร์ตอนที่เข้า ADC interrupt service routine แล้ว

http://www.mediafire.com/file/egi9k4gj3p3b7jn/adc_usart3%25283%2529.rar/file (http://www.mediafire.com/file/egi9k4gj3p3b7jn/adc_usart3%25283%2529.rar/file)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on July 22, 2019, 06:44:38 pm
ดันขายหนังสือไมโครฯ AVR ไป เลยต้องซื้อมาใหม่ อ่านแต่ภาษาอังกฤษอย่างเดียวกลัวว่าจะจับต้นชนปลายไม่ถูก ได้อ่านภาษาไทยก่อนให้รู้ภาพรวมก่อน แล้วค่อยอ่านภาษาอังกฤษก็จะเข้าใจดีขึ้น ไม่ติดขัด

อ่านภาษาอังกฤษอย่างเดียวไม่ไหวหรอก ร้อนแล้วจะไปไม่เป็นเลย ภาษาไทยก็เหอะ พอร้อนแล้วก็อ่านไม่ไหวแล้ว เวลาอ่านหนังสือต้องหาที่เย็นๆเอาไว้นะ หรืออ่านตอนที่เย็นๆอย่างตีสี่ตีห้านะพวกเรา บ่ายๆมานี่ผมต้องจอดป้ายทุกที ต่อให้เก่งแค่ไหนอีก

พวกโซนหนาวอย่างญี่ปุ่นจีนเกาหลียุโรปเขาถึงเจริญทางด้านเทคโนโลยี่ได้ ก็ประเทศเขาหนาวเย็นนี่ใช่ใหม

ประชาธิปไตยอีก ร้อนมันอ่านหนังสือไม่ได้ ทำคนส่วนใหญ่ไม่มีความรู้ ไม่ฉลาด เลือกกันแต่เจ้าพ่อเจ้าแม่เสี่ยนั้นเสี่ยนี้คนขายหวย คราวนี้เขาจะทำอะไรกันก็ได้ ชาวบ้านไม่มีปัญญาจะรู้ทันเลย ปัจจัยอยู่ที่เงิน ก็จะหากันแต่เงิน ร้อนก็โทสะจะแรง ก็จะใช้แต่อารมณ์ ใช้แต่คำพูดทะเลาะกันไปมา เลยทำให้ไม่เจริญกันหนักไปอีกใช่หใม ร้อน ประชาธิปไตยเลยล้มเหลว ต้องปฏิวัติกันอีก ไม่สามารถทรงตัวพัฒนาไปได้เลย
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on July 23, 2019, 09:27:18 am
เช้ายังเย็นพอได้อยู่ สายบ่ายมาก็ต้องจอดป้าย  >:(
มาต่อกันดีกว่า คราวนี้มาลองดีบักดู AVR Studio 4.17 นี้ดีบักแบบ simulator ได้ โดยเวลาที่เรา built ก็จะได้ไฟล์ .elf ด้วย ซึ่งไฟล์ตัวนี้จะใช้ในการดีบักแบบ simulator ไม่ต้องโปรแกรมลงในตัว mcu ดีบักลอยๆได้เลย ก็สามารถดูการทำงานของมันได้ ดูรีจีสเตอร์ดูสถานะของบิทต่างๆได้ว่าเปลี่ยนแปลงไปเช่นไร

คราวนี้เรามาดีบักดูการทำงานของ ADC ดู ก็จะดูที่บิท ADSC: ADC Start Conversion กับบิท ADIF: ADC Interrupt Flag ในรีจีสเตอร์ ADCSRA – ADC Control and Status Register A ว่าเปลี่ยนแปลงไปอย่างตอนเรา

เขียนโปรแกรมเสร็จแล้วเราก็ built โปรแกรมได้เลย แล้วถึง start debug
แล้วเราติ๊กที่ AD Converter ทางช่องด้านขวาบน ให้รีจีสเตอร์ ADC มาแสดงทางช่องด้านล่าง แล้วเราก็ติ๊กที่ ADCSRA เพื่อจะดูบิท ADSC กับบิท ADIF
คราวนี้เราก็กด step into ไปจนถึงแถว

Quote
while (!(ADCSRA &(1<<ADIF)));    // Wait Coversion completes

ก็จะค้างอยู่อย่างนั้น คราวนี้เรามาตั้งเบรคพ้อยท์ที่แถว

Quote
   ADCResult = ADCW;                           // Get 10 Bit Result

แล้วกด run ไป คราวนี้ก็จะผ่านแถวเช็ค ADIF มาได้ คือ ADC conversion เสร็จ สังเกตเห็นว่าบิท ADIF จะติดเป็น "1"
คราวนี้เราก็มากด step into ใหม่วนมาแถว

Quote
ADCSRA |= (1<<ADSC);                  // Start ADC Conversion

พอ step into ผ่านแถวนี้ไป บิท ADSC ก็จะเป็น "1" แล้วบิท ADIF จะดับเป็น "0" สลับกัน

(https://i.imgur.com/0CRJl7I.png)

บิท ADSC เราเขียนให้เป็น "1" ตอนที่เราต้องการ start ADC conversion บิทนี้จะค้างเป็น "1" ไปจนกว่า ADC conversion จะเสร็จลง ADC data register มีข้อมูล
ส่วนบิท ADIF จะเป็น "1" เมื่อ  ADC conversion เสร็จลง ADC data register มีข้อมูล และจะเป็น "0" เมื่อบิท ADSC ถูกเขียนให้เป็น "1" ใหม่
 
เราจะใช้

Quote
//while(ADCSRA & (1<<ADSC));                  // Wait ADC Complete

แทน

Quote
while (!(ADCSRA &(1<<ADIF)));    // Wait Coversion completes

เพื่อเช็คว่าการ ADC coversion ทำงานเสร็จแล้วได้ด้วยเหมือนกัน

http://www.mediafire.com/file/j7g18me7y8iptjd/adc_usart3_1.rar/file


ปล. ท่านใดอยากเป็น ARM Cortex-M ต้องรอให้ AVR ATmega328p เสร็จก่อนนะ ปีนึงเสร็จใหมนี่  :'(



Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on July 27, 2019, 10:13:30 am
http://www.mediafire.com/file/j6173ottig2hj6p/sleep3%25282%2529.rar/file (http://www.mediafire.com/file/j6173ottig2hj6p/sleep3%25282%2529.rar/file)

ลองดูโปรแกรมนี้ให้หน่อยครับ มันทำงานได้นะ แต่จะงงๆที่จุดนี้ ว่ามันทำงานได้อย่างไร

Quote
     while(a);       

ถ้า a เป็น 0 มันน่าจะผ่านใช่ใหม แต่กลับค้างอยู่ พอ interrupt พอ a เป็น 1 กลับผ่านทำให้ PD6 กระพริบมาได้ แต่พอเอาฟังชั่น sleep ออก  ก็กลับกันไปอีก งง

อีกอย่าง ตัวแปร bool ทำใมประกาศไม่ได้หล่ะ built แล้วจะ error

ปล. ใครเอารูปโป้ออกไปไหนหล่ะ ยังไม่ได้ดูเลย  :o
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on July 29, 2019, 09:30:48 am
พรายกระซิบบอก จะไปเช็คแฟลกทำใม เอาแฟลกออก ก็เออใช่สิ พออินเตอร์รัพท์ก็ตื่นจาก 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 (http://www.mediafire.com/file/svs0zxjbl2ehy13/sleep3%25283%2529.rar/file)


(https://i.imgur.com/nPR5xKJ.jpg)

คราวนี้การใช้งาน อย่างไปนอกสถานที่ เราก็ใช้ถ่าน 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 นะ เผื่อใครหาไม่เจอ
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on July 30, 2019, 08:58:37 am
  นี่เอาสวิทช์อีกตัวมาคุม พอเราจะจากไปแล้ว เราก็กดสวิทช์ให้บอร์ดเข้าสู่ sleep mode เพื่อประหยัดพลังงาน พอเรากลับมาจะดูก็กดสวิทช์อีกตัว ให้บอร์ดมัน wake up ขึ้นมาทำงานอีก อย่างนี้

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

(https://i.imgur.com/CQPINeB.jpg)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on July 30, 2019, 09:01:23 am
เรื่อง input output ก็เอามาจากที่นี่ http://www.elecrom.com/avr-tutorial-2-avr-input-output/ (http://www.elecrom.com/avr-tutorial-2-avr-input-output/)
Title: Re: Atmega328P Datasheet 14. PM - Power Management and Sleep Modes
Post by: tha on July 31, 2019, 08:58:58 am
  ขอแก้ใขโปรแกรม 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 (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 ก็ลองไล่เช็คดู ว่ามีฟังชั่นอะไรให้เราใช้ได้บ้าง