Electoday 2025

ไมโครคอนโทรลเลอร์ => AVR and Arduino => Topic started by: tha on January 05, 2018, 08:19:38 AM

Title: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on January 05, 2018, 08:19:38 AM
15. SCRST - System Control and Reset

15.1. Resetting the AVR
ในระหว่าง reset, I/O Registers ทั้งหมดถูกเซทไปยังค่าเริ่มต้นของมัน, และ the program สตาร์ทการปฏิบัติงานจาก the Reset Vector. คำสั่งที่วางที่ the Reset Vector ต้องเป็นคำสั่ง an Absolute Jump instruction (JMP) ไปยัง the reset handling routine สำหรับ. ถ้า the program ไม่เปิดการใช้งาน an interrupt source, the Interrupt Vectors จะไม่ถูกใช้, และ program code ปกติสามารถถูกวางที่ตำแหน่งนี้. นี่ก็เป็นกรณีถ้า the Reset Vector อยู่ในส่วนแอ็พพลิเคชันในขณะที่ the Interrupt Vectors อยู่ในส่วนบูตหรือในทางกลับกัน. The circuit diagram ใน the next section แสดง the reset logic.

The I/O ports ของ the AVR จะถูกรีเซ็ตเป็นสถานะเริ่มต้นทันทีเมื่อแหล่งสัญญาณรีเซ็ตแหล่งหนึ่ง active. นี้ไม่ต้องการใช้แหล่งสัญญาณนาฬิกาใด ๆรันให้

หลังจาก reset sources ทั้งหมดหายไป, a delay counter ถูกปลุกขึ้น, ยืดเวลา the internal reset ออกไป. นี้ยอมให้ the power ไปถึงระดับที่มั่นคงก่อนที่การทำงานปกติจะสตาร์ท. The time-out period ของ the delay counter ถูกกำหนดโดย the user ผ่านทาง the SUT and CKSEL Fuses. ทางเลือกที่แตกต่างกันสำหรับ the delay period ถูกแสดงใน the System Clock and Clock Options chapter.

ปล. program address 0x00(เริ่มต้น) เป็น reset vector ใช่หรือเปล่า เป็นคำสั่ง jump ให้ข้าม interrupt vector ไปยัง main program ใช่มัํย ชักลืมแล้ว
http://web.csulb.edu/~hill/ee346/Lectures/10%20ATmega328P%20Interrupts.pdf (http://web.csulb.edu/~hill/ee346/Lectures/10%20ATmega328P%20Interrupts.pdf)
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on January 07, 2018, 11:14:00 AM
15.2. Reset Sources
The device นี้มีแหล่งของการ reset ดังต่อไปนี้:
• Power-on Reset. The MCU ถูกรีเซทเมื่อ the supply voltage น้อยกว่า the Power-on Reset threshold (ธรณีประตู,จุดเริ่มต้น,จุดเปลี่ยนผ่าน)(VPOT).
• External Reset. The MCU ถูกรีเซทเมื่อลอจิกต่ำ(a low level)ปรากฏบน the RESET pin เป็นเวลานานกว่า the minimum pulse length.
• Watchdog System Reset. The MCU ถูกรีเซทเมื่อ the Watchdog Timer period สิ้นสุดลงและ the Watchdog System Reset mode ถูก enabled.
• Brown-out Reset. The MCU ถูกรีเซทเมื่อ the supply voltage VCC น้อยลงกว่า the Brown-out Reset threshold (VBOT) และ the Brown-out Detector ถูก enabled.

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

มันมี rs flipflop ตรวจเช็คตอนท้ายอยู่ เมื่อมีสัณญาน reset เกิดขึ้น ขา S ของฟลิบฟลอบเป็น "1" ขา Q ก็เซทด้วย เกิด internal reset พอสัณญาน reset หายไป (ขา S เป็น "0") ขา Q ก็ยังเซทค้างอยู่ (internal reset ก็ยังเซทค้างอยู่) จนกระทั่ง time out ขา R ของฟลิบฟลอบเป็น "1" ขา Q จึงถูกรีเซทกลับเป็น "0" internal reset ถึงหมดไป mcu ถึงได้เริ่มต้นทำงาน อย่างนี้ถูกต้องใหม
ปล. มีอะไรทำก็ค่อยยังชั่วหน่อย ไม่งั้นก็ว่างยาวเลย  :)
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on January 08, 2018, 09:32:49 AM
15.3. Power-on Reset
A Power-on Reset (POR) pulse ถูกสร้างขึ้นโดย an On-chip detection circuit. The POR จะทำงานเมื่อ VCC ต่ำกว่า the detection level. The POR circuit สามารถใช้เพื่อเริ่มต้น(ทริกค์) the start-up Reset, รวมถึงการตรวจจับความล้มเหลวของ supply voltage.

