NEW LED SECONDS

.

NEW LED SECONDS

Rivisitazione di un vecchio orologio digitale

Ecco di nuovo il maniaco degli orologi digitali. Questa volta per aggiornare qualcosa di vecchio. Quello che l’immagine mostra è uno dei primi orologi digitali prodotti circa 8 anni fa quando mi dilettavo con i micro PIC. Avevo una scheda di sviluppo della MikroElettronica con la quale ho sperimentato diverse cose facendo esperienza con questi sistemi.

Quando, ancora oggi, progetto nuovi orologi digitali mi chiedo quale potrebbe essere la diversità rispetto a quelli già prodotti, per renderli diversi. In effetti se avete la pazienza di leggere il mio articolo “Allegria, l’orologiaio matto è tornato !” troverete una carrellata di progetti di orologi funzionanti e altri rimasti sulla carta o disattivati/smontati o soltanto dimostrativi.

All’epoca della produzione di questo orologio (circa 8/9 anni fa) non avevo molte conoscenze con i dispositivi RTC e con la gestione dei display a 7 segmenti. Per cui la realizzazione di questo ha comportato l’uso di ben 8 circuiti integrati con tanto di studio per connetterli e renderli funzionanti. Quattro  di questi integrati venivano usati per la gestione del timer e gli altri quattro per pilotare i display. Il cuore di questo sistema è stato il micro PIC16F84: un piccolo micro con poche porte disponibili  ma sufficienti per quello che mi serviva. Non avendo RTC il clock veniva fornito dal pic attraverso l’ impostazione dei suoi timer interni per generare un impulso al secondo. Non erano molto precisi ma tutto sommato andava bene.

Qual’ era allora la diversità  rispetto agli altri ?: i secondi non facevano parte del display (era un dispositivo cannibalizzato da un vecchio decoder con solo 4 cifre) ma venivano visualizzati attraverso una corona di 12 led che si accendevano singolarmente uno dopo l’altro ogni 5 secondi. Ecco il motivo dei quattro integrati.

Perché allora rifare o “rivisitare” ciò che comunque è funzionante ? 

Primo: in questo periodo di “clausura forzata”  è necessario fare qualcosa che non sia sempre leggere o vedere la tv (oltre che preparare pranzo e cena o fare la spesa !!) per cui ho pensato: perché non riadattare  questo vecchio orologio con strumenti più moderni ?. 

Secondo: Ogni tanto questo orologio dava segni di stanchezza: si fermava casualmente senza un motivo apparente. 

Terzo: Mancando un RTC (che tiene i valori grazie alla pila) i valori non venivano ovviamente conservati per cui dopo improvvisi Black_Out, occorreva riposizionare l’orologio usando i quattro pulsanti adibiti allo scopo.

IL NUOVO PROGETTO:

Fermo restando il recupero di alcune parti tra cui: la scatola che lo contiene, i 4 display, i 12 led già cablati e il tastierino con i quattro pulsanti, ho iniziato lo studio del circuito partendo da come generare e pilotare i 12 led ogni 5 secondi e con quale dispositivo accenderli.  Lo schema sottostante è il primo risultato.

La lettura dei secondi dall’RTC discriminando quando  i 4 bit lower sono = a zero o cinque generano un impulso di clock (transizione H_L_H) che inviato al primo ingresso del 7493 fa avanzare il conteggio di una unità. Questo integrato è un “4 bit binary counter” e presenta alle uscite Q0/Q3 tutti i valori da00” a “FF secondo la logica binaria. Queste quattro uscite sono connesse agli ingressi “A0/A3” dell’integrato 74154 vecchissimo decoder “4-16” ovvero ad ogni configurazione binaria all’ingresso, l’uscita “S0/S15” equivalente va a livello logico “0” mantenendo le altre a “1” logico. Come si può vedere dallo schema ogni uscita da “S0” a “S11” pilota un led. Ma non basta: il contatore “DEVE azzerarsi al 12 impulso e tornare a zero altrimenti si perde il sincronismo dei secondi. E’ sufficiente portare “Q2 e Q3” agli ingressi MR1/MR2 del contatore che si azzererà quando i due bit saranno a “1” logico. (dodicesimo impulso).

C’è però un problemino: quando viene data tensione all’orologio questo contatore non si resetta ma presenta alle uscite una configurazione binaria casuale. E ciò crea la mancata sincronizzazione dei secondi.

