Saya mencoba membungkus kepala saya di sekitar pengawas waktu pada seri ATTinyX5. Jadi hal-hal yang saya baca membuatnya tampak seperti Anda dapat menggunakannya untuk membuat program melakukan sesuatu yang spesifik selama N detik tetapi tidak pernah benar-benar menunjukkan caranya. Yang lain membuatnya tampak seperti itu hanya akan mereset chip kecuali jika sesuatu dalam kode reset itu dihitung sementara (yang tampaknya merupakan penggunaan "normal").
Apakah ada cara menggunakan WDT seperti yang Anda lakukan TIMER1_COMPA_vect atau serupa. Saya perhatikan bahwa ia memiliki mode batas waktu 1 detik dan saya akan sangat senang dapat menggunakannya untuk membuat sesuatu terjadi setiap 1 detik dalam kode saya (dan lebih baik tidur di antaranya).
Pikiran?
* Pembaruan: * Karena ditanya, yang saya maksud adalah bagian 8.4 dari Lembar Data ATTinyX5 . Bukan berarti saya sepenuhnya memahaminya, yang merupakan masalah saya ...
Jawaban:
Anda pasti bisa. Menurut datasheet, pengawas waktu dapat diatur untuk mengatur ulang MCU atau menyebabkan interupsi ketika dipicu. Tampaknya Anda lebih tertarik pada kemungkinan interupsi.
WDT sebenarnya lebih mudah diatur daripada Timer biasa karena alasan yang sama kurang bermanfaat: lebih sedikit opsi. Ini berjalan pada clock 128kHz yang dikalibrasi secara internal, yang artinya waktunya tidak dipengaruhi oleh kecepatan clock utama MCU. Itu juga dapat terus berjalan selama mode tidur terdalam untuk menyediakan sumber bangun.
Saya akan membahas beberapa contoh lembar data serta beberapa kode yang saya gunakan (dalam C).
Termasuk File dan Definisi
Untuk memulai, Anda mungkin ingin menyertakan dua file header berikut ini agar semuanya berfungsi:
Juga, saya menggunakan Makro <_BV (BIT)> yang didefinisikan dalam salah satu header AVR standar sebagai berikut (yang mungkin lebih familier bagi Anda):
Awal Kode
Ketika MCU pertama kali dimulai, Anda biasanya akan menginisialisasi I / O, mengatur timer, dll. Di suatu tempat di sini adalah waktu yang tepat untuk memastikan WDT tidak menyebabkan reset karena bisa melakukannya lagi, menjaga program Anda tetap di loop tidak stabil.
Pengaturan WDT
Kemudian, setelah Anda mengatur sisa chip, ulangi WDT. Menyiapkan WDT membutuhkan "urutan waktu", tetapi sangat mudah dilakukan ...
Tentu saja, interupsi Anda harus dinonaktifkan selama kode ini. Pastikan untuk mengaktifkannya kembali setelahnya!
WDT Interrupt Service Routine Hal berikutnya yang perlu dikhawatirkan adalah menangani WDT ISR. Ini dilakukan sebagai berikut:
Tidur MCU
Daripada menempatkan MCU untuk tidur di dalam WDT ISR, saya sarankan hanya mengaktifkan mode tidur di akhir ISR, kemudian minta program MAIN membuat MCU tertidur. Dengan begitu, program ini benar-benar meninggalkan ISR sebelum tidur, dan akan bangun dan langsung kembali ke WDT ISR.
sumber
Menurut datasheet itu mungkin. Anda bahkan dapat mengaktifkan keduanya, interupsi dan reset. Jika keduanya diaktifkan, batas waktu Watchdog pertama akan memicu interupsi yang menyebabkan bit Interrupt Enable menjadi tidak disetel (interrupt nonaktif). Batas waktu berikutnya akan mengatur ulang CPU Anda. Jika Anda mengaktifkan Interupsi secara langsung setelah dieksekusi, batas waktu berikutnya hanya akan (lagi) memicu interupsi.
Anda juga bisa mengaktifkan interupsi dan tidak mengaktifkan reset sama sekali. Anda harus mengatur bit WDIE setiap kali interupsi terpicu.
sumber
Ini jauh lebih mudah daripada yang disarankan di atas dan di tempat lain.
Selama
WDTON
sekring tidak diprogram (tidak diprogram secara default), maka Anda hanya perlu ...Berikut adalah contoh kode yang akan menjalankan ISR sekali per 16ms ...
Benar-benar itu. Karena kami tidak pernah mengaktifkan reset pengawas, kami tidak perlu dipusingkan dengan urutan waktunya untuk menonaktifkannya. Bendera interrupt pengawas secara otomatis akan dihapus ketika ISR dipanggil.
Jika Anda menginginkan periode yang berbeda dari setiap 1 detik, Anda dapat menggunakan nilai-nilai ini di sini untuk mengatur bit yang sesuai di
WDTCR
...Perhatikan bahwa Anda perlu menjalankan urutan waktu untuk mengubah batas waktu. Berikut adalah kode yang menetapkan batas waktu menjadi 1 detik ...
sumber