Universal Watchdog di ATtiny13


Pengawas waktu eksternal adalah penopang bagi pengembang miskin yang tidak dapat mengembangkan program yang berfungsi dengan baik untuk mikrokontroler atau sirkuit yang bekerja dengan stabil.

Selain itu, WDT bawaan tersedia di sebagian besar mikrokontroler modern.

Tetapi ada kalanya Anda harus berurusan dengan papan atau modul jadi dengan masalah tertentu. Saya membuat WDT pertama saya untuk menangani gantungan ESP8266 yang langka, tetapi masih terkadang terjadi. Selain itu, soft reset tidak disimpan dan ESP-cabinet tidak ingin terhubung kembali ke WiFi. Mendistorsi daya dengan WDT eksternal menyelesaikan masalah.

Masalah kedua muncul dengan kontroler GSM Elecrow ATMEGA 32u4 A9G . Di sini, sangat jarang terjadi pembekuan kartu SIM. (Omong-omong, masalah yang sama terjadi dengan modem USB 3G dan 4G). Untuk mengatasi pembekuan ini, Anda perlu mengubah daya pada SIM-ke. Dan tampaknya bahkan modem GSM memiliki kesimpulan untuk ini, tetapi fitur ini tidak termasuk dalam rangkaian perangkat. Dan untuk mencapai keandalan maksimum, saya sekali lagi harus beralih ke anjing penjaga eksternal.

Saya tidak mengulangi sirkuit pada timer 555. Terlalu banyak kekurangan yang dia ungkapkan:

  • Dimensi besar dan cukup tegap
  • Pengaturan ketidaknyamanan waktu respons dengan resistor tuning
  • Waktu reset yang cukup lama (pelepasan kapasitor diperlukan)
  • Nah, potensi hang dari MK dengan level rendah pada output dari timer, ketika timer hanya berhenti bekerja.
  • Dan saya tidak menemukan proyek OpenSource di Internet yang sepenuhnya memenuhi persyaratan saya.

Persyaratan untuk WDT Baru


  • Biaya perangkat yang rendah, kemudahan pembuatan dan dimensi kecil
  • Kontrol perubahan level logika berkala 0/1 pada input
  • Penyesuaian sederhana dari waktu respons (sebagai opsi, pilihan interval yang telah ditentukan)

Pengembangan besi


Mikrokontroler ATtiny13 dipilih sebagai sirkuit mikro utama. Kemampuannya lebih dari cukup untuk tugas saya. Dan harganya, dengan mempertimbangkan pengurangan elemen pengikat, hampir sama dengan 555 mikrosirkuit.



Lima kesimpulan MK (RESET memutuskan untuk tidak menyentuh) didistribusikan sebagai berikut:

  1. Output pengatur waktu
  2. Setel ulang input
  3. Tiga kesimpulan yang tersisa adalah waktu respons.

Untuk mengalihkan daya, MOSFET saluran-P digunakan. Kasing apa pun yang cocok cocok, tetapi disarankan untuk membawanya dengan apa yang disebut "level kontrol logis" - artinya, sepenuhnya terbuka dari tegangan rendah 3-5V: IRLML2502, AO3415, dll. Meskipun ukurannya kecil, transistor ini mampu mengendalikan beban 4A. Jika Anda perlu beralih sesuatu yang lain, Anda dapat langsung menghubungkan relay 5V ke output ini.

LED menyala ketika timer diaktifkan dan unit utama dimatikan.

Konektor utama untuk menghubungkan ke papan mikrokontroler memiliki empat output

  1. Bis umum
  2. Input - reset timer
  3. + 5V output (dikontrol oleh timer)
  4. Input + 5V

Dua konektor - programmer ICSP dan power jumper tidak dapat dipasang di papan. Flash mikrokontroler di programmer terlebih dahulu, dan atur waktu respons dengan jumper konstan.

Daftar Bagian



Pembuatan


Papan ternyata berukuran kecil - 18 × 22 mm. Saya menyebarkan dua opsi:

Untuk pembuatan satu sisi oleh LUT:





Dan untuk pemesanan di pabrik dengan desain dan transisi yang ditingkatkan antara para pihak. (Saya akan memesan dari Cina, kadang-kadang)





Teknologi rumah memberikan prototipe seperti ini.







Firmware


Untuk firmware saya menggunakan pemrogram buatan sendiri berdasarkan Arduino Nano



Saya diprogram dalam IDE Arduino dengan dukungan yang diinstal untuk Attiny13 - MicroCore . Versi terbaru dari IDE memiliki masalah dengan programmer ArduinoISP, tetapi bekerja dengan baik di versi Arduino IDE 1.6.13. Tim ramah arduino.cc tidak memiliki keinginan untuk mencari tahu apa yang kacau di sana))))