Ho postato questo problema nel forum: come azzerare il contatore all’accensione e quando conta fino a 12. Devo ringraziare Amilcare e PicMicro675 che mi hanno proposto alcuni schemi. Ma siccome io sono testardo e cocciuto ho studiato e ristudiato come rimediare  l problema. Ritengo di avere una discreta esperienza in programmazione non solo attualmente con Arduino ma anche in passato (ero progettista software presso una multinazionale) per cui: ciò che può essere problematico via hardware forse lo si può risolvere via software.

Ho trovato due soluzioni: la prima via software/hardware mantenendo lo schema originale. Nello sketch ho programmato il terzo pulsante. Dopo ogni accensione del sistema uno dei 12 led si accende in base al valore Q0/Q3 del 7493. Allora ad ogni pressione del pulsante viene inviato al clock del 7493 un impulso che va avanzare ogni led. Quando si accende il led “0” si assume la sincronizzazione ORA/MINUTI/SECONDI=0 e si fa partire l’orologio con il quarto pulsante aggiornando l’RTC.

La seconda soluzione è nello schema seguente:

Qui si interviene esclusivamente via software: Il clock viene fornito dell’ RTC ogni 5 secondi al  pin ”CKA”. All’ accensione del sistema viene inviato un impulso di reset ai pin MR1/MR2 del 7493. Durante il ciclo normale di conteggio e visualizzazione ore/minuti, vengono conteggiati anche quanti impulsi di clock sono stati forniti al 7493 e al dodicesimo viene inviato un impulso di reset. Così operando la sincronizzazione dei secondi è perfetta.

Questo sottostante è lo schema di come avevo realizzato la gestione dei 12 led con ben 4 integrati. Forse la logica è un pò complicata !.

SCHEMA ELETTRICO GENERALE

Divido lo schema in blocchi funzionali:

Primo blocco: Contatore e decodificatore. Lo schema è quello relativo al primo schema (vedere sopra).

Secondo blocco: tastierino per aggiornare Ore/Minuti/Secondi e avvio

Terzo blocco: Connessione display e decodificatore. Questo circuito è solo esemplificativo in quanto può variare in base al tipo di display. (Anode o Cathode Common).

Quarto blocco è relativo al modulo RTC.

Ognuno di questi blocchi è connesso ad un pin del micro ATMEGA_328.

SPECIFICHE DEI SINGOLI COMPONENTI:

Le connessioni del timer, del decodificatore e del tastierino dovrebbero essere chiare.  Per quanto riguarda l’ RTC si tratta di un vecchio  modulo PCF8583 con molte funzionalità (allarmi ecc.) e una ram di 240 byte come del resto i più moderni DS1307 e altri. Si connette con il protocollo I2C  (SCL/SDA) ed è molto preciso.

Il  display usato è un recupero da un vecchio decoder. E’ formato da 4 cifre a 7 segmenti. Essendo integrato i pin sono soltanto  quattro per l’indirizzamento di ciascuna cifra e otto per i singoli segmenti punto decimale compreso. E’ però gestito in ANODE_COMMON. Cioè i 4 pin di indirizzamento vanno a +5 mentre i segmenti vanno a massa per l’accensione.

Questo display viene gestito dal chip MAX7219. Su questo dispositivo ho fatto a suo tempo uno studio abbastanza approfondito e l’ ho usato in  moltissime mie applicazioni anche senza l’utilizzo di display ma utilizzando led standard o led RGB. Da solo riesce a gestire fino a 8 display a 7 segmenti oppure un display a matrice 8×8. Se poi viene connesso a cascata con altri 7219 il numero dei display può raddoppiare.

C’ è però un piccolo problema: per sua natura questo chip gestisce solo display Cathode_Common contrariamente al display usato che come detto è Anode_Common.

Ci sono allora due sistemi per gestire entrambi i tipi di display: intervenire via Hardware o via software o un misto di entrambi. Vediamo allora come intervenire per i display ANODE_COMMON. 

Via Hardware: E’ la più complessa perché occorre invertire tutti i segnali: sia quelli che pilotano i segmenti sia quelli che indirizzano i display stessi. Quindi per ogni segnale occorre un inversore tipo 74Ls04. Nel caso in esame: 4 per gli indirizzamenti e 8 per i segnali servono 12 inversori e cioè 2 x 74ls04 (6 inverter per ciascuno). La libreria che gestisce il chip può essere scaricata dal Web e usata normalmente. 

