Kisah tentang bagaimana pengontrol perfeksionisme mereset saya

gambar

Saya berpikir untuk membeli pembuat yogurt. Ya, sehingga yogurt membuat kualitas yang baik dan selalu sama. Apa yang dibutuhkan untuk ini? Pertama, bahan baku, kedua, suhu akurat dan stabil, ketiga, pengaturan waktu memasak. Saya mulai memilih dan menghadapi serangan berikut: pembuat yogurt murah tidak diregulasi. Yaitu, di dalam kabel pemanas, dan kabel ini, pada kenyataannya, terhubung ke jaringan. Berapa suhu yang akan berada di dalam pembuat yogurt pada saat yang sama tergantung pada tangan pengumpul, suhu sekitar, fase bulan dan kedalaman tidur Cthulhu (Cthulhu fhtagn, omong-omong).

Tentu saja, situasi ini tidak cocok untukku. Dan lebih lagi saya merasa terganggu dengan situasi di sekitar pembuat yogurt, yang, dengan fungsi dan parameternya, cocok untuk saya. Untuk beberapa alasan, produsen pembuat yogurt tersebut percaya bahwa mereka memasok produk luar angkasa ke pasar dan harga produk tersebut harus sesuai. Penderitaan mental yang kuat dalam proses seleksi mendorong saya ke titik di mana saya menyatakan kemarahan saya kepada istri tercinta tentang kebijakan penetapan harga yang tidak manusiawi dari pembuat yogurt dan dalam proses curahan verbal saya mengucapkan ungkapan "Saya akan melakukannya dengan lebih baik untuk lima ratus rubel," setelah itu kemudian mengklik ...

Itu adalah latar belakang. Dan sekarang ceritanya.Dalam proses membangun perangkat yang luar biasa, saya menemukan bug. Ketika suhu saat ini ditampilkan, controller secara berkala masuk ke reboot. Yaitu, kadang-kadang bekerja berjam-jam secara normal, dan kadang-kadang disetel ulang setiap beberapa detik. Karena ini mulai terjadi setelah fungsi pemungutan suara sensor ds18b20 diperkenalkan ke firmware, adalah wajar bahwa saya menoleh padanya untuk mencari bug. Dan tidak menemukan apa pun. Tumpukan tidak pecah, fungsi tidak menulis apa pun ke area memorinya. Secara umum, itu berhasil, sebagaimana mestinya. Selain itu, menonaktifkan fungsi ini menghilangkan bug, yang dengan jelas menunjukkan (seperti yang saya lihat pada saat itu) pahlawan acara tersebut. Saya pikir sistem sinkronisasi yang harus disalahkan.

Karena saya punya batu kecil (attiny2313a) dan tidak ada timer yang cukup untuk semua lotion, saya keluar dari situasi dengan menulis task manager yang menerima tugas dan waktu tunda yang diperlukan dari fungsi, menempatkan mereka dalam antrian. Kemudian, setelah menghitung jumlah waktu yang diperlukan, ia mentransfer kendali kepada mereka. Saya menetapkan waktu tunda minimum menjadi 1 milidetik. Yang memungkinkan saya untuk mengatur penundaan dari milidetik menjadi satu menit. Tetapi jika Anda melihat lembar data sensor ds18b20, Anda akan melihat bahwa komunikasi dengan sensor suhu terkadang berlangsung lebih dari 500 mikrodetik (reset dan tunggu kehadirannya).

gambar

Tetapi bagaimana jika, dalam prosesnya, gangguan mengganggu fungsi komunikasi? Akan ada slot waktu yang diimbangi, di mana pengontrol tidak akan dapat membaca bit atau mengenali keberadaannya dengan benar. Saya menemukan jalan keluar dalam menggunakan sinkronisasi. Prosesnya sederhana. Ketika fungsi polling sensor melihat bahwa ia akan memiliki komunikasi jangka panjang dengan sensor, ia mengatur interupsi dalam register B dari timer 1 pada saat yang sama dengan interupsi "manajer waktu", yang terletak di register A dari timer 1. Dan karena interupsi diproses secara ketat sesuai dengan alamat vektor interupsi dalam tabel interupsi, ternyata setelah proses sinkronisasi, fungsi polling sensor akan menerima kontrol segera setelah gangguan dari "time manager".

