Pic Micro, Arduino, Atmel, Microchip, Freescale, Texas Instrument, ecc. Strumenti di sviluppo, firmware e progetti.
#3638
Mi date una mano o anche due per mettere su uno sketch che gestisca un contatore da 00 a 99 tramite 2 display a 7 segmenti e due shift register 74HC164 ? L'incremento o decremento del contatore è direttamente connesso all'azione di 2 pulsanti A e B: se viene premuto A mi incrementa il contatore di 1 e se viene premuto B lo decrementa di 1.

Grazie
#3644
mayo ha scritto:Mi date una mano o anche due per mettere su uno sketch che gestisca un contatore da 00 a 99 tramite 2 display a 7 segmenti e due shift register 74HC164 ? L'incremento o decremento del contatore è direttamente connesso all'azione di 2 pulsanti A e B: se viene premuto A mi incrementa il contatore di 1 e se viene premuto B lo decrementa di 1.

Grazie

Non ho confidenza col variegato mondo di Arduino, ma da quello che leggo in giro rilevo che uno "sketch" dovrebbe essere qualcosa di software, ovvero un programma.
Le schede hardware vengono chiamate "shield" (quando si dice fantasia del marketing :) ).
Se con sketch intendevi shield, la faccenda cambia aspetto ma rimane comunque oscura: che cosa te ne fai di due shift register esterni, dal momento che hai a disposizione un microcontroller?
Se con sketch intendevi davvero il programma, sarebbe utile conoscere lo schema dei collegamenti elettrici, senza il quale non è possibile scendere nei dettagli di un ipotetico algoritmo credibile.
Se, infine, la parola "sketch" è sinonimo di "schizzo di uno schema elettrico", non credo si possa mettere insieme un contatore a due cifre con display, per giunta azionato da pulsanti meccanici che "rimbalzano", usando solo due shift register HC164. :)
#3654
Allora, sintetizzo la mia esigenza. Ho uno sketch già funzionante in cui se premo un pulsante A va alto il pin A3 di Arduino e se premo il pulsante B va alto il pin A4. I due pulsanti praticamente attivano un contatore che va da 1 a 100 ( 00 a 99 ) e volevo approfittare per visualizzare il conteggio su un doppio display a 7 segmenti . Come già detto prima, l'uso dei due shift register si rende necessario in quanto non ci sarebbero pin sufficienti su Arduino.

E dal momento che sono solo all'inizio con Arduino, mi chiedevo

- se il codice in calce allo schema da me postato, posso copia-incollarlo cosi com'è nello sketch già funzionante, compresi i 3 #define iniziali ( anche se all'interno del codice non vedo le ricorrenze di LATCH 4, CLK 3 e DATA 2 ma solo di LATCH, CLK e DATA))
- se nel codice viene previsto il passaggio dal primo display al secondo quando per esempio il conteggio passa da 9 a 10 ( ovvero da 08 a 09 )
- quali sono nel 74LS164 i pin DATA e LATCH, per caso posso usare SERIAL IN A e SERIAL IN B ? Riguardo al CLOCK mi sembra fin troppo evidente.
#3656
mayo ha scritto:E dal momento che sono solo all'inizio con Arduino, mi chiedevo

- se il codice in calce allo schema da me postato, posso copia-incollarlo cosi com'è nello sketch già funzionante, compresi i 3 #define iniziali ( anche se all'interno del codice non vedo le ricorrenze di LATCH 4, CLK 3 e DATA 2 ma solo di LATCH, CLK e DATA))
- se nel codice viene previsto il passaggio dal primo display al secondo quando per esempio il conteggio passa da 9 a 10 ( ovvero da 08 a 09 )
- quali sono nel 74LS164 i pin DATA e LATCH, per caso posso usare SERIAL IN A e SERIAL IN B ? Riguardo al CLOCK mi sembra fin troppo evidente.