A Power-on Reset (POR) circuit ทำให้แน่ใจว่า the device ถูกรีเซทจากการ Power-on. เมื่อถึง the Power-on Reset threshold voltage จะปลุก the delay counter, ซึ่งกำหนดความนานเท่าไหร่ที่ the device ถูกเก็บไว้ใน Reset หลังจาก VCC พุ่งขึ้น. The Reset signal ถูกทำงานขึ้นอีกครั้ง, โดยปรารถจากการหน่วงเวลา, เมื่อ VCC ลดลงต่ำกว่า the detection level.

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

(https://i.imgur.com/qZ5F75G.png)
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on January 10, 2018, 10:02:03 AM
15.4. External Reset
An External Reset ถูกกำเนิดขึ้นโดยสัญญานระดับต่ำ (a low level) บน the RESET pin. Reset pulses ที่ยาวนานกว่า the minimum pulse width จะกำเนิด a reset, ถึงแม้ว่า the clock ไม่ได้รันอยู่ก็ตาม. พลัสส์ที่สั้นกว่า(Shorter pulses) ไม่กะรันตีว่าจะเกิดสัญญาน a reset. เมื่อศัญญานที่เราเอามาใช้(the applied signal) ถึง the Reset Threshold Voltage (VRST) บนขอบด้านบวกของมัน, the delay counter จะสตาร์ท the MCU หลังจาก the Time-out period (tTOUT ) หมดลง. The External Reset สามารถถูก disabled โดย the RSTDISBL fuse.

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

Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on January 10, 2018, 10:42:44 AM
15.5. Brown-out Detection
The device มี an On-chip Brown-out Detection (BOD) circuit เพื่อตรวจจับ the VCC level ในระหว่างการทำงานโดยเปรียบเทียบมันกับ a fixed trigger level. The trigger level สำหรับ the BOD สามารถถูกเลือกได้โดย the BODLEVEL Fuses. The trigger level มี curve ช่วงขาขึ้นกับช่วงขาลงไม่ตรงกัน (a hysteresis) เพื่อให้แน่ใจว่ามีช่วงฟรีระหว่างขึ้นกับลง (spike free) Brown-out Detection. The hysteresis บน the detection level ควรถูกแปลความหมายเป็น VBOT+ = VBOT + VHYST/2 และ VBOT- = VBOT -VHYST/2. เมื่อ the BOD ถูก enabled, and VCC ลดลงถึงค่าที่ต่ำกว่า the trigger level (VBOT- ในรูปต่อจากนี้), the Brown-out Reset จะถูก activated โดยทันที เมื่อ VCC เพิ่มขึ้นเหนือ the trigger level (VBOT+ ในรูปต่อจากนี้), the delay counter จะสตาร์ท the MCU หลังจาก the Time-out period (tTOUT ) หมดลง

The BOD circuit จะตรวจพบเพียงการต่ำลงของ VCC ถ้า the voltage ยังคงอยู่ต่ำกว่า the trigger level เป็นเวลานานกว่า tBOD เท่านั้น

(https://i.imgur.com/jcwFhfx.png)
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on January 10, 2018, 10:53:49 AM
15.6. Watchdog System Reset
เมื่อ the Watchdog หมดเวลาลง, จะทำให้เกิด a short reset pulse ของช่วงเวลา 1 CK cycle . ที่ขอบขาลงของพลัสนี้, the delay timer เริ่มต้นนับ the Time-out period tTOUT.

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

อากาศเย็นก็ไปได้ไวหน่อย  :)
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on January 11, 2018, 02:11:55 PM
15.7. Internal Voltage Reference
The device มี an internal bandgap reference. reference นี้ถูกใช้สำหรับ Brown-out Detection, และมันสามารถถูกใช้เป็นอินพุทไปยัง the Analog Comparator หรือ the ADC.

15.7.1. Voltage Reference Enable Signals and Start-up Time
The voltage reference มี a start-up time ที่อาจมีผลต่อวิธีที่มันควรถูกใช้ . เพื่อประหยัดพลังงาน, the reference นี้ไม่ได้เปิดตลอด. The reference นี้ถูกเปิดในระหว่างสถานการณ์ต่อไปนี้:
1. เมื่อ the BOD ถูก enabled (โดยการโปรแกรม the BODLEVEL [2:0] Fuses).
2. เมื่อ the bandgap reference ถูกต่อไปยัง the Analog Comparator (โดยการเซท the ACBG bit ใน ACSR (ACSR.ACBG)).
3. เมื่อ the ADC ถูก enabled.
ดังนั้น, เมื่อ the BOD ไม่ถูก enabled, หลังจากการเซท ACSR.ACBG หรือเปิดใช้งาน the ADC, ผู้ใช้ต้องยอมให้ the reference ได้ start up ก่อนที่ the output จาก the Analog Comparator หรือ ADC ถูกใช้. เพื่อลดการใช้พลังงานลงในโหมด Power-Down mode, the user สามารถหลีกเลี่ยงเงื่อนไขสามประการดังกล่าวข้างต้นเพื่อให้แน่ใจว่า the reference ถูกปิดก่อนที่จะเข้าสู่โหมด Power-Down

ปล. bandgap หมายถึงอะไรนะ ชักจะลืมแล้ว   :P
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on January 12, 2018, 09:10:53 AM
15.8. Watchdog Timer
ถ้า the watchdog timer ไม่ถูกต้องการใช้ใน the application, the module ควรถูก turned off. ถ้า the watchdog timer ถูก enabled, มันจะถูก enabled ใน sleep modes ทั้งหมดและดังนั้นจึงกินพลังงานเสมอ. ใน the deeper(ลึกๆนานๆ) sleep modes, นี้จะมีส่วนร่วมอย่างมากต่อ the total current consumption.
โปรดดู Watchdog System Reset เพื่อดูรายละเอียดเกี่ยวกับการกำหนดค่า the watchdog timer.

15.8.1. Features
• สัญญานนาฬิกาจาก separate(ที่แยกต่างหาก) On-chip Oscillator
• สามโหมดการทำงาน :
  – Interrupt
  – System Reset
  – Interrupt and System Reset
• Time-out period ที่สามารถเลือกได้จาก 16ms ถึง 8s
•  Hardware fuse Watchdog เป็นไปได้ที่จะออนเสมอ (WDTON) สำหรับ fail-safe mode

15.8.2. Overview
The device มี an Enhanced Watchdog Timer (WDT). The WDT คือ a timer ที่นับรอบของ a separate(ที่แยกต่างหาก) on-chip 128kHz oscillator. The WDT ให้เกิด an interrupt หรือ a system reset เมื่อการนับถึงค่าการหมดเวลาที่กำหนด. ในโหมดการทำงานปกติ, มันมีความจำเป็นที่ระบบจะใช้คำสั่ง the Watchdog Timer Reset (WDR) เพื่อรีสตาร์ท the counter ก่อนที่จะถึง the time-out value . ถ้า the system ไม่เริ่มต้นนับ the counter ใหม่, an interrupt หรือ system reset ก็จะถูกปล่อยออกมา.

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

ปล. เดี๋ยวจะลองทำตัวอย่าง watchdog time ดู แต่ต้องให้อธิบายแต่ละบิทเสร็ฐก่อนเพื่อความเข้าใจบิทและ library ตอนนี้ก็ลองเสริจกูเกิ้ลด้วย avr watchdog timer เพื่อหาตัวอย่างดูไปพรางๆก่อนนะ  ;)
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on January 12, 2018, 09:26:10 AM
ในหนังสือ การเขียนโปรแกรมควบคุมไมโครคอนโทรลเลอร์ AVR ด้วยภาษา C กับ WinAVR C Compiler (AVR Book 1) ก็มีตัวอย่างอยู่ ดูหลายๆทางจะได้แน่น
http://www.appsofttech.com/store/product/view/%E0%B8%AB%E0%B8%99%E0%B8%B1%E0%B8%87%E0%B8%AA%E0%B8%B7%E0%B8%AD%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%80%E0%B8%82%E0%B8%B5%E0%B8%A2%E0%B8%99%E0%B9%82%E0%B8%9B%E0%B8%A3%E0%B9%81%E0%B8%81%E0%B8%A3%E0%B8%A1%E0%B8%84%E0%B8%A7%E0%B8%9A%E0%B8%84%E0%B8%B8%E0%B8%A1%E0%B9%84%E0%B8%A1%E0%B9%82%E0%B8%84%E0%B8%A3%E0%B8%AF_AVR_%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2_C_%E0%B9%80%E0%B8%A5%E0%B9%88%E0%B8%A1_1-19590643-th.html (http://www.appsofttech.com/store/product/view/%E0%B8%AB%E0%B8%99%E0%B8%B1%E0%B8%87%E0%B8%AA%E0%B8%B7%E0%B8%AD%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%80%E0%B8%82%E0%B8%B5%E0%B8%A2%E0%B8%99%E0%B9%82%E0%B8%9B%E0%B8%A3%E0%B9%81%E0%B8%81%E0%B8%A3%E0%B8%A1%E0%B8%84%E0%B8%A7%E0%B8%9A%E0%B8%84%E0%B8%B8%E0%B8%A1%E0%B9%84%E0%B8%A1%E0%B9%82%E0%B8%84%E0%B8%A3%E0%B8%AF_AVR_%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2%E0%B8%A0%E0%B8%B2%E0%B8%A9%E0%B8%B2_C_%E0%B9%80%E0%B8%A5%E0%B9%88%E0%B8%A1_1-19590643-th.html)
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on January 16, 2018, 10:44:11 AM
ใน Interrupt mode, the WDT ให้ an interrupt เมื่อ the timer หมดเวลาลง. interrupt สามารถถูกใช้เพื่อปลุก the device จาก sleep-modes, และเป็นดัง a general system timer ได้อีกด้วย. ตัวอย่างหนึ่งคือเพื่อจำกัดเวลาสูงสุดที่ยอมได้สำหรับการดำเนินงานบางอย่าง, ให้ an interrupt เมื่อการทำงานได้รันยาวนานกว่าที่คาดไว้. In System Reset mode, the WDT ให้ a reset เมื่อ the timer หมดเวลาลง.  โดยปกติจะใช้เพื่อป้องกันไม่ให้ system hang-up(วางลง,แฮ๊ง) ในกรณีของ runaway code. โหมดที่สาม, Interrupt and System Reset mode, รวมสองโหมดก่อนหน้าโดยอันดับแรกให้ an interrupt และจากนั้นจึงสวิทช์ไปยัง System Reset mode. โหมดนี้จะช่วยให้สามารถปิดระบบได้อย่างปลอดภัยโดยการบันทึกพารามิเตอร์ที่สำคัญก่อนที่จะรีเซ็ตระบบ
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on January 17, 2018, 09:42:49 AM
The Watchdog always on (WDTON) fuse, ถ้าโปรแกรม, จะฟอร์ซให้ the Watchdog Timer เป็น System Reset mode. ด้วย the fuse ที่โปรแกรม the System Reset mode bit (WDE) and Interrupt mode bit (WDIE) ถูกล็อคเป็น 1 และ 0 ตามลำดับ. เพื่อให้มั่นใจถึงความปลอดภัยของโปรแกรมยิ่งขึ้น, การปรับเปลี่ยนการตั้งค่า the Watchdog  ต้องเป็นไปตามลำดับเวลาที่กำหนด ลำดับสำหรับการเคลียร์ WDE และการเปลี่ยนการกำหนดค่าหมดเวลาเป็นดังต่อไปนี้ :

