Quando IO è limitato su un uC, come si sposta la logica dall'UC?


8

Ad esempio, se avessi un Arduino con 4 pin IO digitali, come potresti illuminare in modo indipendente> 4 LED o leggere lo stato di> 4 pulsanti?


Fai domande sui PIC nel titolo, quindi fai riferimento a un Arduino!
Leon Heller,

2
@LeonHeller: quindi chiedi chiarimenti e / o modifica tu stesso la domanda. Anche se in questo caso si potrebbe semplicemente sostituire "uC" per PIC / Arudino.
Chris Laplante,

2
Sono d'accordo che l'hardware sia più economico da mantenere.
jippie,

3
@jippie - E poi la risposta geek è: "Cos'è una ragazza?" :-)
stevenvh

1
Suggerirei di riconsiderare la tua risposta accettata. Ignacio's è errato (ci sono tre segnali, non due), Bruno è più completo (Ignacio non menziona l'input per esempio) e ha una soluzione originale per salvare un pin extra.
Stevenvh,

Risposte:


4

Un registro a scorrimento come il 74595 ti permetterà di avere molte uscite con solo 2 connessioni: un pin dati e un pin clock. Impostare il pin di dati sul valore successivo che si desidera spostare nel registro, quindi pulsare il pin di clock.


È fantastico. Quindi ho letto su questo e solo per chiarire, con uno di quelli che posso avere 8 uscite in esecuzione utilizzando fino a 2 pin Arduino? Presumo di non poterli usare anche come input?
Cheesysam,

3
@cheesysam - "Con due puoi avere 16 uscite. Con tre, 24 e così via". Non è corretto Sono necessari 3 pin: dati, orologio e blocco, indipendentemente dal numero di dispositivi che si desidera connettere. La risposta di Bruno è più accurata. Inoltre, non parlare del 74595, questa è la tecnologia TTL originale, che è morta e sepolta da decenni. Vuoi il 74HC595.
Stevenvh,

1
@stevenvh: "... con uno di questi posso avere 8 uscite ...". Inoltre, sei sicuro che non vogliono il 74AC595? 74F595? 74LVX595?
Ignacio Vazquez-Abrams,

1
@Ignacio - "with two .." è confuso, come si può leggere come "con due I / O", come ho fatto io. Scusate. 74F595? Per il clock da un controller a 16 MHz? Io non la penso così. 74F ha molta fame e la velocità non offre alcun vantaggio. 74LVX è solo 3,3 V, quindi non si interfaccia con Arduino. Cosa c'è che non va nel 74HC? È la famiglia logica standard.
Stevenvh,

2
"Cosa c'è che non va nel 74HC?" Assolutamente niente. Cosa c'è di sbagliato nell'omettere la "XX"?
Ignacio Vazquez-Abrams

7

Bruno ha dato una buona risposta, ma vorrei prendere alcune note.

Il famigerato 70 mA
Il 74HC595 viene spesso utilizzato come I / O esteso e come spesso utilizzato per controllare una serie di LED. Ciò che viene spesso trascurato è che è possibile utilizzarlo fuori specifica in questo modo. Il foglio dati afferma che la corrente di alimentazione totale non dovrebbe essere superiore a 70 mA, valori nominali massimi assoluti (AMR), quindi è meglio stare lontani da quello con un certo margine. Pertanto 8 LED a 10 mA sono troppi e a 20 mA supererai l'AMR di non meno del 130%! Il limite è probabilmente dovuto alla capacità corrente dei fili di collegamento e quindi la corrente troppo elevata potrebbe non solo deteriorare le prestazioni della parte, ma metterla permanentemente fuori servizio in caso di rottura del filo.

Ma ieri sera mi sono svegliato perché avevo un'idea . Il limite di 70 mA vale sia per Icc che per corrente di terra, quindi perché non dividere il nostro totale o 80 mA e lasciare che Icc ne abbia metà e corrente di terra l'altra metà? Tutto quello che devi fare è fare riferimento 4 dei LED a massa (attivo alto) e gli altri 4 a Vcc (attivo basso). Quindi la corrente della prima proviene da Icc, la corrente delle altre va a terra. In questo modo sarai in grado di utilizzare LED da 15 mA. (È così semplice che mi sento un idiota a non averci pensato prima.)

Gli orologi combinati
che pensavo Bruno salvasse un pin I / O aggiuntivo combinando l'orologio del registro a scorrimento con quelli del fermo. Sembra che abbia frainteso la sua risposta. Voglio ancora espandere questa opzione.

Cosa succede allora? La tabella a pagina 5 del foglio dati dice:

i contenuti del registro a scorrimento sono stati spostati; i contenuti precedenti del registro a scorrimento vengono trasferiti al registro di memorizzazione e agli stadi di uscita paralleli

(sottolineando da parte mia)
Quindi non sono i nuovi dati ma i precedenti essere bloccati. Non è un vero problema, assicurati di spostare un bit fittizio in più per bloccare gli ultimi dati, altrimenti tutto sarà un pin sbagliato.