Via Software: E’ possibile solo a metà nel senso che i pin di indirizzamento devono comunque essere invertiti mentre i pin dei segmenti possono essere invertiti via Software dalle funzioni della  libreria di gestione. Quindi la libreria deve avere una funzione specifica per gestire correttamente questa inversione.

A proposito di questa libreria: dopo aver approfondito a suo tempo quella scaricata dal Web, ne ho elaborato una nuova con altre funzioni specifiche sia per i display a 7 segmenti che per i moduli a matrice 8×8 o 7×5. Non è proprio una libreria secondo i canoni relativi, bensì questa cosiddetta “libreria” è in realtà composta da due file con estensione “.ino”: il primo contiene tutte le funzioni specifiche ed altre di mia produzione, il secondo contiene le tabelle per la decodifica dei caratteri da inviare ai display a7 segmenti o alle matrici. E gestisce sia i display anode_common che quelli cathode_common semplicemente dischiarando in fase di “init” il modo relativo. E’ però sempre necessario invertire i segnali relativi all’indirizzamento dei display.

I PCB DEL PROGETTO:

PCB MAIN: alloggia il micro ATMEGA328 e circuiteria per generare il clock di sistema e il max7219. I vari connettori per il tastierino, per i segnali del display e per il modulo timer e per il modulo RS323 per caricare lo sketch quando serve.

PCB TIMER: alloggia il 7493 e il 74154 per generare i 12 led.

Le connessioni sono numerose anche per recuperare quanto già presente.

Non ho purtroppo gli strumenti adatti: avendoli si sarebbe potuto produrre un unico PCB alloggiando tutti i componenti: micro Arduino, max721, display, led e tastierino evitando in questo modo tutti i fili di connessione.

        

Il terzo “micro PCB” mi è servito per invertire i 4 segnali relativi al pilotaggio del display. Ho dovuto inserirlo fuori dal pcb_main in quanto non mi ricordavo il tipo display per cui ho fatto ricorso ad una “patch” esterna.

LO SKETCH DI GESTIONE:

Devo fare una considerazione: ho confrontato lo sketch prodotto utilizzando il pic16F84 con il nuovo che utilizza il micro ATMEGA_328. E il confronto è pietoso: il vecchio sketch, righe di commento comprese, era di 200 righe circa, mentre quello nuovo, sempre commenti compresi, poco più del doppio. Ciò è dovuto principalmente alla gestione completamente diversa sia per quanto riguarda il timer, l’aggiornamento RTC, la sua lettura e il max7219; e se consideriamo anche che nel vecchio non c’era questa gestione, arriviamo a quasi 1000 righe di codice. C’è anche un  altro aspetto: con la scheda di sviluppo della Mikro Elettronica si poteva effettuare il debug in modo interattivo istruzione per istruzione verificando il contenuto dei registri del pic e delle variabili. Si poteva quindi effettuare le modifiche a caldo. Nel sistema Arduino tutto questo non è possibile (a me non risulta ancora). Bisogna ricorrere all’inserimento delle classiche frasi “Serial.print” sul monitor seriale, inserite nei vari punti dello sketch per verificare “quello che succede ad un certo livello”. E’ cosiddetto “debug” che nello sketch viene attivato solo se dalla porta seriale arriva il consenso. E ciò implica un ulteriore scrittura di istruzioni.

La struttura dello sketch viene costruita con le seguenti funzioni:

Lettura dei 5 registri del RTC relativi a Ore/Minuti/Secondi e registro di controllo.

Funzione che ferma o avvia il conteggio dell’ RTC.

Funzione che converte i valori dei registri da BCD ai singoli valori (Decine e unita ore, decine e unita minuti). Ciò è necessario in quanto l’ RTC aggiorna i valori in BCD ovvero le ore 12 è l’effettivo valore (in binario sarebbe “0b”). Lo spaccamento è necessario per pilotare poi correttamente i display.

Le funzioni Display_Ore e Display_Minuti che inviano i valori al display.

La funzione di ricompattamento dei  valori per aggiornare l’ RTC.

La funzione Read_Keyboard per leggere il tastierino quando occorre aggiornare l’ora o i  minuti e la sincronizzazione dei secondi.

La classica funzione “setup” dove vengono settati i parametri per il max7219, il settaggio dei pin di arduino, la prima lettura dell’ RTC e la visualizzazione dei valori, quindi la gestione del tastierino. Il processo “setup” termina quando viene premuto il tasto di avvio: viene quindi aggiornato l’ RTC e avviato il conteggio. L’ eventuale “debug” viene attivato solo se dalla porta seriale viene inviato un carattere qualsiasi entro tre secondi dal messaggio.

La funzione “loop” a questo punto si limita alla lettura dell’ RTC,  scompattamento dei valori e loro invio ai display, quindi la gestione dei secondi per l’accensione dei led. In totale 24 righe compresi i commenti.

Per finire, un paio di foto della realizzazione.

Scheda main con l’ RTC (ancora senza pila), il micro ATMEGA e il MAX7219.

Una vista dell’insieme del progetto con i cavetti di connessione al display, al tastierno e ai led. Come ho già detto si sarebbe potuto fare un unico PCB con tutti i componenti…. ma io non ho l’attrezzatura e anche l’esperienza per produrlo.

Ok, ho finito di annoiarVi, continuo con la “clausura” e vediamo cosa riesco a escogitare e inventare.

Vi ringrazio per l’attenzione e alla prossima !!.

gvsoft aprile 2020

 

 

VOTO
3 commenti
  1. Picmicro675
    Picmicro675 dice:

    Ho qualche nota dolente. Permetti che la critica possa essere costruttiva.
    Il fatto che già avevi nel circuito un MAX7912 poteva permettere di espandere la visualizzazione sui 12 LEDs tramite il medesimo, quindi qualche componente di meno.
    Il progetto è bello, non voglio eccepire. Si presuppone che con minor componenti si possano evitare problemi di tipo hardware. Il resto deve poi risolversi con il software. Tanto ché il MAX7912 permette di indirizzare il singolo LED di come lo si vuole accendere.

    Poi ci sono le scelte di quello che si ha nei cassetti, ovviamente che il 16F84 non lo consiglierei da mettere in opera. Anche dal fatto che è di un costo assurdo come se fosse antiquariato, in effetti lo è. Allora si potrebbe anche pensare di prendere uno di recente produzione come il 16F182x, pin-compatibile.

    NOTA di produzione, meglio se le foto siano più grandi. Ovviamente si dovrebbe poi scegliere il ridimensionamento nella stesura dell’articolo, ma almeno che si possa avere la visualizzazione degli schemi con le scritte abbastanza leggibili.

    Approvazioni
    • gvsoft
      gvsoft dice:

      Caro PicMicro675
      Ho sempre apprezzato le critiche costruttive….
      Però devo farti presente che questo progetto non è un rifacimento del vecchio, ma una “rivisitazione” ovvero aggiornamento di quanto esistente con nuovi dispositivi. L’uso del max7219 anche per i 12 led avrebbe comportato un completo rifacimento della circuiteria esistente cablaggi compresi e logica diversa di trattamento livello software. Per quanto riguarda il PIC avevo fatto una discreta esperienza con il PIC16f887 con il quale ho prodotto a pubblicato circa 30 progetti su un altro sito di elettronica: il 16f84 era più che sufficiente come motore per il vecchio progetto: il clock veniva fornito dai suoi timer interni, i display venivano gestiti in multiplex e i 12 led tramite i secondi. Il tutto con ben 8 integrati. Non ho pensato a inserire nell’articolo anche il vecchio schema: e sarebbe stata più chiara la differenza. Per quanto riguarda le foto cercherò di fare meglio con ciò che ho a disposizione, gli schemi sono copia/incolla da applicazioni cad su pc.
      Ciao
      gvsoft

      Approvazioni
  2. Amilcare
    Amilcare dice:

    Ottimo lavoro come al solito, non credevo fossi cosi rapido nella stesura generale ma, poi ho realizzato che in questo periodo di tempo disponibile ne abbiamo fin troppo.
    Uno schema era poco visibile ed ho fatto in modo che cliccandoci si possa espandere alle misure reali.

    Approvazioni

Lascia un Commento

Vuoi partecipare alla discussione?
Fornisci il tuo contributo!

Lascia un commento