Nah, di mana ada bug? Ya di mana-mana. Tetapi secara pribadi, saya berpikir bahwa masalahnya bisa di persimpangan interupsi. Artinya, dalam kasus ketika satu lagi masuk selama pelaksanaan satu interupsi. Pembersihan kode untuk menyelesaikan masalah ini berlanjut hingga saya menemukan bahwa tindakan saya mengarah pada fakta bahwa masalah mulai terjadi bahkan dengan sensor yang tidak terhubung. Setelah menonaktifkan fungsi polling sensor, saya yakin bahwa sekarang kontroler reset tidak tergantung pada operasinya. Dan kemudian tebakan yang brilian mengejutkan saya. Perlu mengukur tegangan! Multimeter dengan ceria melaporkan bahwa ada 4,2 volt pada controller. “Yah, tentu saja, BOD, pikirku. Dan saya menghubungkan daya eksternal ke papan (sebelum itu saya puas dengan daya USB). Multimeter mendengus sedikit, yaitu 4,98 volt di papan tulis. Dengan perasaan kemenangan, saya membalik papan untuk melihat yang luar biasa. Ada bug!Dan itu menjadi lebih kuat. Sekarang controller diatur ulang setiap beberapa detik, dan terkadang dalam sepersekian detik. Pencarian dilanjutkan dengan balas dendam dan mengarah ke fungsi yang menampilkan informasi di layar.

Seperti yang mungkin Anda tebak, semuanya baik-baik saja dengannya, terutama karena setelah menulis dia diuji dengan benar. Dan, bagaimanapun, semua mengatakan bahwa bug saya yang sulit dipahami terletak di dalamnya. Ternyata bug hanya terjadi saat menampilkan halaman suhu saat ini. Halaman menampilkan daya, mulai, waktu bug tidak menyebabkan. Tidak menemukan apa pun yang dapat menyebabkan perilaku ini, saya memutuskan untuk membangun makanan. Yaitu, fakta bahwa di bawah tegangan normal bug terjadi lebih sering. Dengan menurunkan tegangan, saya menemukan bahwa pada 3,8 volt pada pengontrol, yang terakhir bekerja secara stabil. Situasi merobek semua pola. Dan kemudian aku ingat hukum Ohm. Arus sebanding dengan tegangan. Selalu? Tidak. Pada LED, hukum ini tidak berfungsi. Ini bekerja lebih tepat, tetapi dengan gadgetnya.

Proporsionalitas arus melalui dioda tidak sama dengan resistor konvensional, karena perangkat semikonduktor sebagian besar non-linear. Ingat setidaknya thyristor atau dioda zener (zener diode). Berikut ini adalah perbandingan karakteristik tegangan arus LED dari lembar data (garis hitam) dan karakteristik tegangan arus dari beban resistif (garis merah)

gambar

Terlihat bahwa untuk memuat resistif hukum Ohm adalah dewa dan tuan. Jika tegangan meningkat 10%, maka arus akan meningkat 10% yang sama. Tapi tidak ada yang keputusan untuk LED. Jika Anda menaikkan tegangan pada LED hanya 10% (dari 2 volt menjadi 2,2 volt), arusnya akan melonjak 100%, yaitu, dua kali! Tetapi dalam kasus saya, hal utama adalah peningkatan voltase juga meningkatkan penurunan pada saat dioda dinyalakan. Dan saya punya 32 dioda! Empat indikator tujuh segmen dengan masing-masing delapan LED di masing-masing (tujuh segmen dan satu titik). Mereka terhubung dengan saya bukan melalui multiplexing, tetapi melalui register geser karena:

1. Kesimpulan dari kontroler attiny2313 sangat kurang.
2. Saya terganggu oleh kedipan mereka ketika terhubung dengan multiplexing (perfeksionisme beberapa kali)
3. Multiplexing menghabiskan banyak sumber daya pengontrol untuk keluaran (perfeksionisme nomor dua)

