Seberapa sering saya harus meminta RTC?

11

Saya belum menggunakan RTC jadi saya tidak sepenuhnya yakin tentang cara "normal" untuk membaca jam waktu nyata. Ada beberapa pendekatan berbeda yang saya pikirkan tetapi berharap untuk beberapa saran tentang itu.

Inilah beberapa cara yang saya pikirkan tentang membaca dan menggunakan waktu sejauh ini:

  1. Dapatkan tanggal dan waktu di power up dan hemat ke RAM, dan kemudian melalui penggunaan penghentian waktu kenaikan nilai RAM setiap detik dll. Kode kemudian akan menggunakan nilai-nilai dalam RAM setiap kali perlu mengetahui tanggal / waktu.
  2. Melalui penggunaan penghentian waktu, permintaan RTC setiap detik dan salin tanggal dan waktu yang diterima ke RAM. Sekali lagi, kode kemudian akan menggunakan nilai-nilai dalam RAM setiap kali perlu mengetahui tanggal / waktu.
  3. Setiap kali saya perlu mencari tahu waktu, minta RTC dan gunakan jawabannya secara langsung.

Mana yang akan menjadi pendekatan terbaik?

pengguna9993
sumber
15
Pendekatan terbaik adalah pendekatan yang memenuhi spesifikasi Anda saat menggunakan sumber daya dalam jumlah minimum. Karena kami tidak benar-benar mengetahui kebutuhan Anda, "terbaik" memiliki arti yang sangat kecil bagi kami.
Scott Seidman
Semua jawaban yang sangat baik saya tidak bisa memilih jawaban!
user9993

Jawaban:

23

Saya akan menggunakan opsi keempat.

Kebanyakan chip RTC memiliki opsi untuk menghasilkan pulsa 1 detik. Anda harus menghubungkan pulsa itu ke input yang diaktifkan interupsi pada MCU Anda.

  • Anda mendapatkan waktu dari chip sekali pada awal program Anda, dan mungkin kadang-kadang sejak saat itu - mungkin sekali satu jam.
  • Sinyal interupsi kemudian memicu rutin interupsi di MCU Anda di mana Anda menambah waktu satu detik.

Pengaturan itu memberi Anda keakuratan pada RTC kedua tanpa overhead untuk secara aktif membaca RTC.

Majenko
sumber
5
Saat menggunakan pendekatan ini, penting untuk mengetahui tepi jam mana yang merupakan kenaikan dan juga untuk memastikan bahwa setiap bacaan yang sedang berlangsung selama tepi jam itu harus ditinggalkan.
supercat
Atau pastikan bacaan hanya dipicu oleh ISR - Anda mendapat celah satu detik untuk melakukan bacaan sebelum ISR berikutnya dipicu.
Majenko
Kapan pun memungkinkan, saya lebih suka mengatur jam waktu-nyata agar berjalan lebih cepat dari satu centang per detik dan menggunakannya untuk penentuan waktu acara umum, jika resolusi RTC dapat diatur cukup baik agar sesuai dengan kebutuhan waktu-acara; sehingga tidak selalu ada gangguan yang terjadi pada setiap centang RTC. Lebih jauh, ketika mengatur alarm, seringkali penting untuk mengetahui secara tepat waktu RTC saat alarm sedang diatur, dan polling RTC untuk melihat apakah alarm bergerak ketika alarm sedang diatur. Saya tidak tahu mengapa vendor chip 32-bit tidak hanya menawarkan counter 47-bit dengan kemampuan membaca ...
supercat
... 32 bit atas atau 31 lebih rendah ditambah status input jam, memiliki alarm yang dapat dinyalakan dan dimatikan kapan saja tanpa penundaan sinkronisasi, dan register alarm yang dapat ditulis kapan saja ketika alarm off, dengan semantik bahwa alarm terjadi jika kenaikan terjadi ketika alarm diaktifkan . Jika sebuah chip dapat menerima wakeups dan perangkat lunak asynchronous melakukan pemeriksaan polling bila diperlukan, tidak ada sinkronisasi perangkat keras lain yang diperlukan, dan perangkat lunak tidak perlu mengatasi masalah yang disebabkan oleh bentuk lain dari sinkronisasi perangkat keras.
supercat
9

3 dan 2 lebih layak.

Pendekatan ketiga adalah apa yang saya gunakan dalam banyak kasus. Manfaatnya adalah saya tidak perlu khawatir tentang mirroring RTC di RAM. Kelemahan potensial adalah bahwa menginterogasi RTC melalui bus serial menyebabkan penundaan. Jika Anda menulis data satu detik sekali, penundaan ini mungkin tidak masalah.