1. ในการดำเนินการเดียวกัน, เขียนลอจิก "1" ไปยัง the Watchdog change enable bit (WDCE) และ Watchdog System Reset Enable (WDE) ใน Watchdog Timer Control Register (WDTCSR.WDCE และ WDTCSR.WDE). ลอจิก "1" ต้องถูกเขียนไปยัง WDTCSR.WDE โดยไม่คำนึงถึงค่าก่อนหน้าของ the WDTCSR.WDE
2. ภายใน 4 clock cycles ถัดไป, เขียน the WDTCSR.WDE และกลุ่ม Watchdog prescaler bits group (WDTCSR.WDP) ตามที่ต้องการ, แต่ the
WDTCSR.WDCE ถูกเคลียร์ด้วย. นี้ต้องถูกทำใน one operation.

ปล. ยังไม่แน่ใจตรง but with the WDTCSR.WDCE cleared หมายถึงถูกเคลียร์โดยอัตโนมัติไปด้วยใช่หรือไม่
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on January 19, 2018, 09:43:14 AM
ตัวอย่างต่อไปนี้แสดงฟังก์ชันสำหรับการปิด the Watchdog Timer. ตัวอย่างทึกทักเอาว่า interrupts ถูกควบคุม (เช่นโดยการปิดใช้งาน interrupts globally(โดยรวม)) ดังนั้นไม่มี interrupts จะเกิดขึ้นในระหว่างการปฏิบัติของฟังชั่นเหล่านี้.

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