.Selain itu, saya menghubungkan register geser dengan fungsi mematikan layar selama durasi pembaruan tampilan (perfeksionisme nomor tiga). Mengapa saya melepaskan fitur ini - Saya tidak tahu. Bagaimanapun, logika yang saya pilih dapat bekerja hingga frekuensi 100 MHz. Dengan demikian, data dapat didorong ke dalamnya pada frekuensi penuh controller, yang saya miliki adalah 10 MHz. Nah, siapa yang punya waktu untuk memperhatikan pergerakan bit dalam bit indikator pada frekuensi seperti itu?

Berpindah. Kekuatan sirkuit saya disediakan oleh regulator L7805, berikut adalah diagram koneksinya.

gambar

Regulator menyediakan arus 1A tanpa masalah. Pada output regulator terdapat kapasitor 0,1 mikrofarad, yang, secara teori, harus memperlancar fluktuasi arus. Muatannya pada 5 volt adalah 0,5 microcoulomb. Pada 3,8 volt, muatannya masing-masing 0,38 microcoulomb. Pada 3,8 volt, LED mengkonsumsi sekitar 288 mA, dan pada 5 volt sekitar 416 mA. Dengan demikian, ketika tegangan dinaikkan dari 3,8 volt menjadi 5 volt, muatan yang disimpan oleh kapasitor akan meningkat sebesar 24%, tetapi konsumsi saat ini akan meningkat lebih dari 30 persen. Perhitungannya tentu saja patut dicontoh, tetapi menunjukkan bahwa penurunan tegangan pada rangkaian semacam itu adalah semakin besar semakin besar tegangan suplai. Pada 3,8 volt, drawdown itu tidak kritis untuk controller. Tetapi pada 5 volt drawdown meningkat dan mulai mereset controller. Dan pengontrol diatur ulang tepat pada halaman tampilan suhu karenaapa tepatnya di halaman ini adalah semua indikator tampilan yang terlibat.

Solusinya sederhana. Dalam kode, Anda hanya perlu mengomentari garis untuk menghidupkan dan mematikan indikator sbi displayPort, offDispWire dan cbi displayPort, offDispWire.

                ldi XL, videoMem
		cbi displayPort, shiftWire
		cbi displayPort, storageWire
		;sbi displayPort, offDispWire
		ZpushToDisplay:
		ldi temp2, 8
		ld temp, X+
		ZnextbitToDisplay:
		cbi displayPort, dataWire
		sbrc temp, 7
		sbi displayPort, dataWire
		sbi displayPort, shiftWire
		cbi displayPort, shiftWire
		lsl temp
		dec temp2
		cpi temp2, 0
		brne ZnextbitToDisplay

		cpi XL, videoMem+sizeVideoMem
		brne ZpushToDisplay

		sbi displayPort, storageWire
   		cbi displayPort, storageWire
		;cbi displayPort, offDispWire

Pelepasan telah berhenti. Dan controllernya hidup bahagia selamanya.

Z.Y. proses pencarian bug yang sulit dipahami menunjuk cant lain dalam skema. Faktanya adalah bahwa disipasi daya maksimum register geser adalah sekitar 0,5 watt, dan arus melalui output daya atau ground adalah sekitar 70 miliamp. Jika angka delapan dengan titik ditampilkan, arus melalui register geser harus sekitar 104 miliamp, yang, seperti yang Anda tahu, merupakan kelebihan. Bukannya aku tidak memperhitungkan momen ini. Saya sudah memperhitungkan. Tetapi dalam proses menghitung resistor untuk LED, ia menyerah pada kelemahan satu menit dan lupa bahwa LED adalah elemen nonlinear dan untuk mengurangi arus melalui itu dua kali tidak cukup untuk menggandakan resistensi dari resistor yang membatasi arus. Secara umum, dalam situasi yang tidak dapat dipahami, lihat CVC!

Source: https://habr.com/ru/post/id386199/


All Articles