Vai al contenuto
PLC Forum


Gestione Di Moolte Uscite 30/40 Con Pic - con un demultiplexer


stefano_

Messaggi consigliati

salve a tutti,

il problema è che dovrei gestire molte uscite circa 30 / 40 con un pic 16f84 o 16f628 .

avevo pensato di utilizzare un demultiplexer del tipo 74154 ma ha solo 16 uscite !!

come posso fare per aumenterle ??

Grazie 1000 come sempre a tutto il forum

ciao ciao

Link al commento
Condividi su altri siti


Ciao Stefano,

potresti usare una rete di 74154 fino a raggiungere il numero di uscite da te desiderato.

Poi dovresti implementare un minimo di logica di indirizzamento,

in modo da riuscire a selezionare (tramite i PIN G1 e G2 (che dalla tabella di verità, devono essere entrambi bassi per poter pilotare le uscite) ) quale DEMUX effettivamente pilotare.

Ciao e buon lavoro,

Cesco.

Link al commento
Condividi su altri siti

ciao,

vi ringrazio per la vostra tempestivita e per il vostro aiuto,

l'unica cosa che non mi è chiara è questa:

i pin G1 e G2 mi servono per decidere su quale uscita indirizzare l'ingresso con che cosa attivo un demux piuttosto che un'altro ??

e poi :

il 74154 ha 4 ingressi c'è qualche integrato che ne ha solo 1 ma con 16 o più uscite ??

Grazie 1000

ciao ciao

Link al commento
Condividi su altri siti

Potresti usare l' M5450: due ingressi seriali e 34 out, tipicamente usato per i segmenti dei display degli orologi ( 8 segmenti per 4 cifre + i 2 punti intermittenti).

Se cerchi con google trovi schemi e sorgenti.

Ciao

Link al commento
Condividi su altri siti

scusa la domanda banale,

ma allora a cosa servono G1 e G2 ?? in pratica se utilizzo un solo 74154 devono sempre essere collegati a massa

giusto ?

Link al commento
Condividi su altri siti

Si. I pin G1 e G2 servono per abilitare il funzionamento del demultiplexer nel caso tu abbia bisogno di disabilitare tutte le uscite o se ne usi piu di uno con gli indirizzi A-B-C-D in parallelo.

Se non sei in nessuno dei due casi sopra, li colleghi a massa e va piu che bene.

Comunque non penso che questo integrato faccia al caso tuo, visto che è possibile attivare una sola uscita per volta e con logica negata, ossia quando la attivi va a zero mentre quando è a riposo è alta.

Se hai bisogno di così tante uscite, se non hai particolari problemi di tempistiche sulle uscite, ti consiglio una serie di shift register in cascata. In genere sono shift register da 8 uscite e li piloti con 2 linee clock e dato.

Io uso molto i 74HC4094. Questo lo preferisco a quelli I2C per il semplice motivo che non hai da gestire il protocollo I2C. Mandi via solo il dato che deve essere caricato sullo shift register.

Ciao

Link al commento
Condividi su altri siti

Comunque non penso che questo integrato faccia al caso tuo, visto che è possibile attivare una sola uscita per volta e con logica negata, ossia quando la attivi va a zero mentre quando è a riposo è alta.

Link al commento
Condividi su altri siti

giusto....

a questo non avevo pensato !!!!!!

adesso mi studio un pò il 74HC4094 e poi mi faccio risentire.

Grazie 1000 e.... a tra poco.

Link al commento
Condividi su altri siti

salve, e scusate se vi rompo di nuovo ma non penso che mi siano di aiuto i registri a scorrimento !!!

probabilmente mi sono spiegato male io:

mi spiego meglio,

io ho 30 led e li devo comandare con un pic 16f84 o 16f628 che hanno 13 I/O !!!

Il punto è che vorrei comandare ogni singola uscita indipendentemente dalle altr e quindi vorrei per esempio accendere il primo led aspettare 30 secondi accendere il 4 aspettare 1 minuto accendere il 24 ecc.......

a parte il propblema del software che gestisce il tutto quali componenti hardware possono fare al caso mio ???

grazie 1000 a tutti e scusate se non sono stato chiaro

Link al commento
Condividi su altri siti

Dato che parli di tempi dell'ordine dei secondi, gli shift registers possono andare bene. Se, per esempio, ne colleghi 4 in cascata puoi avere 32 uscite indipendenti. Poichè il caricamento avviene serialmente, volendo cambiare anche una sola uscita devi ricaricare tutti e 4 i bytes facendo 32 shift. Mentre avviene lo shift le uscite del 4094 non cambiano se l'ingresso strobe (STR) è basso. Quindi durante il caricamento tieni basso STR, poi lo porti alto, per aggiornare le uscite, e quindi di nuovo basso.

Chi lo ha già usato potrà confermarti quanto descritto, se non ho letto male il data sheet.

Ciao.

Link al commento
Condividi su altri siti

grazie per la risposta allora si vede proprio che non ho capito nulla dei registri a scorrimento

ricomincio il capitolo da zero !!!!!