หมายเหตุ: หาก Watchdog เปิดการใช้งานโดยไม่ตั้งใจตัวอย่างเช่นโดย a runaway pointer หรือ brown-out condition, the device จะถูกรีเซทและ the Watchdog Timer จะยังคง enabled. หาก the code ไม่ได้ set up ให้รับมือกับ the Watchdog, นี้อาจนำมาซึ่งการวนลูปอย่างไม่รู้จบของ timeout resets. เพื่อหลีกเลี่ยงปัญหานี้ ซอฟต์แวร์แอ็พพลิเคชันควรเคลียร์ the Watchdog System Reset Flag (WDRF) และ the WDE control bit ในการเริ่มต้นงานประจำแม้ว่า Watchdog ไม่ได้ใช้งาน

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการเปลี่ยนค่าการหมดเวลาของ the Watchdog Timer.

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

หมายเหตุ: The Watchdog Timer ควรถูกรีเซ็ทก่อนการเปลี่ยนของ the WDTCSR.WDP bits, เนื่องจากการเปลี่ยนแปลงใน the WDTCSR.WDP bits สามารถเป็นผลใน a time-out เมื่อสวิทช์ไปใช้ระยะเวลาการหมดเวลาที่สั้นลง (a shorter time-out period)
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on February 02, 2018, 10:57:45 AM
15.9.1. MCU Status Register
ในการใช้ประโยชน์ the Reset Flags เพื่อระบุ a reset condition, ผู้ใช้ควรอ่านและจากนั้นรีเซ็ท the MCUSR ให้เร็วที่สุดเท่าที่จะเป็นไปได้ในโปรแกรม ถ้ารีจิสเตอร์ถูกเคลียร์ก่อนการรีเซ็ตอื่นเกิดขึ้น แหล่งรีเซ็ตสามารถถูกตรวจพบโดยการตรวจสอบ the Reset Flags.
เมื่อระบุที่อยู่ 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/9h7i5y1.png)

