Ketika IO terbatas pada UC, bagaimana Anda memindahkan logika menjauh dari UC?

8

Misalnya, jika Anda memiliki Arduino dengan 4 pin IO digital, bagaimana Anda bisa menyalakan> 4 LED secara mandiri, atau membaca status> 4 tombol?

cheesysam
sumber
Anda bertanya tentang PIC dalam judul, dan kemudian merujuk ke Arduino!
Leon Heller
2
@LeonHeller: Kemudian minta klarifikasi dan / atau edit pertanyaan itu sendiri. Padahal dalam hal ini orang hanya bisa sub "UC" untuk PIC / Arudino.
Chris Laplante
2
Saya setuju perangkat keras lebih murah untuk dirawat.
jippie
3
@ jippie - Dan kemudian jawaban geek adalah: "Apa itu pacar?" :-)
stevenvh
1
Saya akan menyarankan untuk mempertimbangkan kembali jawaban Anda yang diterima. Ignacio salah (ada tiga sinyal, bukan dua), Bruno lebih lengkap (Ignacio tidak menyebutkan input misalnya), dan memiliki solusi asli untuk menyimpan pin tambahan.
stevenvh

Jawaban:

4

Register geser seperti 74595 akan memungkinkan Anda untuk memiliki banyak output dengan hanya 2 koneksi: pin data dan pin jam. Anda mengatur pin data ke nilai berikutnya yang ingin Anda pindahkan ke register, dan kemudian pulsa pin jam.

Ignacio Vazquez-Abrams
sumber
Itu keren. Jadi saya sudah membaca dan mengklarifikasi, dengan salah satu dari itu saya dapat memiliki 8 output berjalan dari menggunakan 2 pin Arduino? Saya menganggap saya tidak bisa menggunakannya sebagai input juga?
cheesysam
3
@cheesysam - "Dengan dua Anda dapat memiliki 16 output. Dengan tiga, 24, dan seterusnya,". Itu tidak benar. Anda memerlukan 3 pin: data, jam dan kait, tidak peduli berapa banyak perangkat yang ingin Anda sambungkan. Jawaban Bruno lebih akurat. Juga, jangan bicara tentang 74595, itu teknologi TTL asli, yang telah mati dan terkubur selama beberapa dekade. Anda menginginkan 74HC595.
stevenvh
1
@stevenvh: "... dengan salah satu yang saya dapat memiliki 8 output ...". Juga, apakah Anda yakin mereka tidak menginginkan 74AC595? 74F595? 74LVX595?
Ignacio Vazquez-Abrams
1
@Ignacio - "dengan dua .." membingungkan, seperti dapat dibaca "dengan dua I / Os", seperti yang saya lakukan. Maaf. 74F595? Untuk clocking oleh pengontrol 16 MHz? Saya kira tidak. 74F sangat haus daya, dan kecepatannya tidak memberi Anda manfaat apa pun. 74LVX hanya 3,3 V, jadi tidak berinteraksi dengan Arduino. Apa yang salah dengan 74HC? Ini keluarga logika standar.
stevenvh
2
"Apa yang salah dengan 74HC?" Sama sekali tidak ada. Apa yang salah dengan menghilangkan "XX"?
Ignacio Vazquez-Abrams
7

Bruno memberikan jawaban yang baik, tetapi saya ingin membuat beberapa catatan.

The 70 mA yang terkenal
The 74HC595 sering digunakan sebagai I / O diperpanjang, dan seperti yang sering digunakan untuk mengontrol serangkaian LED. Apa yang sering diabaikan adalah bahwa Anda dapat mengoperasikannya dengan cara ini. Datasheet mengatakan bahwa total pasokan saat ini tidak boleh lebih dari 70 mA, Absolute Maximum Ratings (AMR), jadi Anda lebih baik menjauh dari itu dengan beberapa margin. Oleh karena itu 8 LED pada 10 mA terlalu banyak, dan pada 20 mA Anda akan melebihi AMR tidak kurang dari 130%! Batas tersebut mungkin disebabkan oleh kapasitas saat ini dari kabel ikatan, dan kemudian arus yang terlalu tinggi mungkin tidak hanya menurunkan kinerja bagian, tetapi secara permanen membuatnya rusak jika kawat itu akan putus.

Tapi tadi malam aku bangun karena aku punya ide . Batas 70 mA berlaku untuk ICC dan arus ground, lalu mengapa tidak membagi total atau 80 mA dan biarkan Icc memiliki separuhnya dan arus ground separuh lainnya? Yang harus Anda lakukan adalah referensi 4 LED ke tanah (aktif tinggi), dan 4 lainnya ke Vcc (aktif rendah). Kemudian arus yang pertama berasal dari Icc, arus yang lain pergi ke tanah. Anda dapat menggunakan LED 15 mA dengan cara ini. (Sangat sederhana sehingga saya merasa seperti orang idiot untuk tidak memikirkannya lebih awal.)

Jam gabungan yang
kupikir Bruno menyelamatkan pin I / O tambahan dengan menggabungkan jam register geser dengan kaitnya. Sepertinya saya salah menafsirkan jawabannya. Saya masih ingin memperluas opsi ini.

Lalu apa yang terjadi? Tabel di halaman 5 dari lembar data mengatakan:

isi daftar geser bergeser; isi sebelumnya dari register geser ditransfer ke register penyimpanan dan tahap output paralel

(disoroti oleh saya)
Jadi bukan data baru tapi sebelumnya yang terkunci. Bukan masalah nyata, pastikan untuk menggeser bit dummy ekstra untuk mengunci data terakhir, atau semuanya akan salah pin.

Menggabungkan jam juga berarti bahwa output akan beralih sepanjang waktu saat Anda memindahkan data baru. Fungsi latch sebenarnya untuk menghindari itu. Dalam banyak kasus ini tidak akan menjadi masalah, jika Anda dapat melakukannya dengan cepat, tetapi dalam situasi terburuk Anda mungkin mendapatkan efek yang tidak diinginkan. Kasus terburuk bisa menggunakan 74HC595 untuk mengalikan tampilan pada frekuensi pemindaian yang sangat tinggi + memiliki rantai register geser yang sangat panjang + memiliki semua angka 1 kecuali satu 0, LED yang mati + ruangan gelap. Karena LED itu melihat semua angka 1 lewat begitu sering di ruangan yang gelap, lampu itu bisa menyala sangat redup.

Atau jika Anda menggabungkan multiplexing frekuensi tinggi dengan output kontrol relai. Semua nol dan kemudian 1 untuk relai dapat berarti bahwa output relai tidak cukup tinggi untuk menarik.

Memang, itu adalah kasus yang ekstrem, tapi saya akan menjaga jam seri dan latch terpisah bila mungkin jika Anda ingin multiplex, atau memiliki tingkat pembaruan yang tinggi.

stevenvh
sumber
1
+1 Ide bagus yang Anda miliki tadi malam! Tidak pernah melihat ini disebutkan di mana pun sampai sekarang. Di sisi lain, saya pikir Anda salah menafsirkan jawaban Bruno. Dia bermaksud menggabungkan sinyal clock dari 74XX595 dan 74XX165 bersama-sama & menggabungkan sinyal kait dari 74XX595 dan 74XX165 bersamaan.
m .lin
@ m.Alin - Ya, sepertinya saya lakukan. Terima kasih telah menunjukkannya. Saya akan mengedit jawaban saya, tetapi tinggalkan sebagai kemungkinan.
stevenvh
Tentu saja, itu kemungkinan yang direkomendasikan orang lain. Layak untuk mengatasinya.
m .lin
@ m.Alin - Saya pikir alasan itu tidak digunakan sebelumnya adalah bahwa salah satu pengguna tidak tahu tentang batas 70 mA, atau tidak peduli :-(. Aku pergi ke kantor paten sekarang! ;-)
stevenvh
3
Sudah kembali. Kantor ditutup. Mereka semua ada di gereja.
stevenvh
6

Saya setuju dengan Ignacio tentang penggunaan 74XX595, serial paralel keluar register geser untuk ekspansi output, tetapi sebenarnya Anda akan memerlukan 3 koneksi, satu untuk data , satu untuk jam dan satu kait memungkinkan yang akan mentransfer data dari register geser internal ke kait keluaran.

Diagram 74LS595

Untuk perluasan input Anda bisa menggunakan 74XX165, paralel dalam register geser keluar seri, ini akan memungkinkan untuk memiliki hingga 8 tombol per 74XX165.

masukkan deskripsi gambar di sini

Hal yang baik tentang pendekatan ini adalah Anda dapat membuat daisy chain beberapa register geser yang memungkinkan peningkatan jumlah input atau output, dan lebih baik, Anda dapat mencampur 74XX595 dan 74XX165 memungkinkan dan Anda memiliki sejumlah input atau output.

Selain itu, Anda dapat membagikan sinyal jam dan kait yang mengurangi jumlah koneksi yang dibutuhkan dan sangat menyederhanakan perangkat lunak. Dengan cara ini Anda hanya perlu 4 koneksi untuk sejumlah register shift ini:

  • Jam (Dibagi dengan semua register shift)
  • Aktifkan Latch (Dibagi dengan semua register shift)
  • Data In (Terhubung ke output serial register shift terakhir dalam rantai)
  • Data Keluar (Terhubung ke input serial register shift pertama dalam rantai)

Edit

Ketika saya sedang mencari diagram yang saya temukan di situs web ini cara yang sangat cerdas untuk mengurangi hingga 3 jumlah koneksi yang diperlukan. Terdiri dari menggunakan pin yang sama untuk input dan output data.

Perangkat lunak akan melakukan hal seperti ini untuk setiap jam pulsa:

  1. Konfigurasikan pin sebagai output
  2. Tetapkan nilai data
  3. Kirim pulsa jam
  4. Konfigurasikan pin sebagai input
  5. Baca datanya

Diagram

Bruno Ferreira
sumber
1
Yang terlalu tajam dapat mengontrol shift register output hanya string seperti ini dengan pin output tunggal, dan mungkin input-output juga. Tanya saya bagaimana saya tahu :-). Ini dicapai dengan menggunakan penundaan R / C pada data dan kait, dengan jam yang terhubung ke pin output secara langsung. Urutan yang tepat tergantung pada polaritas pemicu tepi relatif untuk jam dan kait, tetapi ini biasanya dirancang untuk bekerja bersama dengan cara ini.
Russell McMahon
Dan seperti yang saya katakan di jawaban saya, Anda dapat menggabungkan kedua jam juga, sehingga Anda hanya perlu dua pin. Itu ide yang cerdik, tapi saya tidak akan memperbaiki ini untuk kedua kalinya. Satu kali sudah cukup :-)
stevenvh
Saya tidak melihat perlunya menggeser output terakhir dari 74HC595 ke 74HC165. Adakah yang bisa menjelaskan ini? Sejauh yang saya mengerti, pulsa 16 jam akan cukup untuk keduanya, atur output 2 x 74HC595 (16 output) dan baca input 2 74HC165 (16 input), tanpa koneksi ini.
@Dario: Memiliki keluaran terakhir dari umpan 74HC595 ke dalam 74HC165 adalah cara "freebie" untuk memungkinkan pengontrol yang mengetahui bahwa rantai tidak akan lebih dari panjang tertentu untuk menentukan bahwa rantai terhubung dan berapa lama itu. . Jika dapat diterima untuk mencatat semua '595 rendah pada saat start-up, dan jika 165' pertama akan memiliki setidaknya satu input tinggi, kode bahkan dapat menentukan berapa banyak '595 dan' 165 ada.
supercat
5

Nick menyebutkan I / O ekspander, dan mereka layak untuk dilihat. Digikey mencantumkan lebih dari seribu di antaranya, saya akan memilih satu dengan antarmuka I2C sebagai contoh, karena itu membutuhkan paling sedikit pin I / O; minimal dua.

NXP PCA9505 memiliki 40 pin I / O yang dapat dikonfigurasi, setara dengan lima 74HC595s. Ini adalah solusi yang sedikit lebih mahal tetapi Anda mendapatkan lebih banyak fungsi untuk itu:

  • Setiap pin I / O dapat dikonfigurasi sebagai input atau output
  • Penarikan 100 kΩ pada semua pin I / O (PCA9506 tidak memiliki penarik, yang mungkin relevan untuk aplikasi berdaya rendah)
  • Semua output dapat tenggelam 15 mA secara bersamaan, dengan total paket 600 mA
  • Output interrupt-on-change membuat pemindaian input yang terus-menerus berlebihan
  • Hanya dua kabel yang terhubung ke mikrokontroler.

Bacaan lebih lanjut eksponen
GPIO , brosur NXP
lembar data PCA9505

stevenvh
sumber
4

Untuk solusi tanpa IC tambahan, Anda dapat menggunakan teknik seperti Multiplexing dan Charliplexing :

Multiplexing (tidak ada resistor pembatas arus ditampilkan):

LED multipleks

Cara multiplexing bekerja cukup sederhana - dalam contoh di atas, jika kita ingin menyalakan LED1, kita menetapkan pin C1 ke output tinggi dan PIN R1 ke output rendah, semua pin lainnya bisa tinggi atau Hi-Z (set ke input, tinggi impedansi yang membuat mereka terlihat "terputus")
Jika kita ingin menyalakan LED5, kita mengatur pin C2 ke output tinggi dan R2 ke output rendah.

Jumlah pin yang diperlukan untuk menggerakkan x LED dapat dikerjakan dengan 2n pin untuk LED ², jadi misal untuk 16 LED kita perlu (√16) * 2 = 8 pin.

Charlieplexing:

Mencampuradukkan

Tata letak skematis alternatif (lebih rapi) (disarankan oleh Supercat):

Mencampuradukkan 2

Ini sedikit lebih rumit, tetapi menggunakan lebih sedikit pin untuk mendorong jumlah LED yang lebih tinggi. Sebagai contoh, kita dapat menggunakan hanya 5 pin untuk menggerakkan 20 LED seperti pada contoh di atas (dibandingkan dengan setidaknya 10 pin dengan multiplexing matriks "normal" (jangan bingung dengan menggunakan IC dalam hal ini jumlah pin yang dibutuhkan adalah log2 (nLED).

Untuk solusi eksternal, Anda dapat menggunakan hal-hal seperti Shift Register atau Multiplexer seperti 74HC595 dan 74HC151.
Sebuah register geser mengambil aliran input serial jam dari data dan output paralel (Serial In Parallel Out SIPO) atau sebaliknya (PISO)
Mereka umumnya memiliki 8 output (atau input) tetapi Anda dapat rantai sebanyak yang Anda inginkan bersama untuk memperpanjang sesuatu. Sisi buruknya adalah kecepatan yang dapat Anda perbarui dibagi dengan jumlah output per input (misalnya untuk satu register dari 8 output, jika Anda memiliki clock input 8MHz Anda dapat memperbarui pada 1MHz, untuk 16 output 500kHz, dll)

Teknik-teknik ini dapat bekerja secara terbalik untuk input juga.

Oli Glaser
sumber
Jawaban ini menunjukkan cara menggunakan Charlieplexing untuk tombol push input multiplexing: electronics.stackexchange.com/a/37362/8627
jippie
Cara yang lebih mudah untuk menggambar tampilan Charlieplex adalah dengan menggambarnya sebagai kisi NxN dengan diagonal yang tidak berpenghuni.
supercat
@supercat - Saya baru saja mencubit contoh pertama dari gambar google. Saya baru saja menambahkan contoh lain - apakah ini jenis tata letak yang Anda maksud?
Oli Glaser
@ OliGlaser: Ya, meskipun saya akan menyarankan untuk memindahkan resistor ke persimpangan baris-kolom. Jika Anda melakukannya, maka dimungkinkan untuk menggerakkan sembilan LED sekaligus, asalkan driver sisi-tinggi atau sisi-rendah dapat mengakomodasi hal itu. Atau, seseorang dapat meninggalkan resistor di mana mereka berada tetapi menambahkan transistor di setiap persimpangan baris-kolom (untuk skema seperti yang ditunjukkan, NPN dengan pangkalan di baris, emitor pada kolom, dan kolektor yang terpasang pada rel positif ). Menambahkan transistor akan sangat mengurangi kekuatan drive sisi tinggi yang diperlukan untuk mengoperasikan sembilan LED sekaligus.
supercat