Saya memiliki papan Arduino ATMega328 khusus yang umumnya berjalan pada 5V @ 8MHz (menggunakan profil dan bootloader Arduino Pro 3.3V 8MHz). Alasan utama saya menggunakan pengaturan ini adalah agar saya dapat mematikan papan ketika daya utama terputus dan mulai kehabisan daya baterai (3V dari sel koin). Sumber 5V dan 3V dioda OR'ed bersama-sama dan input 5V diikat ke INT0. Dalam kode, ketika mendeteksi bahwa INT0 telah jatuh rendah, itu menginisialisasi mode tidur dan semuanya mati dengan pengecualian pengawas waktu yang menjaga siklus 1Hz untuk menjaga jumlah internal dan memeriksa chip harus dibangunkan kembali. Ini bekerja dengan baik ketika daya 5V diterapkan pertama kali, kemudian baterai dimasukkan, lalu5V terputus. Ini pergi tidur dan ketika 5V dibawa kembali itu bangun dan aku bisa melihatnya belum hilang hitungan.
Namun, masalahnya muncul ketika 3V diterapkan terlebih dahulu . Sejujurnya saya tidak yakin apakah ini booting. Tapi apa yang seharusnya dilakukan adalah boot, periksa apakah INT0 (Digital 2) rendah dan, jika demikian, langsung tidur. Dengan menonton undian saat ini saya melihat bahwa daya hingga beberapa mA selama beberapa detik, kemudian turun menjadi sekitar 0,3mA (masih lebih tinggi dari yang seharusnya dalam mode tidur). Tetapi ketika saya mendaftar ulang 5V, tidak ada . Pengambilan daya kembali tetapi tidak responsif (melalui serial FTDI).
Apakah mungkin ada sesuatu yang saya lewatkan sehingga tidak dapat di-boot pada 3V ... secara teori seharusnya berjalan dengan baik.
Pembaruan: Saya menjatuhkan LED ke D13 dan mencoba sketsa kedip. Bekerja dengan baik ketika mulai dari 3V atau 5V. Namun, ketika saya menjalankan firmware saya dan memulainya dari 3V, LED hanya mulai berkedip liar. Saya tidak tahu apa yang menyebabkannya karena saya bahkan tidak pernah mengatur D13 sebagai sesuatu dalam kode saya. Tapi itu membuat saya merasa itu ada hubungannya dengan bootloader ...
Jawaban:
Jadi ... ternyata yang terjadi semuanya dalam kode. Ternyata saya menginisialisasi interupsi pada INT0, ketika itu rendah, di awal kode saya. Masalahnya adalah bahwa ketika mulai pada daya cadangan 3V, INT0 selalu rendah karena INT0 terikat ke garis 5V (itu bagaimana ia tahu untuk tidur). Karena INT0 rendah dan interupsi itu memicu pada rendah itu menyebabkan interupsi konstan terjadi, tidak pernah memberikan sisa program waktu untuk dijalankan. Beralih ke mengaktifkan interupsi itu hanya setelah saya memasuki mode bangun penuh dan berfungsi dengan baik sekarang.
sumber
Apa yang sebenarnya terjadi dan mengapa tidak dapat ditentukan berdasarkan jumlah info yang diberikan. Namun, saya melihat setidaknya satu masalah potensial yang setidaknya akan menjelaskan sebagian gejala yang dijelaskan.
Anda mengatakan bahwa Anda menggunakan dioda untuk memilih suplai tegangan, dan satu suplai adalah baterai 3V. Jika Anda menggunakan dioda standar yang drop ~ 0.6V maka tegangan suplai ke MCU hanya ~ 2.4V. Jika Anda menggunakan dioda Schottky dengan penurunan tegangan antara 0,15-0,45, tegangan suplai berpotensi serendah 2,5V. Anda memiliki voltase BOD yang diatur ke 2,7 volt, jadi secara teori MCU tidak akan pernah bisa boot dengan baterai.
Adapun mengapa Anda bisa memulainya pada 5v, turun ke 3v, dan bawa kembali - saya tidak yakin. Anda bisa menonaktifkan BOD dalam kode ... mungkin ... Tidak yakin mengapa itu bekerja, tetapi kemungkinan tidak dijamin untuk bekerja.
Saya mengatur rangkaian saklar dioda dengan 5v dan 3.3v untuk melihat seperti apa bentuknya pada osiloskop saya ketika voltase berganti. Ketika pada 3.3V beralih ke 5v, tegangan berosilasi pada awalnya. Ini berpotensi menyebabkan beberapa masalah ketika MCU mencoba untuk keluar dari tidur. Menempatkan batas antara VCC dan GND merapikan sinyal dengan sangat baik. Ketika beralih dari 5v ke 3.3v, benar-benar tidak ada osilasi, hanya setetes bersih.
Dari informasi ini, tampaknya Anda harus menurunkan ambang BOD atau mematikan BOD, dan meletakkan tutup decoupling antara VCC dan GND. Anda mungkin juga harus memastikan Anda memiliki resistor pull-down pada INT0, dan membaca bagian lembar data MCU menjelaskan berbagai mode tidur semua pertimbangan untuk tidur dan bangun - itu cukup terlibat. Bersulang
sumber
Saya pikir masalahnya adalah dengan bootloader Anda, tetapi tidak dengan cara Anda berpikir.
Ketika Arduino mulai, bootloader yang mengambil untung dari beberapa tugas, seperti mencari host serial atau memuat data program dari flash akan membutuhkan lebih banyak energi daripada Arduino yang sedang tidur.
Saya pikir alasan mengapa Arduino Anda tidak akan mulai adalah karena bootloader membutuhkan sumber jam yang akurat, tetapi menerapkan 3v untuk itu akan mengacaukan jam itu dan mungkin akan crash atau menunggu 3.3V diterapkan untuk sumber yang stabil.
Melihat lembar data:
Kita melihat bahwa undian saat ini saat bangun (menjalankan bootloader) mungkin sekitar 2mA, sedangkan arus tidur sekitar 0,8 mikrogram . Ini tentu saja dapat menyebabkan pemadaman saat startup tanpa arus yang sesuai.
Mungkin Anda hanya perlu menyalakannya dengan daya 5v, atau mungkin Anda membutuhkan baterai yang lebih tinggi dan arus yang lebih tinggi.
sumber
Coba boot ulang arduino Anda dengan masuk ke Tools> Burn Bootloader
sumber