Bit 3 – WDRF: Watchdog System Reset Flag
บิทนี้ถูกเซ็ทถ้า a Watchdog System Reset เกิดขึ้น. บิทนี้ถูกรีเซ็ทโดย a Power-on Reset, หรือโดยการเขียน '0'ไปยังมัน.

Bit 2 – BORF: Brown-out Reset Flag
บิทนี้ถูกเซ็ทถ้า a Brown-out Reset เกิดขึ้น. บิทนี้ถูกรีเซ็ทโดย a Power-on Reset, หรือโดยการเขียน '0'ไปยังมัน.

Bit 1 – EXTRF: External Reset Flag
บิทนี้ถูกเซ็ทถ้า an External Reset เกิดขึ้น. บิทนี้ถูกรีเซ็ทโดย a Power-on Reset, หรือโดยการเขียน '0'ไปยังมัน.

Bit 0 – PORF: Power-on Reset Flag
บิทนี้ถูกเซ็ทถ้า a Power-onl Reset เกิดขึ้น. บิทนี้ถูกรีเซ็ทโดยการเขียน '0'ไปยังมันเพียงอย่างเดียวเท่านั้น.

ปล. หมู่นี้ตาไม่ค่อยดี ตาขวาพร่า ไปลอกตาก็ไม่ได้ ติดเป็นเบาหวาน เลยไม่ค่อยจะได้แปล
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on June 27, 2019, 06:43:20 PM
อันนี้จบแล้วหรือยัง เลื่อนไปต้นๆก่อน จะได้ไม่ลืม เดี๋ยวดูดาต้าชีทอีกที
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on August 01, 2019, 09:26:15 AM
   อันนี้ยังไม่จบนี่ นึกว่าจบเสียแล้ว เดี๋ยวจะแปลต่อ แต่ทำตัวอย่างเสียก่อนแล้ว เอาลงให้ดูก่อนเลยนะ เดี๋ยวจะลืม watchdog timer อันนี้ไม่ต้องเลือกติ๊กถูกที่ WDTON ใน FUSE BITS นะ(ดูในตาราง Table 15-1. Watchdog Timer Configuration) จะกลายเป็นเลือก system reset mode เพียงอย่างเดียวไป เราจะใช้การเซทบิทเอา ตามตัวอย่างในดาต้าชีทนั่นแหละ

  ตัวอย่างการใช้ watchdog timer ไฟก็กระพริบไปตามปกติ แต่พอเรากดสวิทช์ ทำงานฟังชั่นดีเลย์ watchdog ไม่รีเซทสักที่ พอเลยเวลา 2 วินาที watchdog ก็จะรีเซทระบบ เริ่มต้นการทำงานใหม่

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

http://www.mediafire.com/file/3yeomtxd6kc1mwf/wdt.rar/file (http://www.mediafire.com/file/3yeomtxd6kc1mwf/wdt.rar/file)

http://www.mediafire.com/file/csyjd79sv4gol5n/wdt_1.rar/file (http://www.mediafire.com/file/csyjd79sv4gol5n/wdt_1.rar/file)