Tinku disetel untuk bekerja dari resonator internal dengan frekuensi 1,2 MHz. Program ini sederhana - kami mengkonfigurasi input / output, membaca PB2 -PB4 dan menentukan waktu respons, mengatur timer dan beralih ke mode IDLE. Menurut penghentian waktu, kami menentukan status input kontrol. Jika keadaan telah berubah ke yang sebaliknya, reset penghitung. Jika penghitung membaca melebihi waktu respons yang ditetapkan, kami mendistorsi daya output.

#define F_CPU 1200000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> boolean pb1_state; volatile uint16_t pb1_count; //     TIMER0 ISR(TIM0_OVF_vect){ pb1_count++; } int main(){ //   PB0 DDRB |= (1 << PB0); // pinMode(PB0, OUTPUT); PORTB &= ~(1 << PB0); // digitalWrite(PB0, LOW);} //   PB1   DDRB &= ~(1 << PB1); // pinMode(PB1, INPUT_PULLUP); PORTB |= (1 << PB1); //   PB2   DDRB &= ~(1 << PB2); // pinMode(PB2, INPUT_PULLUP); PORTB |= (1 << PB2); //   PB3   DDRB &= ~(1 << PB3); // pinMode(PB3, INPUT_PULLUP); PORTB |= (1 << PB3); //   PB4   DDRB &= ~(1 << PB4); // pinMode(PB4, INPUT_PULLUP); PORTB |= (1 << PB4); //       PB2,PB3,PB4 (   ) (,  = TM/4 ) uint16_t TM = 0; bool pb2 = false; bool pb3 = false; bool pb4 = false; if( PINB & (1 << PINB2) )pb2 = true; if( PINB & (1 << PINB3) )pb3 = true; if( PINB & (1 << PINB4) )pb4 = true; if( pb2 == true && pb3 == true && pb4 == true )TM = 4; // 1  else if( pb2 == false && pb3 == true && pb4 == true )TM = 8; // 2  else if( pb2 == true && pb3 == false && pb4 == true )TM = 20; // 5  else if( pb2 == false && pb3 == false && pb4 == true )TM = 40; // 10  else if( pb2 == true && pb3 == true && pb4 == false )TM = 80; // 20  else if( pb2 == false && pb3 == true && pb4 == false )TM = 120; // 30  else if( pb2 == true && pb3 == false && pb4 == false )TM = 240; // 60  else if( pb2 == false && pb3 == false && pb4 == false )TM = 480; // 120  pb1_count = 0; pb1_state = false; //  ADC PRR = (1<<PRADC); // shut down ADC //   TIMSK0 = (1<<TOIE0); //   TIMER0 TCCR0B = (1<<CS02) | (1<<CS00); //    1/1024 //    MCUCR &= ~(1<<SM1); // idle mode MCUCR &= ~(1<<SM0); // idle mode MCUCR |= (1<<SE); sei(); while(1) { //      asm("sleep"); //   TIMSK0 &= ~ (1<<TOIE0); //  TIMER0 //   PB1 bool pb1 = false; if( PINB & (1 << PINB1) )pb1 = true; //    ,   if( pb1 != pb1_state )pb1_count = 0; pb1_state = pb1; //      if( pb1_count >= TM ){ PORTB |= (1 << PB0); // digitalWrite(PB0, HIGH);} _delay_ms(1000); //   PORTB &= ~(1 << PB0); // digitalWrite(PB0, LOW);} pb1_count = 0; //   } TIMSK0 = (1<<TOIE0); //   TIMER0 sei(); } return 0; } 

Semua kode cocok dalam 340 byte - tepat sepertiga dari satu kilobyte memori tinky. Pengoperasian timer diperiksa hanya - tergantung pada waktu pemasangan - LED menyala secara berkala selama 1 detik. Pada saat ini, tegangan output Vout 5V menghilang. Jika kontak "input" ditutup ke ground dengan frekuensi 1 detik, reset tidak dilakukan dan LED tidak menyala.

Manajemen WDT dalam program utama adalah sebagai berikut

 #define PIN_WDT 5 //GPIO ,   WDT bool WDT_flag = false; //    void WDT_begin(){ pinMode(PIN_WDT,OUTPUT); digitalWrite(PIN_WDT,WDT_FLAG); } //   (   1    WDT,  ) void WDT_reset(){ if( WDT_flag)WDT_flag = false; else WDT_flag = true; digitalWrite(PIN_WDT,WDT_FLAG); } 

Itu saja. Semua file sumber, sirkuit, dan papan sirkuit dapat diunduh dari
Github

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


All Articles