- Messaggi: 40
- Ringraziamenti ricevuti 0
Display dot matrix
7 Anni 9 Mesi fa #6
da Alex73
Risposta da Alex73 al topic Display dot matrix
Grazie anzitutto per il vostro contributo, oggi ho avuto modo di leggere le vostre risposte, ma non ero in condizione di poter rispondere a mia volta, i display che possiedo sono costituiti da 7 colonne costituite a sua volta da 5 led collegati ad anodo comune e da 5 righe dove i vari led sono collegati a catodo comune, perciò per accendere un led in particolare devo alimentare la colonna di cui il led fa parte e devo dare una massa alla riga corrispondente. Per realizzare un'immagine quindi devo alimentare una colonna alla volta e dare la massa di volta in volta alle righe giuste, facendo tutto questo velocemente l'occhio dovrebbe vedere l'immagine ferma. Ora il mio problema è sapere ogni quanto devo attivare ogni colonna (e relative righe), firstcolle raccomanda non oltre 20ms e per quanto tempo devo tenere accesi i vari led durante la scansione.
Utilizzo 5 piedini del pic per pilotare le 5 righe, altri 7 piedini li collego agli ingressi di 3 74hc244 che a loro volta vanno a pilotare le sette colonne, infine con altri 3 piedini del pic piloto gli enable dei 3 74hc244.
Che ne dite?
Ciao, Alex
Utilizzo 5 piedini del pic per pilotare le 5 righe, altri 7 piedini li collego agli ingressi di 3 74hc244 che a loro volta vanno a pilotare le sette colonne, infine con altri 3 piedini del pic piloto gli enable dei 3 74hc244.
Che ne dite?
Ciao, Alex
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Alex73
- Autore della discussione
- Senior Member
Riduci
Di più
7 Anni 9 Mesi fa #7
da Black
Risposta da Black al topic Display dot matrix
Ok Alex,
sapendo come vengono pilotati i led ora è tutto più chiaro.
In pratica quello che avverrà sarà di pilotare una colonna alla volta, ed ogni volta che una colonna sarà alimentata, configurerai i 5 pin in maniera opportuna.
Quindi, il tutto si riduce ad alimentare la prima colonna (per un tempo x); successivamente questo avverrà per la seconda, poi la terza.... e così via fino alla 21ma.
Così facendo un intero ciclo (illuminazione di tutte le 7 colonne per tutte e tre le cifre) impiegerà 21 volte il tempo x.
Qui devi notare 2 fenomeni distinti che l'occhio umano percepirà: il tremolio della luce emessa dai led ed una diminuzione dell'intensità della luce emessa (supponiamo che per il tempo in cui ogni led venga alimentato questo lo farà alla sua massima corrente).
L'intensità della luce è dovuta al duty-cycle applicato ad ogni led (1 istante acceso e 20 istanti spento, in cui accenderai gli altri led). Questo duty-cycle è fcilmente calcolabile e vale 4.76% del tempo.
Il tremolio è dovuto invece alla frequenza di aggiornamento che è indipendente dal duty-cycle. Maggiore è la frequenza, minore sarà l'effetto del tremolio percepito.
I 20 ms indicati da Firstcolle come valore massimo, che corrispondono ad una frequenza di aggiornamento di 50 Hz, possono andare bene, ma personalmente non scenderei al di sotto di tale valore. Anzi, se il micro è in grado tenderei ad aumentare questa frequenza.
Quindi, supponendo di applicare questi valori, alla tua domanda:
ogni 20 ms ogni led (ogni colonna) deve essere accesa una volta, quindi 20ms / 21 = 952 us
Questo è il tempo di accensione di ogni singolo led (o meglio di ogni singola colonna). In 20 ms avrai acceso tutti i led una volta.
sapendo come vengono pilotati i led ora è tutto più chiaro.
In pratica quello che avverrà sarà di pilotare una colonna alla volta, ed ogni volta che una colonna sarà alimentata, configurerai i 5 pin in maniera opportuna.
Quindi, il tutto si riduce ad alimentare la prima colonna (per un tempo x); successivamente questo avverrà per la seconda, poi la terza.... e così via fino alla 21ma.
Così facendo un intero ciclo (illuminazione di tutte le 7 colonne per tutte e tre le cifre) impiegerà 21 volte il tempo x.
Qui devi notare 2 fenomeni distinti che l'occhio umano percepirà: il tremolio della luce emessa dai led ed una diminuzione dell'intensità della luce emessa (supponiamo che per il tempo in cui ogni led venga alimentato questo lo farà alla sua massima corrente).
L'intensità della luce è dovuta al duty-cycle applicato ad ogni led (1 istante acceso e 20 istanti spento, in cui accenderai gli altri led). Questo duty-cycle è fcilmente calcolabile e vale 4.76% del tempo.
Il tremolio è dovuto invece alla frequenza di aggiornamento che è indipendente dal duty-cycle. Maggiore è la frequenza, minore sarà l'effetto del tremolio percepito.
I 20 ms indicati da Firstcolle come valore massimo, che corrispondono ad una frequenza di aggiornamento di 50 Hz, possono andare bene, ma personalmente non scenderei al di sotto di tale valore. Anzi, se il micro è in grado tenderei ad aumentare questa frequenza.
Quindi, supponendo di applicare questi valori, alla tua domanda:
e per quanto tempo devo tenere accesi i vari led durante la scansione?
ogni 20 ms ogni led (ogni colonna) deve essere accesa una volta, quindi 20ms / 21 = 952 us
Questo è il tempo di accensione di ogni singolo led (o meglio di ogni singola colonna). In 20 ms avrai acceso tutti i led una volta.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Black
- New Member
Riduci
Di più
- Messaggi: 11
- Ringraziamenti ricevuti 1
7 Anni 9 Mesi fa #8
da firstcolle
Risposta da firstcolle al topic Display dot matrix
secondo me 1ms di accensione di un singolo led è un po' poco.. conviene vedere se ci sono dei driver per questi display oppure dei buffer che mantengano il led acceso dopo aver ricevuto il segnale dal micro
Si prega Accedi o Crea un account a partecipare alla conversazione.
- firstcolle
- Platinum Member
Riduci
Di più
- Messaggi: 362
- Ringraziamenti ricevuti 39
7 Anni 9 Mesi fa #9
da Alex73
Risposta da Alex73 al topic Display dot matrix
Grazie, mi creo un hardware di prova, scrivo un po' di codice e faccio un po' do prove. Per creare un ritardo minore di 1ms con XC8 utilizzando la libreria LTlib_delay come posso fare? Oppure come posso fare altrimenti? Creare un loop con un comando while per perdere qualche centinaio di us dopo ogni accensione potrebbe essere un'idea?
Ciao, Alex
Ciao, Alex
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Alex73
- Autore della discussione
- Senior Member
Riduci
Di più
- Messaggi: 40
- Ringraziamenti ricevuti 0
7 Anni 9 Mesi fa #10
da Black
Risposta da Black al topic Display dot matrix
Io credo che la cosa migliore sia utilizzare l'interrupt generato da un timer ogni 1 ms (o tempi diversi che puoi testare di volta in volta). All'interno della routine di interrupt puoi far accendere una colonna alla volta a rotazione, e ad ogni accensione di colonna scrivi il byte delle righe (i 5 bit per essere precisi) che ti servono in quel momento.
Così facendo non devi controllare i tempi via software (lo fa il timer via hardware) e se la routine dovesse durare anche qualche centinaio di microsecondo probabilmente avrai comunque del tempo "libero" fra un interrupt ed il successivo, che ti permetterà di gestire anche tutti gli altri compiti a cui accennavi nel primo post.
Così facendo non devi controllare i tempi via software (lo fa il timer via hardware) e se la routine dovesse durare anche qualche centinaio di microsecondo probabilmente avrai comunque del tempo "libero" fra un interrupt ed il successivo, che ti permetterà di gestire anche tutti gli altri compiti a cui accennavi nel primo post.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Black
- New Member
Riduci
Di più
- Messaggi: 11
- Ringraziamenti ricevuti 1
Moderatori: Mauro Laurenti, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.