Display 7 segmenti via BCD

ricki158 ... nel mio post #73 avevo scritto STUDIARE BENE ... e ... dalle domande che fai qua sopra mi sembra che tu non l'abbia fatto ! ::)

[u]Non basta leggere[/u] quei due articoli di Leonardo Miliani, occorre veramente [u]studiarli[/u] e digerirli ... altrimenti continuerai a non capire come funziona e a porre le domande che poni ...

Guglielmo

Da quello che ho capito, la funzione millis() restituisce il numero del millisecondo dall'accensione. Questo vuol dire che se ho una variabile che non fa un ciclo e non viene riscritta, essa rimarrà al valore di partenza, cioè 0. Io con il mio codice faccio la differenza fra il valore millis() iniziale e il susseguirsi di millis() siccome è dentro un ciclo. Ciclando quindi millis() restituisce un valore differente che si incrementa fino ad arrivare all'intervallo che ho scelto. Quando arrivo all'intervallo "azzero la differenza" fra millis() attuale e la variabile che contiene il millis() precedente perché riscrivo questa variabile con il numero esatto di passi di differenza. Il problema è quando millis() andrà in overflow... devo continuare a leggere per capire che strategia posso usare.

Sono sulla buona strada?

precedente=intervallo

No! precedente=millis(); (e col punto e virgola!)

Perché precedente = intervallo è sbagliato, dovevo scrivere invece precedente += intervallo, oppure precedente = millis() ma prima si diceva che è meglio aggiungere il valore di intervallo per essere sicuri di avere sempre quel valore, sennò con millis() conta anche i millisecondi che ci mette per fare la funzione.

if(millis()-t1>TEMPO) {t1+=TEMPO; digitalWrite(LED,!digitalRead(LED));}

(messaggio #70) Facendo if(millis()-t1>TEMPO) non ci sono problemi di overflow, come hai letto dove ti è stato indicato prima.

Oggi finalmente mi sono arrivati i display e sono andato subito a provare il codice. Allora quando scrivo 0, mi si illumina solo il segmento al centro, mentre se scrivo altri numeri non mi si illuminano i segmenti che dovrebbero stare spenti (pensavo si accendessero al contrario) ma proprio a caso.

Ma hai il display con i segmenti al contrario ? Ovvero a catodo comune anziché l' opposto, o viceversa ?

Nono, è ad anodo comune, per questo motivo lo aspettavo in negozio, sennò a casa sono pieno di display a catodo comune. Adesso che mi ci hai fatto pensare ricontrollo la sigla. però se fossero a catodo comune i segmenti che dovrebbero essere accesi in realtà sono spenti e vice versa, invece i segmenti sono accesi completamente a caso secondo me.

Un'altra cosa. Ho inizializzato la seriale per leggere il valore di una variabile (perché la variabile analogica dell'interruttore Switch messa sul pin numero 1 analogico è sempre a 0, quando ha una resistenza di pull up per cui dovrebbe essere sempre a 1023) e il display sfarfalla vistosamente. Anche senza seriale il display un po' sfarfalla se lo guardo con la coda dell'occhio.

Lo sfarfallare è dovuto dal periodo di rinfresco. Se poni tante istruzioni nel periodo di aggiornamento del display diventa visibile il tempo che non è acceso. Una formula astrusa che ho adottato è che gli do 100 per display. Se vuoi assicurarti che riesca ad aggiornare il display a cadenza regolare, lo dovresti mettere sotto interrupt, con routine come FlexiTimer2, MStimer2 o TimerOne. Poi più che le sigle, prenderei un display e farei la prova della alimentazione di un singolo segmento, con la resistenza limitatrice, ovviamente. Fatto quello proverei il codice binario sull' integrato pilota.

Forse ti conviene usare un integrato driver apposito I2C o simile con latch, ad esempio l'M5450 (ma vedo che è fuori produzione). Trovi anche schede con i display già pronte a pochi euro.

Le cifre sono Kingbright SA56-11PWA per cui sicuramente Common Anode.

Si lo so benissimo che esistono display già fatti e funzionanti. Ma siccome voglio fare un orologio \ sveglia mio, da mettere sul comodino e per me fare circuiti stampati anche a doppia faccia non è un problema, ho optato per farmelo da me. Anche per imparare qualcosa di nuovo, tra hardware e software.

Con gli HEF4543 non puoi pilotare gli Kingbright SA56-11PWA. Perché gli integrati hanno una uscita attiva ALTA. Dovresti usare dei 74xx47 ;)

Nei datasheet del HFE4543 che ti allego, pagina 5 c'è scritto "For common anode LED displays, select PH = HIGH." ed ho messo il pin PH collegato direttamente al +5v.

ricki158: Un'altra cosa. Ho inizializzato la seriale per leggere il valore di una variabile [.....] e il display sfarfalla vistosamente. Anche senza seriale il display un po' sfarfalla se lo guardo con la coda dell'occhio.

La gestione della seriale probabilmente porta via troppo tempo e interferisce con la frequenza di multiplex. Lo "sfarfallio" con la coda dell'occhio è normale a 50Hz di refresh. Si potrebbe salire di frequenza riducendo i 3300µs del tempo di multiplex.

Per quanto riguarda le uscite del 4543 a questo punto bisogna avere delle certezze provando con dei semplici LED (con anodo a +Vcc), e vedere se scrivendo 0 1 2 ecc nel 4543 si accendono i LED giusti. Magari è solo da invertire il livello di PH (pin 6).... anzi no, guardando la Table3 del datasheet è giusto PH a +Vcc.

Domani provo a portare fisicamente le entrate del 4543 alte o basse tenendo una sola cifra accesa, anche quella portando fisicamente le entrate del 4028 alte e basse. In quel caso deve funzionare, se così non è c’è un problema hardware, ma ho testato la continuità e il circuito stampato è giusto.

Comunque sempre tornando all’ABC. Come faccio a distinguere i pin analogici da quelli digitali? Se io faccio analogRead(1) mi può leggere il pin 1 sia analogico che digitale? Domani faccio un paio di prove in laboratorio per essere sicuro che funzioni tutto.

ricki158: select PH = HIGH." ed ho messo il pin PH collegato direttamente al +5v.

Hai ragione. Io avevo notato solo la tabella della verità [u]e non ho visto[/u] l' ultima nota.

Adesso ho fatto qualche prova veloce con cavi volanti. Le cifre si accendono correttamente, sono i segmenti che hanno problemi. Controllo ancora le connessioni.

Ora ho controllato il HFE4543 e funziona a dovere, ma tra i LED e il HFE4543 utilizzo un Toschiba ULN2803 e in uscita da questo non ho nulla, o meglio tensioni da mezzo volt.

Ah, ma L' ULN2803 non è open collector ? Poi direi che è superfluo, visto che accendi solo un display alla volta. Addirittura potresti anche abbassare la resistenza dei segmenti, dato che accendi un display per 1/4 del periodo.

Nono, l'ULN2803 è open collector.

For common anode LED displays, select PH = HIGH." ed ho messo il pin PH collegato direttamente al +5v.

ok, ma siccome tra il HFE4543 e i display c'e' di mezzo un ULN2803, il pin PH lo devi collegare al GND