ฉันควรสอบถาม RTC บ่อยแค่ไหน?


11

ฉันยังไม่ได้ใช้ RTC ดังนั้นฉันจึงไม่แน่ใจเกี่ยวกับวิธี "ปกติ" ในการอ่านนาฬิกาตามเวลาจริง มีวิธีการที่แตกต่างกันเล็กน้อยที่ฉันคิด แต่หวังว่าจะได้รับคำแนะนำ

นี่คือวิธีที่ฉันคิดเกี่ยวกับการอ่านและการใช้เวลา:

  1. รับวันที่และเวลาเมื่อเปิดเครื่องและบันทึกลงใน RAM แล้วใช้ตัวจับเวลาขัดจังหวะการเพิ่มค่า RAM ทุกวินาทีเป็นต้นจากนั้นโค้ดจะใช้ค่าใน RAM ทุกครั้งที่จำเป็นต้องรู้วันที่ / เวลา
  2. ผ่านการใช้ตัวจับเวลาขัดจังหวะค้นหา RTC ทุกวินาทีและคัดลอกวันที่และเวลาที่ได้รับไปยัง RAM อีกครั้งรหัสจะใช้ค่าใน RAM ทุกครั้งที่จำเป็นต้องรู้วันที่ / เวลา
  3. ทุกครั้งที่ฉันต้องการทราบเวลาสอบถาม RTC และใช้การตอบกลับโดยตรง

ซึ่งจะเป็นวิธีที่ดีที่สุด


15
วิธีที่ดีที่สุดคือแนวทางที่ตรงตามข้อกำหนดของคุณในขณะที่ใช้ทรัพยากรในปริมาณน้อยที่สุด เนื่องจากเราไม่ทราบความต้องการของคุณจริงๆ "ดีที่สุด" จึงมีความหมายน้อยมากสำหรับเรา
Scott Seidman

คำตอบที่ดีมากฉันไม่สามารถเลือกคำตอบได้!
user9993

คำตอบ:


23

ฉันจะใช้ตัวเลือกที่สี่

ชิป RTC ส่วนใหญ่มีตัวเลือกในการส่งสัญญาณพัลส์ 1 วินาที คุณควรเชื่อมต่อพัลส์นั้นกับอินพุตที่เปิดใช้งานอินเตอร์รัปต์บน MCU ของคุณ

  • คุณได้รับเวลาจากชิปหนึ่งครั้งเมื่อเริ่มต้นโปรแกรมของคุณและอาจเป็นครั้งคราวนับจากนั้นเป็นต้นไป - อาจจะเป็นชั่วโมงละครั้ง
  • สัญญาณขัดจังหวะจากนั้นจะเรียกรูทีนการขัดจังหวะใน MCU ของคุณที่คุณเพิ่มเวลาโดยหนึ่งวินาที

การจัดเรียงนั้นให้ความแม่นยำกับวินาทีของ RTC โดยไม่มีค่าใช้จ่ายในการอ่าน RTC


5
เมื่อใช้วิธีนี้สิ่งสำคัญคือต้องรู้ว่าขอบนาฬิกาหมายถึงการเพิ่มขึ้นและเพื่อให้แน่ใจว่าการอ่านใด ๆ ที่กำลังดำเนินการในระหว่างขอบนาฬิกานั้นควรถูกทอดทิ้ง
supercat

หรือตรวจสอบให้แน่ใจว่าการอ่านนั้นถูกกระตุ้นโดย ISR เท่านั้น - คุณจะได้รับช่องว่างหนึ่งวินาทีเพื่อทำการอ่านก่อนที่ ISR ถัดไปจะถูกทริกเกอร์
Majenko

เมื่อใดก็ตามที่เป็นไปได้ฉันต้องการตั้งค่านาฬิกาเรียลไทม์ให้ทำงานเร็วกว่าหนึ่งขีดต่อวินาทีและใช้เพื่อกำหนดเวลาเหตุการณ์ทั่วไปถ้าตั้งค่าความละเอียด RTC ได้ดีพอที่จะตรงกับความต้องการของเหตุการณ์ ดังนั้นจึงอาจไม่เกิดการขัดจังหวะในทุก ๆ RTC tick นอกจากนี้เมื่อตั้งค่าการเตือนภัยสิ่งสำคัญคือการรู้ว่าเวลา RTC คืออะไรในขณะที่มีการตั้งค่าการเตือนและโพล RTC เพื่อดูว่ามีการเคลื่อนไหวในขณะที่ตั้งค่าการเตือนหรือไม่ ผมไม่ทราบว่าทำไมผู้ผลิตชิป 32 บิตไม่เพียงแค่มีเคาน์เตอร์ 47 บิตที่มีความสามารถในการอ่านทั้ง ...
SuperCat