ปล. ท่านใดอยากจะมีสมาธิดีๆ ก็หัดนั่งสมาธินะ จะอ่านหนังสือได้ดี ใจไม่วอกแวกไปตามนิวรณ์ ๕ ลมหายใจก็จะลึกยาวละเอียด เป็นผลดีต่อสุขภาพ ไม่ค่อยเป็นหวัดเป็นไอ ง่ายๆเลย ลมหายใจเข้า "พุท" ลมหายใจออก "โธ" ประคองไป แรกๆก็จะยากหน่อยเพราะยังคิดมากอยู่ ก็จะดีขึ้นเรื่อยๆนะ ของอย่างนี้มันต้องใช้เวลา ค่อยเป็นค่อยไป ไม่ต้องเร่งรีบ
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on August 02, 2019, 08:50:09 AM
15.9.2. WDTCSR – Watchdog Timer Control Register

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

Bit 7 – WDIF: Watchdog Interrupt Flag
บิทนี้จะเซทเมื่อการหมดเวลา (timeout) เกิดขึ้นใน Watchdog Timer และ Watchdog Timer นั้นถูกกำหนดไว้สำหรับ Interrupt ด้วย บิท WDIF จะถูกเคลียร์โดย hardware เมื่อปฏิบัติ the corresponding(ที่ตรงกัน) interrupt handling vector นั้น อีกทางเลือกหนึ่ง WDIF จะถูกเคลียร์โดยการเขียน "1" ไปยังมัน เมื่อ I-bit(Global Interrupt) ใน SREG และ WDIE ถูกเซท Watchdog Timeout Interrupt นั้นจะถูกปฏิบัติ

Bit 6 – WDIE: Watchdog Interrupt Enable
เมื่อบิทนี้ถูกเขียนให้เป็น "1" และ  I-bit(Global Interrupt) ใน Status Register ถูกเซท Watchdog Interrupt จะถูกเปิดใช้งาน ถ้า WDE ถูกเคลียร์ร่วมด้วยในการเซทครั้งนี้ Watchdog Timer จะอยู่ใน Interrupt Mode, และ corresponding(ที่ตรงกัน) interrupt จะถูกปฏิบัติ ถ้า timeout (หมดเวลา) ใน Watchdog Timer  เกิดขึ้น ถ้า WDE ถูกเซท Watchdog Timer จะอยู่ใน Interrupt and System Reset Mode. การ timeout ครั้งแรกใน Watchdog Timer จะเซท WDIF การปฏิบัติ corresponding interrupt vector จะเคลียร์ WDIE และ WDIF โดยอัตโนมัติโดย hardware (the Watchdog จะไปสู่โหมด System Reset Mode).

นี้จะเป็นประโยชน์สำหรับเก็บ Watchdog Timer ไว้ในความปลอดภัยขณะใช้งาน interrupt นี้อยู่ เพื่อให้อยู่ในโหมด Interrupt and System Reset Mode, บิท WDIE จะต้องถูกเซทหลังจากแต่ละ interrupt อย่างไรก็ตาม ไม่ควรทำภายใน interrupt service routine ของมันเอง การทำเช่นนี้จะ compromise กันได้กับ safety function ของ Watchdog System Reset mode ถ้าการ interrupt ไม่ถูกปฏิบัติก่อนการหมดเวลาครั้งหน้า System Reset จะถูกใช้

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

Note: 1. WDTON Fuse ถูกเซทให้เป็น '0' หมายถึงถูก programm(คือกดติ้กถูกใน Fuse Bits) และ '1' หมายถึง unprogrammed (ไม่ถูกโปรแกรม คือไม่กดติ้กถูกใน Fuse Bits)

Bit 5 – WDP[3]: Watchdog Timer Prescaler 3


ปล. การนั่งสมาธิก็ต้องมีหัวมีหางหน่อย ก็กราบขอบพระคุณ คุณพระพุทธ คุณพระธรรม คุณพระสงฆ์ ก่อนและหลังการนั่งสมาธิ หลังการนั่งสมาธิก็ภาวนาธรรมะอย่างพรหมวิหาร 4 ร่วมด้วยก็จะดี เอาอย่างนี้ก็ได้ ภาษาไทยเลย จิตเราจะเข้าใจ แล้วจะเกิดผลดี ชีวิตจะดีขึ้นแน่ๆครับ

พรหมวิหาร ๔
๑.เมตตา คือ ความรัก ความปรารถนาดี ความมีไมตรี อยากให้ผู้อื่นมีความสุข
๒.กรุณา คือ ความสงสาร อยากช่วยเหลือให้ผู้อื่นพ้นจากความทุกข์
๓.มุทิตา คือ ความเบิกบานพลอยยินดี เมื่อเห็นผู้อื่นได้รับความสุขหรือความสำเร็จ ก็พลอยเบิกบานบันเทิงใจไปด้วย
๔.อุเบกขา คือ ความมีใจเป็นกลาง มองตามความเป็นจริง จิตใจราบเรียบสม่ำเสมอ เมื่อเห็นผู้อื่นได้รับผลกรรมตามที่ตนประกอบ ไม่เอนเอียง วางตนเที่ยงธรรม
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on August 02, 2019, 01:35:32 PM
ขออธิบายหน่อย บางท่านอาจจะไม่ทราบ ว่าทำแบบนี้หมายถึงอะไร
อย่างการกลับบิทแล้ว AND อย่างนี้

