Pagina 1 di 1

Backlight LCD 16x2

MessaggioInviato: 19 apr 2014, 20:33
da thexeno
Ciao. :-)

Ho comprato da poco un LCD, classico HD44780. Ovviamente senza alcun datasheet complessivo. IIl mio problema è sapere alcuni limiti di sicurezza per la retroilluminazione, mentre per il resto la documentazione Hitachi si trova in ogni pertugio.

Ho visto che il led ha in serie un resistore da 100 ohm quindi deduco non serva una resistenza esterna. Però cercando in giro si trovano valori di tensione consigliati di 4.2V, ma altri con 5V si trovano bene. Il mio con 5V funziona, però non vorrei stressare troppo il led. Avete idee o esperienze a riguardo? Anche se mi rendo conto che senza un valore indicativo della corrente del led non si va da nessuna parte... E so anche che posso stare sul lato sicuro e non usare 5V.
Posso dire che è un LED bianco e che si illumina bene anche a 3.3V
So anche che illuminando i led oltre certi valori, il calore ne modifica leggermente il colore... allarmandoti istintivamente :D (ricordando esperimenti ingenui senza resistenze) mentre questo anche a 5V pare non scaldarsi in modo sensibile, e nemmeno il suo resistore SMD.

Re: Backlight LCD 16x2

MessaggioInviato: 19 apr 2014, 20:42
da bladeblaze
Potresti mettere in serie un resistore variabile, così da poter variare a piacere la retroilluminazione sul minimo necessario. Oppure utilizzare un PWM che fa più figo :mrgreen: .

Dato che sai il valore della resistenza in serie al diodo, se hai un multimetro qualsiasi potresti misurare la corrente totale erogata a led acceso e ricavarti tutto il resto.

Re: Backlight LCD 16x2

MessaggioInviato: 20 apr 2014, 0:17
da WALTERmwp
Ciao Foto Utentethexeno,
non so con quale dispositivo tu voglia gestire l'LCD però, dato il controller al quale fai riferimento, direi che qui puoi trovare alcune risposte e se cerchi bene, sempre qui su EY, magari recuperi altre informazioni (sempre in relazione alla retroilluminazione); come ti è già stato suggerito, se ci metti un "trimmerino", puoi stabilire l'effetto ottico a tuo piacere.
L'LCD, per i modelli che ho avuto modo di provare, se gli "porti" i 5 V dell'alimentazione "fanno tanta luce" (oltre a consumare parecchio) e "scaldano a sufficienza".
Poi, ovviamente, dipende tutto da quello che hai tu.
Saluti

Re: Backlight LCD 16x2

MessaggioInviato: 20 apr 2014, 14:57
da thexeno
bladeblaze ha scritto:Potresti mettere in serie un resistore variabile, così da poter variare a piacere la retroilluminazione sul minimo necessario. Oppure utilizzare un PWM che fa più figo :mrgreen: .


Ok, come ho detto se non so altro sto sul safe side. Però a priori per avere il minimo necessario, non lo userai mai al massimo, perché non sai qual è, se vuoi stare sul lato sicuro. Anche se mi spiego male, però capisci che intendo?

bladeblaze ha scritto:Dato che sai il valore della resistenza in serie al diodo, se hai un multimetro qualsiasi potresti misurare la corrente totale erogata a LED acceso e ricavarti tutto il resto.


La corrente è dipendente dalla tensione, se non sai la tensione "sua" o la sua corrente nominale, quello che leggo può essere giusto o sbagliato. 1 equazione, 2 incognite :-) Farò qualche misura di corrente giusto per sapere se avrà valori ragionevoli... :ok:

WALTERmwp ha scritto:Ciao Foto Utentethexeno,

Poi, ovviamente, dipende tutto da quello che hai tu.
Saluti


Ciao, guarda, alla fine l'unica cosa utile è cercare per la scritta stampigliata sopra, QC1602A, e trovi tante cose in comune a tanti datasheet diversi per quella sigla specifica. Facendo così tutti hanno un valore di 4.1V e 120mA di corrente per la luce verde. La mia è bianca, quindi tendenzialmente ha una Vgamma superiore e non dovrebbe patire. Mi sa che userò quei parametri, dal momendo che sono anche quelli più "standard" per questi LCD. Pochi patemi mentali e via. :D

(buon equinozio)

Re: Backlight LCD 16x2

MessaggioInviato: 20 apr 2014, 16:31
da daniele1996
Ciao, anche io ho un LCD 1602 (16 caratteri x 2 righe) ... a 5V funziona bene... ho messo una resistenza variabile come suggerito, anche perché una numinosità eccessiva dopo un po di tempo che lo guardi da fastidio... oppure, da quello che deduco lo userai con un arduino, usa le uscite PWM, stai attento alle librerie che usi, alcune usano i timer della cpu e se usa i timer dei pin PWM, l'uscita viene falsata

Re: Backlight LCD 16x2

MessaggioInviato: 20 apr 2014, 17:07
da thexeno
Si Daniele, farò che fare così. Per ora lo sto usando con il Pierin e alimento a 3.3V

ot: Arduino (con il Wiring) e librerie le uso se devo testare qualcosa velocemente. Altrimenti programmo con Atmel Studio e vado sicuro su quel che uso e sul cosa voglio usare. Le librerie le uso nel senso che spulcio il codice .cpp sviluppato da loro per capire a volte se come ho fatto le cose io (anche su altri micro) è sensato o meno, per non parlare dello stile di programmazione che si può imparare. Chi sviluppa le librerie è spesso un vero programmatore nella vita, cioè vive su quello.. :ok:

Re: Backlight LCD 16x2

MessaggioInviato: 22 apr 2014, 0:45
da thexeno
Rieccomi. Non vorrei aprire un'altra discussione visto che è correlata al display (@mods: magari cambiare titolo?)

Ho una paranoia sui tempi di esecuzione dei comandi del display. In pratica, dopo ogni esecuzione, per chi ha provato questi driver HD-compatibli, deve dare un impulso che fa campionare i dati sul suo fronte di discesa. Dopo di che, ammesso di aver rispettato le tempistiche, è possibile fare un'operazione di lettura sul display pe rcontrollare un bit di busy/#ready (BF).

Il display come bit BF risponde, testato all'oscilloscopio e sulla pratica: senza il controllo, è inusabile, dunque è corretto. Almeno sembra. Perché non sempre mette il cursore all'inizio, è come se saltasse un carattere, ma stiamo parlando di una cosa probabilistica che ha a che fare con errori in tempi di inizializzazione, succede 1 volta su 5.
Debuggando qua e la ho scoperto che nel mio codice, dopo lo spostamento del cursore nella posizione iniziale, la letura del BF non funziona. Lo spostamento è un'operazione lenta, che chiede >1.52ms, pensavo che il BF venisse letto: inserendo 2ms manuali si risolve tutto. Mi chiedo come mai, cosa mi sfugge.
Lo so, è un prurito, più che una necessità.

PS: l'inizializzazione manuale non la faccio, se con questa pausa funziona sempre e il display parte bene, l'inizializzazione automatica interna funziona bene. La implementerò, ora non ho voglia... [-X

Vi lascio il main() e la funzione del display. (magari vi torna utile anche, o mi potete correggere su alcune cose :P)

main() ->
Codice: Seleziona tutto
void main(void) {

    ConfigureOscillator();

    InitApp();
    int i;
    for(i=0; i<50; i++)
    __delay_ms(2);      // ASPETTO UN PO

    write_comm(LCD_FUNCTIONSET|LCD_8BITMODE|LCD_2LINE|LCD_5x8DOTS);

    while (write_comm(LCD_BUSYCHECK) != 0);

     write_comm(LCD_DISPLAYCONTROL | LCD_DISPLAYON | LCD_CURSOROFF | LCD_BLINKON);

     while (write_comm(LCD_BUSYCHECK) != 0);
 
    write_comm(LCD_ENTRYMODESET|LCD_ENTRYLEFT);

     while (write_comm(LCD_BUSYCHECK) != 0);

        write_comm(LCD_RETURNHOME);
    __delay_ms(2);  // <- QUELLO MISTERIOSO!
    while (write_comm(LCD_BUSYCHECK) != 0);
   
//     uint16_t a = 0b0000000001001000; // H

     write_comm(LCD_WRITEDATA|'x');

     while (write_comm(LCD_BUSYCHECK) != 0);

     write_comm(LCD_WRITEDATA|'u');
     
     while (write_comm(LCD_BUSYCHECK) != 0);

     write_comm(LCD_WRITEDATA|'@');

       while (write_comm(LCD_BUSYCHECK) != 0);

    while (1) {

    } // while
}//main


La write_comm() e pulse()

Codice: Seleziona tutto
void pulse(){
    PORTCbits.RC2 = 0;
    __delay_us(1);   // 1us enable cycle time
    PORTCbits.RC2 = 1;
    __delay_us(1);
    PORTCbits.RC2 = 0;
    __delay_us(100);
}

bool write_comm(uint16_t comando){
    if (comando == LCD_BUSYCHECK)
    {
        bool flag = 1;
        TRISD = 0xFF; //8 bit data
        PORTCbits.RC0 = comando >> 9;
        PORTCbits.RC1 = comando >> 8;
        pulse();
        flag = PORTD & (1 << 8);
        TRISD = 0x00; //8 bit data
        return flag; // for checking purposes, ready flag
    }
    PORTD = comando;
    PORTCbits.RC0 = comando >> 9; //RS
    PORTCbits.RC1 = comando >> 8;  // R/W
    pulse();
    return 0; // scarta
}


Macros (per velocità violentemente prese e modificate da una libreria di Arduino)

Codice: Seleziona tutto
#define LCD_CLEARDISPLAY 0x0001
#define LCD_RETURNHOME 0x0002
#define LCD_ENTRYMODESET 0x0004
#define LCD_DISPLAYCONTROL 0x0008
#define LCD_CURSORSHIFT 0x0010
#define LCD_FUNCTIONSET 0x0020
#define LCD_SETCGRAMADDR 0x0040
#define LCD_SETDDRAMADDR 0x0080
#define LCD_BUSYCHECK 0x0100
#define LCD_WRITEDATA 0x0200



pps: all'inizio ho lavorato sulle porte B con LCD alimentato a 5V, dotato di tanto di pullup... ho paura a ri-testare l'ADC. I Santi mi avranno sentito.