La combinazione degli orologi significa anche che le uscite si alterneranno continuamente mentre si stanno spostando nuovi dati. La funzione del latch era effettivamente quella di evitarlo. In molti casi questo non sarà un problema, se puoi farlo velocemente, ma nelle situazioni peggiori potresti ottenere effetti indesiderati. Il caso peggiore potrebbe essere l'utilizzo del 74HC595 per il multiplexing di un display con una frequenza di scansione molto elevata + avere una catena di registri a scorrimento molto lunga + avere tutti gli 1 tranne uno 0, un LED spento + una stanza buia. Dal momento che quel LED vede passare tutti gli 1 ogni tanto in una stanza buia, potrebbe accendersi debolmente.

O se si combina quel multiplexing ad alta frequenza con un'uscita di controllo relè. Tutti gli zeri e quindi un 1 per il relè possono significare che l'uscita del relè non è sufficientemente lunga per essere inserita.

Certo, quelli sono casi estremi, ma terrei il clock seriale e il latch separato ogni volta che è possibile se si desidera eseguire il multiplex o altrimenti si hanno alte velocità di aggiornamento.


1
+1 Ottima idea che hai avuto la scorsa notte! Mai visto questo menzionato da nessuna parte fino ad ora. D'altra parte, penso che tu abbia frainteso la risposta di Bruno. Intendeva combinare il segnale di clock del 74XX595 e 74XX165 insieme e combinare il segnale di blocco del 74XX595 e 74XX165 insieme.
m.,

@ m.Alin - Sì, sembra di sì. Grazie per la segnalazione. Modificherò la mia risposta, ma la lascerò come una possibilità.
Stevenvh,

Certo, è sicuramente una possibilità che altri hanno raccomandato. Vale la pena affrontarlo.
m.,