QuoteDDRD &= ~(1<<DDD3);           // port D3 is input

ซึ่งที่เรา include ไฟล์ io.h ไว้ในไฟล์ wdt.c ของเราใช่ไหม เพราะตอนเราสร้าง new project ใน AVR Studio 4.17 เราระบุเลือกเบอร์ ATmega328p เอาไว้ใช่ไหม ทำให้ไฟล์ io.h จะลิ้งค์ไปสู่ไฟล์ iom328p.h คราวนี้เราก็มาดูที่ไฟล์ iom328p.h ว่ามีอะไรบ้าง (ไฟล์จะอยู่ใน C:\WinAVR-20100110\avr\include\avr)

Quote
#define DDRD _SFR_IO8(0x0A)
#define DDD0 0
#define DDD1 1
#define DDD2 2
#define DDD3 3
#define DDD4 4
#define DDD5 5
#define DDD6 6
#define DDD7 7

ก็จะมีการ define เอาไว้ อย่างเช่น DDRD ก็จะเป็น special function register IO ตำแหน่งอยู่ที่แอดเดรส 0x0A ใช่ไหม
อย่าง DDD3 ก็ถูก define ไว้ว่ามีค่าเท่ากับ 3

คราวนี้เราก็มาดูตรงนี้ก่อนนะ (1<<DDD3) หมายถึงเรา shift left ข้อมูล "1" ของข้อมูลชั่วคราว 8 บิท ไป 3 ตำแหน่ง เพราะ DDD3 = 3 ก็จะได้ข้อมูล 8 บิทชั่วคราวเป็น 0b00001000

คราวนี้ต่อไปก็ทำกลับบิท ~(1<<DDD3) ก็จะทำการกลับบิทข้อมูลชั่วคราว 8 บิทจาก 0b00001000 ก็จะได้เป็น 0b11110111

คราวนี้มา &(AND) กับรีจีสเตอร์ DDRD &= ~(1<<DDD3); ก็จะมีความหมายว่า DDRD = DDRD & 0b11110111

ก็จะหมายถึงว่าเอาข้อมูลในรีจีสเตอร์ DDRD 8 บิทมา AND กับข้อมูลชั่วคราว 0b11110111
ก็จะหมายถึงว่าให้ข้อมูลในรีจีสเตอร์ DDRD อยู่คงเดิม ให้เฉพาะบิทที่ 3 กลายเป็น 0 เพียงบิทเดียว

ส่วนการ OR กันอย่างนี้ ก็จะคล้ายๆกัน ลองทำความเข้าใจดู ว่าให้บิทไหนในรีจีสเตอร์ WDTCSR เป็น "1" บ้าง ส่วนบิทอื่นจะคงเดิม ดูตำแหน่งบิทของรีจีสเตอร์นั้น ในดาต้าชีทประกอบเอานะ

QuoteWDTCSR |= (1<<WDCE) | (1<<WDE);

ส่วนการ = ก็จะไม่เหมือนการ OR เพราะจะทำให้บิทที่แสดงนั้นเป็น "1" ส่วนบิทอื่นในรีจีสเตอร์จะกลายเป็น "0" หมด

QuoteWDTCSR = (1<<WDE) | (1<<WDP2) | (1<<WDP1)| (1<<WDP0);

ลองทำความเข้าใจดูนะ ไม่เข้าใจก็สอบถามมาได้ครับ
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on August 03, 2019, 09:03:02 AM
Bit 4 – WDCE: Watchdog Change Enable
เมื่อบิทนี้ถูกใช้ในการทำงานตามลำดับเวลา (timed sequences) สำหรับเปลี่ยนบิท WDE และบิท prescaler bits เพื่อที่จะเคลียร์บิท WDE และ/หรือเปลี่ยนบิท prescaler bits บิท WDCE ต้องถูกเซท เมื่อถูกเขียนให้เป็น "1" แล้ว hardware จะเคลียร์ WDCE หลังจาก 4 clock cycle

Bit 3 – WDE: Watchdog System Reset Enable
บิท WDE ถูกครอบงำโดยบิท WDRF ใน MCUSR นี้หมายถึงว่าบิท WDE จะเซทเสมอเมื่อบิท WDRF ถูกเซท เพื่อที่จะเคลียร์ WDE บิท WDRF ต้องถูกเคลียร์ก่อน คุณสมบัตินี้ช่วยให้มั่นใจได้ว่าจะรีเซ็ตหลายครั้งในช่วงที่เกิดสภาวะความล้มเหลวและการเริ่มต้นอย่างปลอดภัยหลังจากความล้มเหลว