Pendekatan ke-2 juga bagus. Mempertahankan jam cermin dapat menyebabkan kesalahan ketepatan waktu, jika perangkat beroperasi untuk waktu yang lama. Jam cermin bisa terpisah, RTC. Jika Anda membaca RTC secara teratur, maka arus tidak akan menumpuk.
Namun, saya akan menyarankan agar tidak melakukan komunikasi serial dalam interrupt service routine (ISR) itu sendiri. Atur bendera di ISR ​​dan lakukan komunikasi serial di main ().

ps Dalam semua kasus, saya menggunakan DS1307.

Nick Alexeev
sumber
6

Beberapa RTC (mis. MC68HC68T1 [yang diakui hampir tidak ada yang harus menggunakan lagi]) akan menjeda penghitungan internal mereka ketika dibaca dari sehingga memberikan respon yang konsisten. Mereka harus dibaca dari sesering mungkin untuk meminimalkan gangguan. Baca darinya sekali dan kemudian gunakan penghenti waktu untuk memperbarui nilai waktu yang tersimpan dalam RAM MCU.

Ignacio Vazquez-Abrams
sumber
Desain seperti itu membingungkan pikiran. Setelah membaca yang terjadi selama kenaikan menghasilkan data acak akan menjadi masalah yang mudah untuk diselesaikan. Setelah membaca menyebabkan jumlah terlewatkan adalah masalah yang tidak dapat diselesaikan kecuali dengan menerima jumlah yang hilang.
supercat
2
Rupanya buffering ganda adalah sesuatu yang sebagian orang tidak pikirkan ketika mereka mendesain chip mereka.
Ignacio Vazquez-Abrams
Jika kode memeriksa saat pemungutan suara untuk memastikan nilai tidak berubah, tidak perlu buffering ganda. Untuk clock real-time on-chip, pemungutan suara repeat-hingga-no-change akan berfungsi bahkan jika interupsi mencoba membaca RTC pada saat yang sama dengan kode jalur utama melakukannya. Beberapa desain buffered ganda membuat sulit untuk menulis kode jalur utama dan interupsi yang dapat hidup berdampingan dengan aman, dan saya belum pernah melihat satu yang saya anggap "membantu".
supercat
5

Saya akan berasumsi bahwa RTC adalah chip yang terpisah dengan kristal sendiri, atau modul yang terintegrasi dengan mikrokontroler Anda yang lagi-lagi memiliki sumber waktu yang terpisah (seperti kristal 32 kHz) daripada jam utama. Dan sumber waktu untuk RTC lebih akurat daripada yang untuk mikrokontroler.

Untuk menentukan seberapa sering Anda perlu membaca RTC, Anda perlu mencari tahu apa kesalahan maksimum jam utama Anda. Misalnya, jika kristal utama ditentukan pada 20 ppm, itu sama dengan 0,002%. Jadi jam hanya berdasarkan sumber jam utama bisa melayang 0,00002 * 3600 * 24 = 1,728 detik sehari.

Jadi, jika Anda membaca RTC hanya dua kali sehari, dan di antaranya menambah waktu satu detik sekali menggunakan penghenti waktu, Anda tidak akan pernah mati lebih dari satu detik - tidak pernah lebih dari satu detik dibandingkan dengan RTC.

Jika, seperti yang saya duga sebelumnya, RTC Anda adalah chip yang terpisah dengan kristal sendiri, atau modul yang terintegrasi dengan mikrokontroler Anda, itu tidak berarti itu benar. RTC juga bisa memiliki kesalahan. Misalnya, jika menggunakan kristal 32 kHz dengan toleransi 5 ppm (yang hanya sedikit lebih mahal dari yang 10 ppm), itu bisa dimatikan dengan 0,43 detik per hari - atau 13 detik per bulan.

Untuk menyiasatinya, Anda perlu menyetel RTC, tempat Anda menulis faktor koreksi kembali ke register. Melakukannya akan memungkinkan Anda untuk mendapatkan kesalahan praktis ke nol. Tetapi tentu saja Anda harus memiliki sumber jam eksternal ketiga untuk digunakan sebagai referensi saat melakukan penyetelan. Referensi sangat akurat di AS adalah 60 baris Hz AC, yang dijamin untuk menjadi persis 60 * 60 * 60 * 24 (5.184.000) siklus dalam waktu 24 jam antara midnights berturut-turut. Agar ini berguna, Anda harus meluangkan waktu selama 24 jam penuh, karena 60 Hz dapat melayang di antara tengah malam.

Referensi waktu yang sangat baik lainnya akan menggunakan GPS (akurasi 10 ns), jika seseorang sudah memiliki perangkat keras GPS dalam proyek mereka.

Jika bukan kali RTC Anda berasal dari sumber eksternal, seperti waktu jaringan seluler (AT + CCLK? Panggilan), atau server waktu jaringan menggunakan NTP, maka Anda dapat menggunakan nilai RTC sebagaimana adanya karena tidak akan ada apa-apa untuk "tune" .

tcrosley
sumber