... บิตสูงสุด 32 บิตหรือต่ำกว่า 31 บวกสถานะสัญญาณนาฬิกามีสัญญาณเตือนที่สามารถเปิดและปิดได้ตลอดเวลาโดยไม่มีการหน่วงเวลาการซิงโครไนซ์และการลงทะเบียนสัญญาณเตือนที่อาจเขียนได้ตลอดเวลาเมื่อสัญญาณเตือน ปิดมีความหมายว่าการเตือนภัยเกิดขึ้นหากการเพิ่มขึ้นเกิดขึ้นขณะที่สัญญาณเตือนถูกเปิดใช้งาน หากชิปสามารถยอมรับการปลุกแบบอะซิงโครนัสและซอฟต์แวร์ทำการตรวจสอบการลงคะแนนซ้ำตามความเหมาะสมไม่จำเป็นต้องมีการซิงโครไนซ์ฮาร์ดแวร์อื่นและซอฟต์แวร์จะไม่ต้องแก้ไขปัญหาที่เกิดจากการซิงโครไนซ์ฮาร์ดแวร์ในรูปแบบอื่น ๆ
supercat

9

อันดับที่ 3 และ 2 นั้นมีศักยภาพมากกว่า

วิธีที่ 3คือสิ่งที่ฉันใช้ในกรณีส่วนใหญ่ ประโยชน์คือฉันไม่ต้องกังวลกับการทำมิเรอร์ RTC ใน RAM ข้อบกพร่องที่อาจเกิดขึ้นได้คือการสอบสวน RTC ผ่านบัสอนุกรมทำให้เกิดความล่าช้า หากคุณกำลังเขียนข้อมูลหนึ่งครั้งความล่าช้านี้อาจไม่สำคัญ

2วิธีเป็นสิ่งที่ดีเกินไป การบำรุงรักษานาฬิกามิเรอร์อาจทำให้เกิดข้อผิดพลาดการจับเวลาหากอุปกรณ์กำลังทำงานเป็นเวลานาน นาฬิกากระจกสามารถแยกออกจาก RTC หากคุณอ่าน RTC เป็นประจำการดริฟท์จะไม่สะสม
อย่างไรก็ตามฉันจะแนะนำไม่ให้ทำการสื่อสารแบบอนุกรมในอินเตอร์รัปต์เซอร์วิส (ISR) ของตัวเอง ตั้งค่าสถานะใน ISR และทำการสื่อสารแบบอนุกรมใน main ()

ps ในทุกกรณีฉันใช้ DS1307


6

RTC บางตัว (เช่น MC68HC68T1 [ซึ่งเป็นที่ยอมรับกันโดยทั่วไปว่าไม่มีใครควรใช้อีกต่อไป]) จะหยุดการนับภายในเมื่ออ่านเพื่อให้การตอบสนองที่สอดคล้องกัน พวกเขาจะต้องอ่านจากบ่อยที่สุดเท่าที่จะทำได้เพื่อลดการหยุดชะงัก อ่านจากพวกเขาหนึ่งครั้งจากนั้นใช้ตัวขัดจังหวะตัวจับเวลาเพื่ออัปเดตค่าเวลาที่เก็บไว้ใน RAM ของ MCU


การออกแบบดังกล่าวรบกวนจิตใจ การมีการอ่านที่เกิดขึ้นในระหว่างการเพิ่มข้อมูลแบบสุ่มผลผลิตจะเป็นปัญหาง่ายต่อการแก้ไข การอ่านสาเหตุการนับที่พลาดไม่ได้เป็นปัญหาที่ไม่สามารถแก้ไขได้ยกเว้นการยอมรับการนับที่หายไป
supercat

2
เห็นได้ชัดว่าการบัฟเฟอร์สองครั้งเป็นสิ่งที่บางคนไม่คิดเมื่อพวกเขาออกแบบชิปของพวกเขา
Ignacio Vazquez-Abrams

