Isi kandungan:

Pengaturcaraan Serentak Attiny85 atau Labu Dengan Mata Berwarna: 7 Langkah
Pengaturcaraan Serentak Attiny85 atau Labu Dengan Mata Berwarna: 7 Langkah

Video: Pengaturcaraan Serentak Attiny85 atau Labu Dengan Mata Berwarna: 7 Langkah

Video: Pengaturcaraan Serentak Attiny85 atau Labu Dengan Mata Berwarna: 7 Langkah
Video: Using Digispark Attiny85 Mini Arduino boards: Lesson 108 2024, November
Anonim

Oleh jumbleviewJumbleview.infoMengikuti Lagi oleh pengarang:

Jeritan itu
Jeritan itu
Jeritan itu
Jeritan itu
Penggantian Bateri NiCd Dengan Bekalan Kuasa Luaran
Penggantian Bateri NiCd Dengan Bekalan Kuasa Luaran
Penggantian Bateri NiCd Dengan Bekalan Kuasa Luaran
Penggantian Bateri NiCd Dengan Bekalan Kuasa Luaran
Pemegang Kamera Digital
Pemegang Kamera Digital
Pemegang Kamera Digital
Pemegang Kamera Digital

Tentang: Saya bekerja sebagai jurutera perisian di salah satu syarikat Bay Area (California). Setiap kali saya mempunyai masa, saya ingin memprogram pengawal mikro, membina mainan mekanikal, dan membuat beberapa projek pembaikan rumah. Lebih Lanjut Mengenai jumbleview »

Projek ini menunjukkan cara mengendalikan dua LED anoda biasa 10mm tiga warna (mata berwarna-warni Pumpkin Halloween Glitter) dengan cip Attiny85. Matlamat projek ini adalah untuk memperkenalkan pembaca ke dalam seni pengaturcaraan serentak dan penggunaan perpustakaan prototreads Adam Dunkels. Projek ini mengandaikan bahawa pembaca mengetahui mengenai pengawal 8-bit AVR, dapat menulis beberapa program C dan mempunyai pengalaman dengan studio Atmel.

Kod projek diterbitkan di GitHub:

Bekalan

Sebelum memprogram seseorang masih perlu membina litar. Berikut adalah komponen:

  • Pengawal Attiny85 (mana-mana pembekal elektronik).
  • Dua LED 10mm warna tiga dengan anod biasa. LED Adafruit
  • Perintang 100 Ohm, 120 Ohm, 150 Ohm 0.125 atau 0.250 Wt (mana-mana pembekal elektronik).
  • Header Six Pin untuk antara muka AVR ISP. Boleh dibuat dari tajuk Adafruit ini
  • Beberapa papan roti atau papan templat bercetak. Saya menggunakan yang ini
  • Antaramuka AVR ISP MKII dan Atmel Studio 6.1 (Versi kemudiannya juga berfungsi).

Langkah 1: Circut

Lingkaran
Lingkaran

Reka bentuk menggunakan lima pin cip:

  • Dua pin digunakan untuk mengawal anod: masing-masing anod LED dilekatkan pada pin khusus.
  • Tiga pin dilampirkan (melalui perintang) ke katod LED (katod warna yang sama dari setiap led yang dipasang pada pin yang sama)

Seseorang akan bertanya: mengapa tidak menggunakan semua enam pin masuk / keluar cip sehingga anod LED akan dihubungkan terus ke +5 v dan setiap katod akan mempunyai pin khusus? Itu akan menjadikan pengaturcaraan menjadi mudah. Malangnya, ada masalah: pin PB5 (RESET) adalah pin lemah yang mampu memberikan hanya ~ 2 mA arus, sementara perlu ada ~ 20 mA.

Sudah tentu seseorang boleh membina penguat transistor untuk pin lemah ini, tetapi saya sendiri seboleh-bolehnya lebih suka menyelesaikan masalah melalui kodnya.

Langkah 2: Rajah Masa

Rajah Masa
Rajah Masa

Gambarajah masa membantu kita memahami apa yang perlu kita atur.