Il codice non può essere usato così com'è, dal momento che l'hardware che vorresti usare è diverso dall'originale.
I tre #define possono rimanere come sono, poiché servono solo per aiutare il programmatore umano a ricordarsi più facilmente il significato letterale, ovvero LATCH, CLK, DATA, anziché il significato numerico, cioè 4, 3, 2.
Quando nel programma compaiono le parole LATCH, CLK, DATA, il compilatore "vede" in realtà i numeri 4, 3, 2 ad esse associati. E quindi normale che nelle righe #define si legga la parola seguita da un numero, mentre nel "corpo" del programma si legga solo la parola.
Gli shift register originali HC595 hanno dentro anche un "latch", cioè una memoria aggiuntiva che permette di "congelare" lo stato delle otto uscite fisiche mentre cambi le informazioni in seriale un bit alla volta.
Gli shift register HC164 non hanno un latch in uscita, e quindi, mentre li aggiorni, le uscite fisiche cambiano in corso d'opera in base ai bit che arrivano in seriale all'ingresso.
Se il micro ha sette pin liberi potresti rinunciare agli shift register e realizzare un pilotaggio multiplex con la semplice aggiunta di due transistor.
Prova a pensarci su, e se ti servono altri dettagli chiedi pure. :)
#3659
mayo ha scritto:Ciao, grazie per la risposta. Si, mi restano proprio 7 pin digitali liberi, sempre che i due transistor non ne vogliano qualcuno anche per loro.

Ovviamente i transistor devono essere pilotati, ma per tale azione puoi sfruttare i due pin che adesso fanno capo ai pulsanti, senza perdere la possibilità di accettare i comandi.
Per essere più specifico dovrei vedere lo schema completo, ma come info generica puoi pensare al cinema.
Non è una burla: il cinema funziona perché i fotogrammi statici della pellicola vengono mostrati nella stessa posizione uno dopo l'altro oscurando il quadro durante i cambiamenti.
I nostri occhi hanno bisogno di un certo tempo per catturare una scena e inviarla al cervello, e durante questo tempo memorizzano l'immagine internamente senza più reagire agli stimoli esterni.
Grazie a tale caratteristica degli occhi, il meccanismo di proiezione del cinema può mostrare una scena fissa per un attimo, poi oscurare il quadro, cambiare al buio l'immagine con la successiva, e quindi ridare luce per un altro attimo.
L'occhio non si accorge delle alternanze luce - buio perché queste si succedono con intervalli più brevi del tempo di "memorizzazione biologica", stimabile in circa un decimo di secondo.
Nel circuito che vorresti realizzare puoi quindi accendere i segmenti dei due display come se fossero due fotogrammi di una pellicola cinematografica: se operi a velocità abbastanza alta da ingannare l'occhio, appariranno accesi fissi entrambi anche se in realtà lampeggiano a turno.
Tale pilotaggio rapido in sequenza viene tecnicamente chiamato "multiplex".
Uno dei vantaggi pratici del multiplex è proprio il risparmio di risorse fisiche: anziché avere 14 fili verso i segmenti dei due display, puoi scendere a 7 collegando insieme a con a, b con b, e via dicendo fino a g con g, e alimentare a turno i catodi (o gli anodi) comuni attraverso due transistor.
Anche I resistori di limitazione scendono a 7, poiché la corrente passerà sempre in un solo display per volta.
In breve, la sequenza multiplex da implementare nel programma è questa:
1) spegni i transistor e le uscite dei segmenti;
2) prepari sulle uscite dei segmenti la "sagoma" da mostrare sul display delle decine.
3) attivi il transistor che alimenta il display delle decine e lasci trascorrere un ventesimo di secondo;
4) spegni i transistor e le uscite dei segmenti;
5) prepari sulle uscite dei segmenti la "sagoma" da mostrare sul display delle unità.
6) attivi il transistor che alimenta il display delle unità e lasci trascorrere un ventesimo di secondo;
7) torni al punto 1.

Ovviamente, quando dico "lasci trascorrere" non intendo la chiamata di una funzione "wait" o "delay" consistente in un loop a vuoto, altrimenti non verranno eseguiti eventuali altri compiti che il micro deve svolgere.
Per il multiplex viene di norma usato un interrupt del timer, ma trattandosi di Arduino (che non conosco) non so dirti nel dettaglio come e dove agire.

La "lettura" dello stato dei pulsanti può essere incastrata nel multiplex sfruttando i due fili che comandano i transistor.
Anche qui, senza lo schema completo, non posso essere più specifico.

Prova a disegnare un nuovo circuito seguendo le indicazioni, e poi vedremo come e dove aggiungere il resto.
Dimmer su aspirazione

Ciao a tutti ho una ventola di aspirazione in came[…]

Visita il nostro canale telegram