หากรหัสตรวจสอบว่าการสำรวจเพื่อให้แน่ใจว่าไม่มีการเปลี่ยนแปลงค่าไม่จำเป็นต้องทำการบัฟเฟอร์ซ้ำ สำหรับนาฬิกาแบบเรียลไทม์บนชิปโพลซ้ำ ๆ จนกระทั่งไม่มีการเปลี่ยนแปลงจะทำงานแม้ว่าการขัดจังหวะจะพยายามอ่าน RTC ในเวลาเดียวกันกับรหัสสายหลักที่ทำเช่นนั้น การออกแบบบัฟเฟอร์คู่บางอย่างทำให้ยากที่จะเขียนโค้ดหลักและอินเตอร์รัปต์ที่สามารถอยู่ร่วมกันได้อย่างปลอดภัยและฉันไม่เคยเห็นที่ฉันคิดว่า "มีประโยชน์" มาใช้
supercat

5

ฉันจะสมมติว่า RTC เป็นทั้งชิปที่แยกออกมาพร้อมคริสตัลของตัวเองหรือโมดูลที่รวมเข้ากับไมโครคอนโทรลเลอร์ของคุณที่มีแหล่งเวลาแยกต่างหากอีกครั้ง (เช่นคริสตัล 32 kHz) กว่านาฬิกาหลัก และแหล่งเวลาสำหรับ RTC นั้นแม่นยำกว่าแหล่งข้อมูลสำหรับไมโครคอนโทรลเลอร์

ในการพิจารณาความถี่ที่คุณต้องอ่าน RTC คุณต้องทราบว่าข้อผิดพลาดสูงสุดของนาฬิกาหลักของคุณคืออะไร ตัวอย่างเช่นหากคริสตัลหลักเป็น spec'ed ที่ 20 ppm นั่นก็เท่ากับ 0.002% ดังนั้นนาฬิกาที่ใช้แหล่งสัญญาณนาฬิกาหลักอาจลอยได้ 0.00002 * 3600 * 24 = 1.728 วินาทีต่อวัน

ดังนั้นหากคุณอ่าน RTC เพียงวันละสองครั้งและในระหว่างที่เพิ่มเวลาครั้งที่สองโดยใช้ตัวขัดจังหวะตัวจับเวลาคุณจะไม่ถูกปิดมากกว่าวินาทีที่สอง - จะไม่ถูกปิดมากกว่าวินาทีที่เปรียบเทียบกับ RTC นั่นคือ

ถ้าอย่างที่ฉันคิดไว้ก่อนหน้านี้ RTC ของคุณอาจเป็นชิปแยกต่างหากที่มีคริสตัลของตัวเองหรือโมดูลที่รวมเข้ากับไมโครคอนโทรลเลอร์ของคุณนั่นไม่ได้หมายความว่ามันถูกต้อง RTC สามารถมีข้อผิดพลาดได้เช่นกัน ตัวอย่างเช่นหากใช้คริสตัลขนาด 32 kHz ที่มีค่าความคลาดเคลื่อน 5 ppm (ซึ่งมีราคาแพงกว่า 10 ppm เล็กน้อย) ก็สามารถปิดได้ที่ 0.43 วินาทีต่อวันหรือ 13 วินาทีต่อเดือน

ในการหลีกเลี่ยงปัญหานี้คุณจะต้องปรับ RTC ที่คุณเขียนปัจจัยการแก้ไขกลับไปที่การลงทะเบียน การทำเช่นนั้นจะช่วยให้คุณได้รับข้อผิดพลาดในทางปฏิบัติเป็นศูนย์ แต่แน่นอนคุณจะต้องมีแหล่งสัญญาณนาฬิกาภายนอกลำดับที่สามเพื่อใช้เป็นข้อมูลอ้างอิงเมื่อทำการปรับจูน การอ้างอิงที่แม่นยำที่สุดในสหรัฐอเมริกาคือสาย 60 Hz AC ซึ่งรับประกันว่าจะเป็น60 * 60 * 60 * 24 (5,184,000) รอบในระยะเวลา 24 ชั่วโมงระหว่างมิดไนต์ต่อเนื่อง เพื่อให้มีประโยชน์คุณจะต้องใช้เวลาตลอด 24 ชั่วโมงเนื่องจาก 60 เฮิร์ตซ์สามารถเลื่อนไปมาระหว่างเที่ยงคืนได้

การอ้างอิงเวลาที่ยอดเยี่ยมอื่นจะใช้ GPS (ความแม่นยำ 10 ns) หากมีฮาร์ดแวร์ GPS อยู่ในโครงการแล้ว

หากเวลา RTC ของคุณมาจากแหล่งภายนอกเช่นเวลาเครือข่ายเซลลูลาร์ (AT + CCLK? call) หรือเซิร์ฟเวอร์เวลาเครือข่ายที่ใช้ NTP คุณสามารถใช้ค่า RTC ได้เนื่องจากไม่มีสิ่งใดที่จะ "ปรับ" .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.