@ m.Alin - Penso che il motivo per cui non è stato usato prima sia che entrambi gli utenti non fossero a conoscenza del limite di 70 mA, o non gliene importasse :-(. Adesso vado all'ufficio brevetti! ;-)
Stevenvh,

3
Sono già tornato. L'ufficio era chiuso. Erano tutti in chiesa.
Stevenvh,

6

Concordo con Ignacio per quanto riguarda l'uso di un 74XX595, seriale in parallelo registro a scorrimento in uscita per l'espansione dell'uscita, ma in realtà avrai bisogno di 3 connessioni, una per i dati , una per l' orologio e un'abilitazione del fermo che trasferirà i dati dal registro a scorrimento interno ai fermi di uscita.

Schema di 74LS595

Per l'espansione degli ingressi è possibile utilizzare un 74XX165, parallelo nel registro a scorrimento in uscita seriale, questo consentirà di avere fino a 8 pulsanti per 74XX165.

inserisci qui la descrizione dell'immagine

La cosa buona di questo approccio è che puoi collegare in cascata diversi registri a scorrimento consentendo un numero maggiore di ingressi o uscite e, meglio, puoi mescolare 74XX595 e 74XX165 consentendo di avere un numero qualsiasi di ingressi o uscite.

Inoltre, è possibile condividere i segnali di clock e latch riducendo il numero di connessioni necessarie e semplificando notevolmente il software. In questo modo avrai solo bisogno di 4 connessioni per un numero qualsiasi di uno qualsiasi di questi registri di turno:

  • Orologio (condiviso con tutti i registri a scorrimento)
  • Latch Enable (condiviso con tutti i registri a scorrimento)
  • Data In (collegato all'uscita seriale dell'ultimo registro a scorrimento nella catena)
  • Data Out (collegato all'ingresso seriale del primo registro a scorrimento nella catena)

modificare

Mentre cercavo un diagramma, ho trovato su questo sito un modo molto intelligente per ridurre a 3 il numero di connessioni richieste. Consiste nell'usare lo stesso pin per l'input e l'output dei dati.

Il software farà qualcosa del genere per ogni impulso di clock:

  1. Configurare il pin come output
  2. Imposta il valore dei dati
  3. Invia un impulso di clock
  4. Configura pin come input
  5. Leggi i dati

Diagramma


1
Gli entusiasti eccessivi possono controllare solo stringhe come questa con un singolo pin di uscita del registro a scorrimento, e probabilmente quelle di input-output come wel. Chiedimi come lo so :-). Ciò si ottiene utilizzando i ritardi R / C su dati e blocco, con l'orologio collegato direttamente al pin di uscita. Il sequenziamento esatto dipende dalla polarità del trigger del fronte relativo per clock e latch, ma questi sono generalmente progettati in modo da lavorare insieme in questo modo.
Russell McMahon,

E come ho detto nella mia risposta, puoi anche combinare entrambi gli orologi, in modo da avere bisogno solo di due pin. È un'idea intelligente, ma non lo voterò una seconda volta. Basta una volta :-)
stevenvh

Non vedo la necessità di spostare l'ultima uscita del 74HC595 nel 74HC165. Qualcuno potrebbe spiegarlo? A quanto ho capito, 16 impulsi di clock sarebbero sufficienti per entrambi, impostare le uscite del 2 x 74HC595 (16 uscite) e leggere gli ingressi del 2 74HC165 (16 ingressi), senza questa connessione.

@Dario: avere l'ultimo output dal feed 74HC595 al 74HC165 è un modo "gratuito" per consentire a un controller che sa che la catena non sarà più lunga di una certa lunghezza per determinare che la catena è connessa e quanto tempo è . Se sarebbe accettabile eseguire il clock di tutti i '595 in esaurimento all'avvio, e se il primo' 165 avrà almeno un input alto, il codice potrebbe persino determinare quanti '595 e' 165 ci sono.
supercat

5

Nick menziona gli espansori I / O e vale sicuramente la pena esaminarli. Digikey ne elenca più di un migliaio, ne sceglierò uno con un'interfaccia I2C come esempio, perché richiede i pin I / O minimi; minimo due.

L'NXP PCA9505 ha 40 pin I / O configurabili, l'equivalente di cinque 74HC595. È una soluzione leggermente più costosa ma ottieni molte più funzionalità per questo:

  • Qualsiasi pin I / O può essere configurato come input o output
  • Pullup da 100 kΩ su tutti i pin I / O (il PCA9506 non ha i pullup, il che può essere rilevante per applicazioni a bassa potenza)
  • Tutte le uscite possono affondare 15 mA contemporaneamente, per un pacchetto totale di 600 mA
  • Un'uscita di interruzione al cambio rende superflua la scansione continua degli ingressi
  • Solo due fili per il collegamento al microcontrollore.

Ulteriori letture
espansori GPIO , brochure NXP
PCA9505 datasheet


4

Per una soluzione senza circuiti integrati aggiuntivi, è possibile utilizzare tecniche come il multiplexing e il charliplexing :

Multiplexing (nessuna resistenza di limitazione della corrente mostrata):

LED multiplexati

Il modo in cui funziona il multiplexing è abbastanza semplice: nell'esempio sopra, se vogliamo illuminare il LED1, impostiamo il pin C1 su output alto e il PIN R1 su output basso, tutti gli altri pin possono essere alti o Hi-Z (impostato su input, alto impedenza che li fa sembrare "disconnessi")
Se vogliamo accendere il LED5, impostiamo il pin C2 per l'uscita alta e R2 per l'uscita bassa.

Il numero di pin necessario per pilotare x LED può essere determinato da 2n pin per n² LED, quindi ad esempio per 16 LED abbiamo bisogno (√16) * 2 = 8 pin.

Charlieplexing:

Charlieplexing

Layout schematico alternativo (più ordinato) (suggerito da Supercat):

Charlieplexing 2

Questo è un po 'più complesso, ma utilizza meno pin per pilotare un numero maggiore di LED. Ad esempio, possiamo usare solo 5 pin per pilotare 20 LED come nell'esempio precedente (rispetto ad almeno 10 pin con multiplexing a matrice "normale" (da non confondere con l'uso di un circuito integrato nel qual caso il numero di pin necessari è log2 (nLED).

Per una soluzione esterna, è possibile utilizzare elementi come Shift Registers o Multiplexer come 74HC595 e 74HC151.
Un registro a scorrimento prende un flusso di input seriale di dati con clock e produce output parallelo (Serial In Parallel Out SIPO) o viceversa (PISO)
Generalmente hanno 8 uscite (o input) ma è possibile concatenare quante ne vuoi insieme per estenderle cose. Il lato negativo è che la velocità che è possibile aggiornare è divisa per il numero di uscite per ingresso (ad es. Per un registro di 8 uscite, se si dispone di un clock di ingresso da 8 MHz è possibile aggiornare a 1 MHz, per 16 uscite 500 kHz, ecc.)

Queste tecniche possono funzionare al contrario anche per gli input.


Questa risposta mostra come utilizzare Charlieplexing per i pulsanti di input multiplex: electronics.stackexchange.com/a/37362/8627
jippie

Un modo più semplice per disegnare un display Charlieplexed è semplicemente disegnarlo come una griglia NxN con la diagonale non popolata.
supercat

@supercat - Ho appena preso il primo esempio dalle immagini di Google. Ho appena aggiunto un altro esempio: è questo il tipo di layout che intendevi?
Oli Glaser,

@OliGlaser: Sì, anche se suggerirei di spostare i resistori nelle giunzioni della colonna. Se lo fai, allora sarà possibile pilotare nove LED contemporaneamente, a condizione che i driver high-side o low-side possano adattarlo. In alternativa, si potrebbero lasciare i resistori dove sono ma aggiungere un transistor ad ogni giunzione riga-colonna (per lo schema come mostrato, un NPN con la base sulla riga, l'emettitore sulla colonna e il collettore attaccato alla guida positiva ). L'aggiunta del transistor ridurrebbe notevolmente la potenza del drive high-side richiesta per far funzionare nove LED contemporaneamente.
supercat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.