Dua baris teratas pada rajah menunjukkan perubahan voltan pada anod LED. Voltan pada pin yang disambungkan ke anod LED berayun dengan frekuensi ~ 250 Hz. Pengayunan voltan untuk LED kiri ini bertentangan dengan ayunan LED kanan. Apabila voltan pada anod tinggi, LED sepadan boleh menjadi terang. Apabila rendah, LED sepadan gelap. Ini bermaksud setiap LED mungkin terang selama selang 2 milisaat dan gelap selama 2 milisaat. Oleh kerana mata manusia mempunyai sedikit inersia, 250 Hz berkedip tidak dapat dilihat oleh pemerhati. Di bawah tiga baris pada rajah menunjukkan perubahan voltan pada pin yang disambungkan ke katod LED. Mari kita lihat pada lajur rajah pertama. Ini menunjukkan kes apabila LED kiri berwarna merah dan LED kanan berwarna hijau. Di sini katod MERAH tetap rendah sementara anod kiri tinggi, katod HIJAU tetap rendah sementara anod kanan tinggi, dan katod BIRU tetap rendah sepanjang masa. Lajur lain pada rajah menunjukkan kombinasi katod dan voltan anod untuk pelbagai warna.

Seperti yang kita lihat terdapat saling bergantung pada keadaan pin. Tanpa beberapa kerangka tidak akan mudah diselesaikan. Dan di situlah perpustakaan protothread sangat berguna.

Langkah 3: Pengaturcaraan. Makro dan Definisi

Pengaturcaraan. Makro dan Definisi
Pengaturcaraan. Makro dan Definisi

Contoh dalam langkah pengaturcaraan mewakili versi yang sedikit dipermudahkan. Program dipendekkan, dan beberapa definisi simbolik digantikan dengan pemalar eksplisit.

Mari kita mulakan dari awal. Program merangkumi fail yang dilengkapi dengan Atmel Studio dan juga tajuk utama perpustakaan. Seterusnya terdapat dua makro untuk memanipulasi tahap pin dan beberapa definisi untuk memberikan nama logik untuk menyematkan isyarat. Setakat ini tidak ada yang istimewa.

Langkah 4: Pengaturcaraan. Gelung Utama

Pengaturcaraan. Gelung Utama
Pengaturcaraan. Gelung Utama

Kemudian mari kita lihat pada akhir untuk melihat prosedur utama apa yang terkandung di dalamnya.

Fungsi utama setelah melakukan beberapa inisialasi tetap dalam selamanya. Dalam gelung itu membuat langkah seterusnya:

  • Memohon rutin prototread untuk LED sebelah kiri. Ia mengubah voltan beberapa pin.
  • Buat kelewatan dua milisaat. Tidak ada perubahan voltan pin.
  • Memohon prototread untuk LED yang betul. Ia mengubah beberapa voltan pin.
  • Buat kelewatan 2 MS. Tidak ada perubahan voltan pin.

Langkah 5: Pengaturcaraan. Fungsi Bantu

Pengaturcaraan. Fungsi Bantu
Pengaturcaraan. Fungsi Bantu

Sebelum kita mula membincangkan prototreads, kita perlu melihat beberapa fungsi pembantu. Pertama terdapat fungsi untuk menetapkan warna tertentu. Mereka berterus terang. Terdapat banyak fungsi seperti jumlah warna yang disokong (tujuh) dan satu lagi fungsi untuk mengatur LED gelap (NoColor).

Dan ada satu fungsi lagi yang secara langsung akan dipanggil oleh rutin prototread. Namanya adalah DoAndCountdown ().

Secara teknikal penggunaan fungsi seperti itu tidak wajib tetapi saya rasa senang. Ia mempunyai tiga hujah:

  • Pointer berfungsi menetapkan warna LED (seperti RedColor atau GreenColor atau lain-lain)
  • Nilai awal pembilang terbalik: berapa kali fungsi ini mesti digunakan pada tahap prototread tertentu.
  • Penunjuk untuk membalikkan pembilang. Diasumsikan bahawa apabila terdapat perubahan warna yang membalikkan kaunter adalah 0, maka pada mulanya kod lelaran akan memberikan nilai awal kaunter tersebut. Selepas setiap kaunter lelaran dikurangkan.

Fungsi DoAndCountdown () mengembalikan nilai pembilang terbalik.

Langkah 6: Pengaturcaraan. Rutin Protothread

Pengaturcaraan. Rutin Protothread
Pengaturcaraan. Rutin Protothread

Dan inilah inti rangka: rutin prototread. Demi kesederhanaan, contohnya hanya terhad kepada tiga langkah: untuk perubahan warna menjadi MERAH, HIJAU, dan BIRU.