Bits 2:0 – WDP[2:0]: Watchdog Timer Prescaler 2, 1, and 0
บิท WDP[3:0] กำหนด Watchdog Timer prescaling เมื่อ Watchdog Timer กำลังรัน ค่า prescaling values ที่แตกต่างกันและคาบเวลา timeout ที่ตรงกัน(กับค่า prescaling values ค่านั้น)ถูกแสดงในตารางดังต่อไปนี้

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

ปล. ก็จบละบทนี้ อยากจะให้ทำตัวอย่างไหนก็บอกมานะ ไล่แก้ตัวอย่างของตัวเองด้วย ว่ามีตัวอย่างไหนผิดอยู่ แล้วถึงจะขึ้น Interrupt เอาตามดาต้าชีทเก่านะ ดาต้าชีทใหม่เอาเบอร์อื่นมารวมอยู่เยอะเลย
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on August 05, 2019, 08:15:22 AM
ลองทำ watchdog timer interrupt mode เซทบิทยังไง ก็ลองอ่านทำความเข้าใจในดาต้าชีทดูเอานะครับ อันนี้ผมก็ลอกเอามาจากดาต้าชีทนั่นแหละ มั่วๆมาเหมือนกัน เช็คด้วยนะว่ามีผิดไหม ลองไล่บิทดูเอานะ

การทำงานของบอร์ด พอเรากดสวิทช์ PD3 ก็จะ timeout ไปทำงาน WDT Interrupt แล้วเราก็ต้อง enable interrupt ใหม่( เซทบิท WDIE ใหม่) เพราะบิท WDIE กับบิท WDIF ถูกเคลียร์ ตอนโปรแกรมเราไปทำงาน WDT interrupt ใช่ใหม อ่านดาต้าชีทดูเอานะ

http://www.mediafire.com/file/vfkb0ab8py8ikg8/wdt_2.rar/file (http://www.mediafire.com/file/vfkb0ab8py8ikg8/wdt_2.rar/file)
Title: Re: Atmega328P Datasheet 15. SCRST - System Control and Reset
Post by: tha on August 05, 2019, 09:06:40 AM
Quote
void WDT_on(void)
{
   __disable_interrupt();
   __watchdog_reset();
   /* Start timed sequence */
   WDTCSR |= (1<<WDCE) | (1<<WDE);
   /* Set new prescaler(time-out) value = 128K cycles (~1 s) */
   WDTCSR = (1<<WDE) | (1<<WDP2) | (1<<WDP1);
   __enable_interrupt();
}

ถ้าเราเซทบิท WDCE: Watchdog Change Enable แล้ว เราต้องเปลี่ยนค่า prescaler ให้ทันภายใน 4 clock cycle ใช่ใหม พอพ้นนี้แล้วบิท WDCE จะถูกเคลียร์โดย hardware ใช่ใหม ถ้าเวลาคอมไพล์โค้ดอย่างนี้ให้เป็นภาษาแอสเซมบลี่ แล้วมันจัดเรียงย่อบีบอัดก็คงจะทัน แต่เพื่อความแน่ใจ เราก็ใช้วิธีอย่างนี้ก็ได้ คือให้มันเท่ากับอย่างนี้ก็คงใช้เวลาเพียง clock cycle เดียว

Quote
void WDT_on(void)
{
   unsigned char N;
   __disable_interrupt();
   __watchdog_reset();
   N = (1<<WDE) | (1<<WDP2) | (1<<WDP1);
   /* Start timed sequence */
   WDTCSR |= (1<<WDCE) | (1<<WDE);
   /* Set new prescaler(time-out) value = 128K cycles (~1 s) */
   WDTCSR = N;
   __enable_interrupt();
}

คือเอาค่าที่เราจะเซทมารวมเก็บไว้ที่ตัวแปร N ก่อน พอเราเซท WDCE แล้ว เราก็ให้ WDTCSR = N ไปเลย อย่างนี้ก็คงจะไซเคิลเดียว ทันนะอย่างนี้ ไม่รู้ท่านใดแนะนำมา ก็ขอขอบคุณมานะที่นี้ด้วย เอ มีโปรแกรมไหนที่ทำไม่ทันนะ ชักจะลืม โปรแกรม sleep mode พร้อมกับทำ BOD disable ใช่มั๊ย แก้ไปแล้วหรือยังไม่ได้แก้นะ แต่ไม่ได้ทำวิธีนี้ วิธีนี้ดีนะดูง่ายดี