ciao ciao

Link al commento
Condividi su altri siti

Mi sa che non ha capito nulla nessuno

Secondo quanto ho capito io :

vuoi pilotare uscite in numero superiore di quante ne forniscano i microcontrollori da te utilizzati ?

La risposta e' si?

-Esiste il "sistema" di usare dei chip in bus , per esempio pcf8574 che ti danno 8 I/O configurabili

come uscite o ingressi .

Dal pic esci in bus I2C , che e' un bus seriale sincrono (con una linea di clock e una di dati )

In questa maniera puoi pilotare n ingressi ed uscite con 2 pin del micro .

Esistono anche per il bus SPI .

Se poi vuoi multiplexare o shifatere o altro non so , ma cosi ho fatto delle prove e funziona tutto regolarmente

Se il tuo micro dispone della peroferica I2C bene , seno' ti implementi una libreria come ho fatto io e molti altri

ciao

walter

Link al commento
Condividi su altri siti

Certamente esiste più di una soluzione del problema. Per esempio si possono usare dei 74HC259 che sono dei demultiplexer a 8 uscite con memoria. Con 8 pins del pic si possono controllare 4 demultiplexer e quindi 32 uscite con poche e semplici istruzioni in assembly, C o Basic. La scelta dipende dal costo, dalla reperibilità, dalla facilità d'uso, ecc.

Ciao.

Link al commento
Condividi su altri siti

E' vero... soluzioni ce ne sono a centinaia... il discorso sta appunto a scegliere quella che fa meglio al proprio caso, alla reperibilità dei componenti ed eventualmente anche al costo.

Sono d'accordo che usando il PCF8574 hai a disposizione 8 linee di I/O per ogni unità aggiunta, come per lo shift register, ho comunque considerato i seguenti punti:

[*] Da quanto avevo capito da stefano e che poi ha confermato, ha bisogno SOLO di uscite

[*] Per carica 40 uscite con lo shift register basta inviare 5 byte e dare lo strobe. Per quanto riguarda 40 uscite con il PCF8574 bisogna comandare 5 unità e inviare 2 byte ogni una, per un totale di 10 Byte, senza contare la gestione del protocollo I2C ( Start, stop, reset ) Con lo shift register hai un caricamento molto piu veloce.

[*] Lo shift register costa meno!

Link al commento
Condividi su altri siti

ciao,

ho fatto alcune prove col 4094 e vi dico come è andata:

ho gestito il tutto con un pic programmato in basic con picbasic.

prima di tutto ho inviato 5v sul pin "serinput" poi, all'interno di un ciclo infinito ho inviato 5v al pin di "clock" per 250 ns

quindi ho azzerato il pin di "clock" ed il pin "serinput" ho aspettato mezzo secondo e quindi ho inviato 5v al pin "strobe"

per aggiornare l'uscita.Ho tenuto alto strobe per 100 ms e poi l'ho riazzerato.

Ricapitolando:

serinput = 1

for a = 1 to infinito

clock = 1

aspetto 250 ns

serinput = 0

aspetto 500 ms

clock = 0

aspetto 500 ms

strobe = 1

aspetto 100 ms ' piccolo ritardo

strobe = 0

next a

Facendo così voleva far accendere un led alla volta in modo sequenziale, dal led collegato a Q1 fino al led

collegato a Q8 e poi di nuovo dall'inizio.

Il problema è che ........ non funzia.... si accendono tutti i led contemporaneamente e poi si spegne il primo Q1 ed inoltre

se tolgo l'alimentazione e poi la ripristino lo stato delle uscite del 4094 cambia, come se rimanesse in memoria qualcosa !!!

Che per case il 4094 ha pure una memoria ?!?!?!?!

Ho sbagliato tutto o c'è qualcosa di buono

Grazie 1000 a tutti

Link al commento
Condividi su altri siti

Sembra corretto... la linea serinput e clock le hai messe in uscita?

Il motivo che se spegni trovi lo shift register sporco è normale. QUando lo accendi ha uno stato ignoto. Basta che al RESET del micro carichi a zero tutti gli shift register.

Link al commento
Condividi su altri siti

ok ok caricando a zero tutti i registri va quasi bene, l'unico problema è che per caricare a zero tutti e 8 i registri ( oppure 32 se ho 4 4094 !!) impiego in tot di tempo durante il quale le uscite si attivano a caso e questo è un problema.

come lo posso risolvere ?? Avete qualche idea ?!

grazie ancora.

Link al commento
Condividi su altri siti

stefano+-->
(stefano)

Il dubbio era che i pin che avevi usato per comandare i 4094 fossero configurati come ingressi.

comunque ok, visto che funziona, sono configurati giusti!

serinput = 1

for a = 1 to infinito
clock = 1 
aspetto 250 ns
serinput = 0 
aspetto 500 ms
clock = 0
aspetto 500 ms
strobe = 1
aspetto 100 ms ' piccolo ritardo
strobe = 0
next a



shiftLoad:
   mask=1
   for i=0 to 7

   
   next i










Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...