Fungsi dipanggil dengan dua argumen:

  • Pointer ke struktur prototread. Struktur itu dimulakan oleh utama sebelum gelung utama dimulakan.
  • Penunjuk untuk membalikkan pembilang. Ia ditetapkan ke 0 oleh utama sebelum gelung utama dimulakan.

Fungsi menetapkan voltan untuk menjadikan LED kiri aktif dan kemudian memulakan segmen prototread. Segmen ini berada di antara makro PT_BEGIN dan PT_END. Di dalamnya terdapat beberapa kod yang dalam kes kami hanya mengulangi makro PT_WAIT_UNTIL. Makro ini dilakukan seterusnya:

  • Permintaan fungsi DoAndCountdown. Itu menetapkan voltan pada katod LED untuk mengeluarkan warna tertentu.
  • Hasil dikembalikan berbanding dengan 0. Sekiranya keadaan 'prototread' fungsi palsu segera kembali dan memberikan kawalan ke gelung utama.
  • Apabila protothread dipanggil pada kali berikutnya ia kembali menjalankan kod sebelum PT_BEGIN, kemudian melompat langsung ke dalam makro PT_WAIT_UNTIL dari mana ia kembali terakhir kali.
  • Tindakan seperti itu berulang sehingga hasil DoAndCountdown adalah 0. Sekiranya tidak ada pengembalian, program tetap dalam prototread dan melaksanakan baris seterusnya kod. Dalam kes kami, ini adalah PT_WAIT_UNTIL seterusnya tetapi secara amnya ia boleh menjadi hampir semua kod C.
  • Pada pelaksanaan awal pembalikan terbalik PT_WAIT_UNTIL kedua adalah 0, jadi prosedur DoAndCountdown () menetapkannya ke nilai awal. Makro kedua sekali lagi akan dilaksanakan 250 kali sehingga pembalikan terbalik mencapai 0.
  • Keadaan struktur pt ditetapkan semula sebaik sahaja kawalan mencapai makro PT_END. Apabila fungsi protothread dipanggil lain kali segmen protothread mula melaksanakan garis kod tepat selepas PT_BEGIN.

Terdapat rutin prototread serupa untuk LED yang betul. Dalam contoh kami, ia hanya menetapkan susunan warna yang berbeza, tetapi jika kita melakukannya dengan cara yang sama sekali berbeza: tidak ada gandingan ketat antara rutin LED kiri dan kanan.

Langkah 7: Internals

Dalaman
Dalaman

Seluruh program kurang daripada 200 baris kod (dengan komen dan baris kosong) dan mengambil kurang dari 20% memori kod Attiny85. Sekiranya diperlukan adalah mungkin untuk menggunakan beberapa rutin prototread di sini dan memberikan logik yang lebih rumit kepada mereka.

Perpustakaan Protothreads adalah bentuk pengaturcaraan serentak komputer yang paling mudah. Pengaturcaraan serentak adalah pendekatan yang memungkinkan untuk membagi program menjadi bahagian yang logik: kadang-kadang mereka disebut coroutine, kadang-kadang thread, kadang-kadang tugas. Prinsipnya adalah bahawa setiap tugas tersebut dapat berkongsi daya pemproses yang sama sambil menjaga kod lebih kurang linear dan tidak bergantung pada bahagian lain. Tugas dari sudut pandangan logik dapat dilaksanakan secara serentak.

Untuk sistem lanjutan, kawalan tugas-tugas seperti itu dilakukan sama ada dengan kernel sistem operasi atau oleh runtime bahasa yang disisipkan ke dalam pelaksanaan oleh penyusun. Tetapi sekiranya pengaturcara aplikasi prototreads mengendalikannya secara manual dengan menggunakan perpustakaan makro protothreads dalam rutin tugas dan memanggil rutin seperti itu (biasanya keluar dari gelung utama).

Anda mungkin ingin tahu bagaimana protothread sebenarnya berfungsi? Di mana sihir itu tersembunyi? Protothreads bergantung pada ciri bahasa C khas: kenyataan bahawa pernyataan kes suis C mungkin disertakan dalam atau beberapa blok lain (seperti sementara atau untuk). Perincian yang mungkin anda dapati di laman Adam Dunkels

Dalaman elektronik projek ini sangat mudah. Foto di atas memberi anda petunjuk. Saya yakin anda boleh melakukan yang lebih baik.

Disyorkan: