Daftar Isi:

ATtiny84/85 SPI Antarmuka Penggunaan Kembali Pin: 6 Langkah
ATtiny84/85 SPI Antarmuka Penggunaan Kembali Pin: 6 Langkah

Video: ATtiny84/85 SPI Antarmuka Penggunaan Kembali Pin: 6 Langkah

Video: ATtiny84/85 SPI Antarmuka Penggunaan Kembali Pin: 6 Langkah
Video: Programming the new ATtiny from Arduino using UPDI [Beginner Tutorial] 2024, Juli
Anonim
ATtiny84/85 SPI Antarmuka Pin Penggunaan Kembali
ATtiny84/85 SPI Antarmuka Pin Penggunaan Kembali

Instruksi ini adalah tindak lanjut dari "ATtiny84/85 In-circuit Debugging with Serial Output" yang dapat diinstruksikan dan memperluas konfigurasi perangkat keras dan perangkat lunak tersebut untuk mengatasi masalah penggunaan kembali pin unduhan pemrograman oleh program aplikasi. Secara keseluruhan, antara ini dan bagian 1 yang dapat diinstruksikan, topik-topik berikut dibahas/ditunjukkan:

Tema ATtiny84 ATtiny85
Komunikasi Serial menggunakan kelas SoftwareSerial x x
Berbagi pin perangkat antara aplikasi dan unduh x x
Pin Ubah interupsi x
Interupsi eksternal x
Tidur dalam mode POWER_DOWN; bangun saat interupsi x
Penyelesaian untuk kesalahan tautan vektor interupsi "multiply didefinisikan" yang terkait dengan SoftwareSerial x
Modifikasi dalam sirkuit, unduh, debug, … siklus pengembangan untuk perangkat ATtiny x x

Menambahkan komponen I/O perangkat keras ke salah satu pin yang didedikasikan untuk antarmuka pemrograman SPI terkadang OK, terkadang tidak. Misalnya, menambahkan LED ke MISO hanya menyebabkan LED berkedip selama pengunduhan dan kemudian tersedia untuk aplikasi. Namun, menambahkan buzzer piezo ke MISO akan menghasilkan suara melengking yang mengerikan diikuti dengan kegagalan pengunduhan.

Instruksi ini menjelaskan cara menggunakan multiplexer 4x2:1 untuk "memulihkan" penggunaan pin yang ditetapkan ke antarmuka SPI sinyal MISO, MOSI, dan SCK dengan melindunginya selama pengunduhan. Penggunaan kembali pin RESET memerlukan perubahan sekering dan tidak tercakup oleh pendekatan ini. Penetapan ganda pin dilakukan dengan menggunakan multiplexer untuk beralih antara aplikasi dan input pemrograman tergantung pada apakah unduhan sedang berlangsung. Kode dan skema disertakan untuk ATtiny84 dan ATtiny85. Konfigurasi ATiny84 ditangani terlebih dahulu karena memiliki dua port I/O dan dapat digunakan untuk mengilustrasikan beberapa masalah/solusi tambahan. Setelah diskusi tiny84, skenario yang sama dibahas untuk ATtiny85.

Langkah 1: Perangkat Keras yang Diperlukan

Gambar
Gambar

Sebagian besar perangkat keras yang diperlukan terdaftar di bagian 1 yang dapat diinstruksikan sehingga hanya perangkat keras baru yang tercantum di bawah ini.

Nama Kemungkinan Sumber Bagaimana Digunakan
4x2:1 Multiplexer Mouser Berisi empat sakelar 2-input;1-output yang merupakan mekanisme di mana sinyal Antarmuka SPI dan I/O aplikasi digunakan bersama.
saklar SPST Jenis sakelar apa pun (sementara atau terkunci) akan berfungsi. Sakelar digunakan untuk mengilustrasikan berbagi pin untuk input aplikasi.
resistor 10K Resistor pull-down untuk sakelar SPST untuk menghindari input mengambang
Gambar
Gambar
Gambar
Gambar

Multiplexer adalah kunci untuk mengisolasi penggunaan unduhan pin dari penggunaan aplikasi. Fungsi keseluruhan multiplexer 4x2:1 cukup sederhana yang terdiri dari 2 sinyal kontrol dan 4 sakelar yang berfungsi identik. Perilaku setiap pin multiplexer dibahas di bawah ini:

Pin Nama Fungsi
15 G Seperti yang ditunjukkan dalam tabel kebenaran, multiplexer hanya berfungsi ketika pin pengaktifan G rendah. Karena kita tidak pernah ingin menonaktifkan multiplexer secara total, pin 15 akan terhubung langsung ke ground.
2-4; 5-7; 9-11;12-14 A (masukan), B (masukan), Y (keluaran) Ada empat 2-input; Sakelar 1-output dengan masing-masing kelompok 3 pin diberi nomor berurutan dalam urutan A (input), B (input), Y (output) mis. untuk sakelar 1; pin 2=1A; pin 3=1B; pin 4=1Y.
1 Pilih Ketika Select rendah, input sakelar A terhubung ke pin output sakelar terkait, Y. Ketika pilih tinggi, input sakelar B terhubung ke output sebagai gantinya. Sakelar dikendalikan secara bersamaan oleh sinyal Pilih dan berfungsi secara identik.
8 GND tanah IC multiplekser
16 VCC daya IC multiplekser

Langkah 2: Ikhtisar Kasus Uji

Gambar
Gambar
Gambar
Gambar

Dua skenario untuk penggunaan kembali pin didasarkan pada apakah pin tersebut merupakan input atau output aplikasi. Prosedur untuk menangani input apapun selalu sama; juga prosedur untuk keluaran aplikasi identik terlepas dari komponen perangkat kerasnya. Meski begitu, penjelasannya lebih mudah, dan semoga lebih jelas, jika diberikan contoh spesifik. Tata letak minimalis untuk dua kasus ditunjukkan di atas. Untuk pengaturan terperinci nanti, koneksi menjadi sedikit sarang tupai sehingga mungkin berguna untuk merujuk kembali ke diagram yang lebih bersih ini.

RESET adalah pilihan yang sempurna untuk sinyal Select multiplexer karena rendah selama pengunduhan tetapi kembali tinggi ketika pengunduhan selesai. Perhatikan bahwa salah satu sakelar multiplekser dapat digunakan untuk kedua kasus karena semua sakelar berperilaku identik. Juga, tidak satu pun dari contoh yang "realistis"; mereka dipilih sebagai cara paling mudah untuk menggambarkan teknik isolasi

  1. Kasus Keluaran: Keluaran LED dari ATtiny84 pin 4 (SCK) diisolasi menggunakan sakelar multiplekser 2

    • sambungkan pin multiplekser 2A ke ground
    • sambungkan pin multiplekser 2B ke ATtiny85 pin 4
    • hubungkan output 2Y ke anoda LED

      • Hasil yang diharapkan:

        • LED mati selama pengunduhan karena terhubung ke 2A, ground
        • LED terpasang ke pin keluaran aplikasi 4 setelah diunduh melalui 2B dan mulai berkedip
  2. Kasus Input: Input sakelar SPST ke ATtiny84 pin 6 (MOSI) diisolasi menggunakan sakelar multiplekser 3

    • Kabel utama MOSI dari header Programmer AVR dipindahkan ke 3A
    • sakelar input 3B terhubung ke output SPST
    • output 3Y terhubung ke ATtiny84 pin 6

      • 3A, MOSI, terhubung ke pin 6 selama pengunduhan
      • 3B, output SPST, terhubung ke pin 6 setelah diunduh

Kasus 1 berhasil jika LED tidak berkedip selama pengunduhan program dan kemudian berkedip setiap dua detik setelah pengunduhan seperti yang diharapkan di bawah kendali program. Tanpa isolasi, LED akan berkedip selama pengunduhan karena terhubung langsung ke sinyal SCK, yang mengubah status menjadi penerimaan/pengiriman data jam.

Kasus 2 berhasil jika sinyal MOSI diteruskan ke ATtiny84 selama pengunduhan, yaitu pengunduhan tidak gagal, dan LED merespons sakelar hidup/mati SPST setelah pengunduhan. Kasus 2 mencegah satu kegagalan pengunduhan yang tidak mungkin terjadi. Tanpa isolasi, sakelar SPST akan menyebabkan kegagalan jika 1) sakelar terkunci digunakan dan 2) sakelar dibiarkan dalam posisi hidup selama pengunduhan. Saat diisolasi oleh multiplexer, sakelar tidak dapat menyebabkan kegagalan unduhan dalam keadaan apa pun. Sedikit peregangan tapi menghibur bagi kita orang tua.

Salah satu konsekuensi penggunaan multiplexer adalah komponen perangkat keras tidak dapat lagi dihubungkan langsung ke pin I/O mikrokontroler. Ini agak merepotkan tetapi memungkinkan komponen untuk tetap berada di papan tempat memotong roti selama pengujian bersama dengan perangkat keras aplikasi lainnya, dan dapat dipindahkan kembali ke lokasi yang seharusnya saat pengujian selesai.

Langkah 3: ATtiny84 Case 1 - Isolasi Output Aplikasi

Gambar
Gambar

Langkah ini menjelaskan pengaturan untuk berbagi pin keluaran aplikasi dengan sinyal unduhan. Contoh yang digunakan adalah LED yang terpasang pada pin 4 (SCK). Menggunakan LED yang ada sebagai contoh memungkinkan penekanan pada penambahan multiplexer ke lingkungan perangkat keras dan perangkat lunak bagian 1.

  • Perangkat keras

    • Tambahkan multiplexer ke papan tempat memotong roti di lokasi relatif yang ditunjukkan pada diagram fritzing di atas. Multiplexer diposisikan ke arah tengah untuk memberikan ruang bagi sakelar SPST yang diperlukan dalam Kasus 2.
    • Perpanjang sinyal RESET ke multiplexer dengan menambahkan kabel lead (disarankan kuning) dari ATtiny84 pin 11 ke multiplexer pin 1.
    • Pengaturan perangkat keras yang tersisa seperti yang diberikan pada Langkah 2

      • sambungkan pin multiplekser 2A langsung ke ground
      • sambungkan pin 2B ke ATtiny84 pin 4
      • hubungkan output 2Y ke anoda LED

        • Hasil yang diharapkan:

          • selama pengunduhan 2Y terhubung ke ground (2A) sehingga LED tetap mati
          • Setelah mengunduh 2Y terhubung ke ATtiny84 pin 4 - aplikasi kontrol LED
  • Perangkat lunak

    • Kode bagian 1 digunakan kembali; tersedia dari bagian 1 yang dapat diinstruksikan daripada diduplikasi di sini
    • Muat dan kompilasi program bagian 1 di Arduino IDE
    • Colokkan programmer Tiny AVR ke port USB PC
    • Colokkan kabel Adafruit USB ke Serial ke port USB kedua
      • Port COM dibuat dan secara otomatis tersedia di daftar port IDE
      • Luncurkan jendela COM
    • Unduh kode yang dikompilasi ke ATtiny84

Hasil program aplikasi sama dengan bagian 1 karena satu-satunya perubahan adalah memindahkan LED ke lokasi "terlindungi": LED berkedip pada interval 2 detik; keluaran serialnya sama. Satu perbedaan yang seharusnya terjadi adalah bahwa LED tidak lagi berkedip selama pengunduhan karena selama waktu itu, LED terhubung ke ground melalui pin multiplekser 2A.

Gambar
Gambar

Langkah 4: ATtiny84 Case 2 - Isolasi Input Aplikasi

Gambar
Gambar

Langkah ini didasarkan pada pengaturan untuk kasus isolasi keluaran sebelumnya. Perubahan perangkat keras terdiri dari memasang sakelar SPST ke ATtiny84 pin 6 (MOSI) melalui multiplexer. Jadi perubahan perangkat keras minimal tetapi ada beberapa perubahan perangkat lunak untuk memungkinkan sakelar SPST mengontrol LED menggunakan interupsi perubahan pin. Kode yang diperbarui disertakan di bagian bawah bagian ini. Kode harus disalin ke Arduino IDE; sarankan menyimpannya dengan nama Multiplexer_Input. (Saya minta maaf atas panjangnya bagian ini, tetapi ini adalah inti dari tujuan instruksi dan berpikir itu lebih baik dibaca sebagai monolit daripada memasukkan jeda buatan.)

Memperbarui Lokasi Tujuan
termasuk kelas SoftwareSerial yang "diretas" termasuk bagian LED sekarang dikendalikan oleh sakelar SPST melalui interupsi perubahan pin. Kelas SoftwareSerial harus dimodifikasi karena jika tidak maka akan mengalokasikan SEMUA vektor interupsi perubahan pin. Ini menyebabkan galat tautan "definisi ganda" untuk vektor (port 0) yang ditetapkan ke sakelar SPST. Versi SoftwareSerial yang diretas harus ditempatkan di direktori yang sama dengan program sehingga hanya memengaruhi aplikasi ini.
Definisi pin input SPST termasuk/bagian definisi penugasan input SPST ke pin perangkat. Pin adalah khusus perangkat sehingga ditambahkan ke bagian #ifdef ATtiny8x.
Mode pin masukan SPST fungsi pengaturan Pin SPST dikonfigurasi sebagai INPUT
Konfigurasikan interupsi pin SPST fungsi pengaturan Vektor interupsi ditetapkan ke pin input SPST sehingga perubahan status sakelar menyebabkan interupsi. Register konfigurasi dan tipe interupsi adalah khusus perangkat. Untuk membuat kode sesederhana mungkin, perbedaan ditangani dalam bagian #jika didefinisikan
Siapkan pesan serial lengkap fungsi pengaturan Pesan output serial lengkap pengaturan diubah untuk mencerminkan aplikasi Input Multiplexer
Tambahkan fungsi ISR sakelar SPST bagian kode ISR untuk interupsi perubahan pin SPST ditambahkan. Kodenya umum tetapi vektor yang digunakan adalah khusus perangkat dan ditentukan di bagian yang bergantung pada perangkat di bagian atas program. Untuk memverifikasi ISR diaktifkan, status LED diubah. Meskipun tidak-tidak dalam aplikasi nyata, pesan keluaran serial dihasilkan yang mencerminkan status LED baru.
Ubah pemrosesan loop fungsi lingkaran ISR sekarang mengontrol menyalakan dan mematikan LED sehingga fungsionalitas dihapus dari rutinitas loop. Panggilan ke rutinitas tidur ditambahkan untuk ATtiny84 sebagai semacam "ekstra". Untuk aplikasi ini, ATtiny85 sleep tidak berfungsi; mungkin karena gangguan dari kelas Software Serial karena tidak berfungsi dengan SoftwareSerial dihapus.
Tambahkan rutinitas tidur bagian kode Fungsionalitas tidur tidak diperlukan untuk mendemonstrasikan penggunaan multiplexer. Baru saja ditambahkan karena biasanya ingin menunggu input dalam mode POWER_DOWN untuk menghemat daya daripada terus berjalan melalui loop program tanpa melakukan apa pun sampai input terjadi.

Ubah Kode kelas SoftwareSerial

Kelas SoftwareSerial perlu diubah sehingga tidak memonopoli semua port interupsi perubahan pin. Kode kelas SoftwareSerial terletak di

C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SoftwareSerial\src

Cari di PCINT0_vect di SoftwareSerial.cpp untuk menemukan lokasi awal untuk perubahan kode. Tambahkan kode berikut tepat sebelum pernyataan #ifdefined(PCINT0_vect) yang ada.

#jika ditentukan(_AVR_ATtiny84_)

#define MYPORT PCINT1_vect #elif didefinisikan(_AVR_ATtiny85_) #define MYPORT PCINT0_vect #endif ISR(MYPORT) { SoftwareSerial::handle_interrupt(); }

Sekarang komentari blok kode yang ada yang mengalokasikan vektor interupsi port seperti yang ditunjukkan di bawah ini (cukup tambahkan simbol komentar blok awal dan akhir /* dan */):

/*

#jika didefinisikan(PCINT0_vect) ISR(PCINT0_vect) { SoftwareSerial::handle_interrupt(); } #endif #jika didefinisikan(PCINT1_vect) ISR(PCINT1_vect) { //SoftwareSerial::handle_interrupt(); ISR(PCINT1_vect, ISR_ALIASOF(PCINT0_vect)); } #endif #jika didefinisikan(PCINT2_vect) ISR(PCINT2_vect, ISR_ALIASOF(PCINT0_vect)); #endif #jika didefinisikan(PCINT3_vect) ISR(PCINT3_vect, ISR_ALIASOF(PCINT0_vect)); #berakhir jika */

Konfigurasikan Perangkat Keras

Saklar SPST terpasang ke ATtiny84 pin 6 (MOSI) seperti yang dijelaskan pada Langkah 2. Prosedur ini diduplikasi di sini untuk kenyamanan.

  • sambungkan input sakelar 3A ke konektor MOSI header Tiny AVR Programmer
  • sambungkan 3B ke pin keluaran SPST ON
  • sambungkan 3Y ke ATtiny84 pin 6

    • HASIL:

      • 3A, MOSI, akan di-gate melalui ATtiny84 pin 6 selama pengunduhan
      • 3B, output SPST, akan di-gated ke pin 6 setelah diunduh

Jalankan programnya

Sebelum menjalankan, letakkan sakelar SPST pada posisi mati. Jika tidak, LED akan menyala ketika sakelar dimatikan dan sebaliknya. Ikuti prosedur langkah 3 untuk memuat, mengkompilasi, dan mengunduh program input aplikasi menggunakan Arduino IDE. Seperti sebelumnya, LED seharusnya tidak berkedip selama pengunduhan sehingga satu-satunya indikasi bahwa program telah aktif dan berjalan adalah pesan serial di akhir rutinitas penyiapan: SETUP Complete - Contoh Input

Pada titik ini program sedang menunggu input dari saklar SPST. Menempatkan sakelar pada posisi ON akan menyebabkan LED menyala; mengubah kembali ke posisi mati akan mematikan LED. Pesan keluaran memverifikasi bahwa ISR dipanggil (ISR: Led HIGH, ISR: Led LOW). Perhatikan urutan pesan serialnya adalah GO TO SLEEP terlebih dahulu menunggu pada perubahan status sakelar; ketika mendapatkan input sakelar, ISR dipanggil, mematikan LED, dan mendokumentasikan perubahan; kemudian pemrosesan mengambil setelah panggilan tidur sejak interupsi membangunkan prosesor.

Gambar
Gambar

PROGRAM UNTUK INSTRUCTABLE INI:

//************************************************************************

// BAGIAN 2: Aplikasi/unduh berbagi pin perangkat //. Memodifikasi kode Bagian 1 untuk mendukung penggunaan kembali pin // yang ditetapkan ke antarmuka pemrograman SPI //. Kode "umum" untuk ATtiny85 dan ATtiny84 //**************************************** ******************************** #include "SoftwareSerial.h" // Modifikasi Arduino SoftwareSerial class #include // While kode pemrosesannya umum, pin yang digunakan adalah khusus perangkat #if didefinisikan(_AVR_ATtiny84_) || didefinisikan(_AVR_ATtiny84A_) #define ledPin 4 // Beralih untuk menghidupkan/mematikan Led yang terhubung #define rxPin 9 // Pin digunakan untuk penerimaan Serial #define txPin 10 // Pin digunakan untuk pengiriman Serial #define SpstPin 6 // Input dari sakelar SPST (MOSI) #define ISR_VECT PCINT0_vect // Switch SPST Ubah pin vektor interupsi #elif didefinisikan(_AVR_ATtiny85_) #define ledPin 1 #define rxPin 4 #define txPin 3 #define SpstPin 2 // Input dari SPST switch (INT0) #define ISR_VECT // SPST switch Pin change interrupt vector #else #error Hanya ATiny84 dan ATtiny85 yang Didukung oleh Proyek ini #endif // Buat instance dari kelas Software Serial yang menentukan perangkat mana // pin yang akan digunakan untuk menerima dan mengirimkan SoftwareSerial mySerial(rxPin, txPin); //------------------------------------------------ ------------------------ // Inisialisasi sumber daya pemrosesan //------------------- -------------------------------------------------- --- void setup() { mySerial.begin(9600); // Mulai penundaan pemrosesan serial(2000); // Beri waktu port Serial Com untuk menyelesaikan start up. // jika tidak, output pertama kemungkinan hilang atau kacau pinMode(ledPin, OUTPUT); // Konfigurasikan pin led untuk OUTPUT pinMode(SpstPin, INPUT); // Konfigurasikan pin sakelar SPST sebagai INPUT #jika ditentukan(_AVR_ATtiny84_) || (_AVR_ATtiny84A_) // mengatur interupsi perubahan pin untuk menangani input sakelar pada pin 6 (MOSI) GIMSK |= (1<

Langkah 5: ATtiny85 Case 1 - Isolasi Output Aplikasi

Gambar
Gambar

Daripada membuat duplikat pengaturan perangkat keras untuk ATtiny85, mungkin lebih mudah untuk memulai dengan konfigurasi yang sudah selesai untuk ATtiny84 dari Langkah 4 dan mengganti chip tiny84 dengan tiny85. Semua perangkat keras yang dibutuhkan kemudian sudah tersedia. Jika menggunakan pendekatan ini, temukan tiny85 sehingga pin 3 dan 4 sejajar dengan kabel serial tx dan menerima kabel. Kemudian hanya masalah relokasi kabel antarmuka SPI agar sesuai dengan lokasi yang diperlukan untuk ATtiny85.

Jika memulai dari awal, ikuti saja langkah-langkah umum dari Langkah 3 dan diagram fritzing di atas. Kodenya sama seperti yang digunakan untuk ATtiny84 pada Langkah 3 dengan hasil yang diharapkan sama - tidak ada kedipan selama pengunduhan; saat menjalankan LED berkedip pada interval 2 detik dan pesan output serial mengikuti status LED.

Gambar
Gambar

Langkah 6: ATtiny85 Case 2 - Isolasi Input Aplikasi

Gambar
Gambar

Untuk pengaturan perangkat keras, mulailah dengan konfigurasi dari Langkah 5 dan tambahkan sakelar SPST seperti yang ditunjukkan pada diagram fritzing di atas. Saya sebenarnya menggunakan sakelar sesaat untuk versi tiny85 dan itu membuat verifikasi sedikit lebih mudah. Perhatikan bahwa output sakelar diputar 180 derajat dari konfigurasi ATtiny84. Perubahan ini memudahkan untuk merutekan kabel hookup karena semua 3 sinyal SPI berada di sisi yang sama untuk ATtiny85.

Gunakan program yang sama seperti untuk ATtiny84 Langkah 4. Hasil umum yang sama diharapkan - LED berubah status saat sakelar SPST dihidupkan/dimatikan dan pesan keluaran serial mendokumentasikan perubahan tersebut. Pesan GO TO SLEEP hilang karena fungsi sleep tidak dipanggil untuk ATtiny85. Meskipun program yang sama digunakan, ada perbedaan yang signifikan dalam implementasi untuk menjelaskan fakta bahwa ATtiny85 hanya memiliki satu register port (Port 0):

  1. SoftwareSerial sekarang mengalokasikan interupsi perubahan pin port 0 untuk komunikasi serial (Ingat bahwa kami dapat menggunakan port 1 untuk ATtiny84.)
  2. Interupsi sakelar SPST harus diimplementasikan dengan interupsi eksternal 0 (INT0) karena satu-satunya interupsi perubahan pin dialokasikan oleh SoftwareSerial. Ini menggambarkan poin bahwa interupsi perubahan pin dan interupsi eksternal secara logika independen dan dapat digunakan dalam register port yang sama.
  3. Tidak ada yang diperoleh dengan menggunakan versi SoftwareSerial yang dimodifikasi - hanya ada satu port dan kelas SoftwareSerial AKAN mengambilnya. Namun, kelas yang dimodifikasi masih digunakan hanya untuk menghindari perubahan yang tidak terkait langsung dengan tujuan langkah ini.

Direkomendasikan: