Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Interfacciamento LCD 1602A con AVR

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] Interfacciamento LCD 1602A con AVR

Messaggioda Foto Utentedaniele1996 » 30 nov 2014, 5:14

Salve a tutti, sto cercarndo ormai da almeno 12 ore circa di far funzionare uno di questi display (che usano un chip standard hitachi), ho letto parecchio a riguardo (comprese le librerie arduino), ma anche se ho capito all'incirca meno quasi il sistema logico, non riesco a farlo fungere. forse sto trascurando qualcosa che non ho messo in considerazione.
il display lo uso con questa configurazione:
- Alimentazione
- RS -> output micro (PB0)
- E -> output micro (PB1)
- D4, D5, D6, D6 -> ai 4 output (PB2 ... PB5)
RW -> GND (non mi interessa leggere i dati già scritti nel display, quindi lo imposto con scrittura permanente)

in sostanza, voglio usare un solo gruppo di porte ( Gruppo B )
ho scritto uno spezzone di codice, potete darmi un parere? (è possibile che in qualche shift ci sia qualche errore) spero di non aver fatto errori madornali...
Codice: Seleziona tutto
/*
* ArduinoUnoLCD.c
*
* Created: 30/11/2014 02:34:18
*  Author: Daniele
*/
#define F_CPU 16000000L

#include <avr/io.h>
#include <string.h>
#include <util/delay.h>
#include <avr/interrupt.h>

#define DDRLCD DDRB
#define PORTLCD PORTB
#define RS_pin 0
#define EN_pin 1
#define bit4 2
#define bit5 3
#define bit6 4
#define bit7 5


#define rs_DATA() PORTLCD |= (1<<RS_pin);
#define rs_CMD() PORTLCD &= ~(1<<RS_pin);

#define e_SCK()   PORTLCD |= (1<<EN_pin); \
               _delay_us(1);        \
              PORTLCD &= ~(1<<EN_pin);\
              _delay_us(1);
             
#define buffer(a)   PORTLCD = a;

void initLCD(){
   DDRLCD |= _BV(RS_pin) | _BV(EN_pin) | _BV(bit4) | _BV(bit5) | _BV(bit6) | _BV(bit7);
   PORTLCD = 0x00;
}

void writeChar(uint8_t ln, uint8_t pos, uint8_t c){
   cli();
   uint8_t offset = ln == 1? 0x80 : 0xC0;
   uint8_t oldlcd = PORTLCD;
   rs_CMD();
   buffer(PORTLCD | ((offset + pos)<<4)>>4);
   e_SCK()
   buffer(PORTLCD | (offset + pos)>>4);
   e_SCK();
   
   rs_DATA();
   buffer(PORTLCD | c);
   e_SCK()
   buffer(4<< (PORTLCD | c));
   e_SCK();
   PORTLCD = oldlcd;
   
   sei();
}

int main(void)
{
   initLCD();
   writeChar(1,3,'A');
    while(1)
    {
    }
}
Avatar utente
Foto Utentedaniele1996
610 3 8 11
Sostenitore
Sostenitore
 
Messaggi: 1554
Iscritto il: 29 ago 2011, 11:29

0
voti

[2] Re: Interfacciamento LCD 1602A con AVR

Messaggioda Foto UtenteWALTERmwp » 2 dic 2014, 2:52

Ciao Foto Utentedaniele1996, non ho ancora letto il codice con il proposito di verificarne la correttezza quindi non so se vi si "nascondono" degli errori però ho notato una funzione
daniele1996 ha scritto:_delay_us(1);
che introdurrebbe, se non mi confondo, un ritardo di un microsecondo.
Prova ad aumentarlo cambiando l'ordine di grandezza; passa a qualche decina (30, 40) di microsecondi.
Questa latenza andrebbe impiegata:
i) prima di portare a (1) il segnale "EN", dopo che è stato messo a (0) il segnale "RS",
ii) prima di eseguire la scrittura del dato sulla porta, dopo che è stato messo a (1) il segnale "EN",
iii) prima di riportare a (0) il segnale "EN", dopo che è stata completata l'istruzione di scrittura del dato sulla porta.
iv) prima di ricominciare dal punto (i) per eseguire la scrittura degli altri quattro bit(s) del dato.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[3] Re: Interfacciamento LCD 1602A con AVR

Messaggioda Foto Utentedaniele1996 » 7 dic 2014, 19:42

Se metto 1 ms? puo andare bene?
Avatar utente
Foto Utentedaniele1996
610 3 8 11
Sostenitore
Sostenitore
 
Messaggi: 1554
Iscritto il: 29 ago 2011, 11:29

0
voti

[4] Re: Interfacciamento LCD 1602A con AVR

Messaggioda Foto UtenteWALTERmwp » 7 dic 2014, 20:22

Ma hai già fatto delle prove ?

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

1
voti

[5] Re: Interfacciamento LCD 1602A con AVR

Messaggioda Foto Utentethexeno » 7 dic 2014, 21:04

Lo hai inizializzato correttamente? Sul datasheet Hitachi c'è una ben precisa sequenza da seguire, in cui imposti tutti i parametri, tipo quanti pin usi, quante righe e tipi di caratteri ecc.
Lì vedo una inizializzazione relativamente scarna, e non ti fidare dell'autoinit dell'Hitachi, perché è relativa ad una impostazione di base che non è detto che devi usare tu.

Se hai la mano con le librerie Arduino C++, ti conviene prendere i file .cpp usati dagli sviluppatori della libreria Arduino e studiarteli. Capisci come sono inizializzati e gestiti i segnali per il display. Non devi copiarle, servono per capire se hai un dubbio sul datasheet, ad esempio come inizializzare. Ci sono sequenze in cui richiedi almeno 5ms di intervallo e che vanno ripetute più volte: non sai se farle o usare l'auto inizializzazione? Guardi come l'hanno implementata. SPOILER ALERT: loro lo fanno. Ma anche tu dovrai farlo? :-)

Se quell oche usi è tutto lì, di sicuro non funziona: non ci sono i timing e le sequenze ripetute almeno solo per istruire il controller. Cerca i datasheet dell'HD44780, dovrebbe essere quello che ti serve.
Avatar utente
Foto Utentethexeno
235 5 9
Frequentatore
Frequentatore
 
Messaggi: 298
Iscritto il: 12 apr 2010, 18:28

0
voti

[6] Re: Interfacciamento LCD 1602A con AVR

Messaggioda Foto Utentedaniele1996 » 7 dic 2014, 22:08

Si, ho le lib arduino, ma non ho nessuna voglia di aprire. la cosa che odio di più è studiarmi il codice altrui (tranne se scritto in un Datasheet.. come gli esempii della atmel) mi studierò meglio il datasheet, il codice che ho scritto, l'ho scritto usando spezzoni di spiegazioni prese qua e là unendo il tutto con un pezzo di filo logico... leggerò il datasheet e aggiorno il topic :-)
Avatar utente
Foto Utentedaniele1996
610 3 8 11
Sostenitore
Sostenitore
 
Messaggi: 1554
Iscritto il: 29 ago 2011, 11:29

0
voti

[7] Re: Interfacciamento LCD 1602A con AVR

Messaggioda Foto UtenteWALTERmwp » 8 dic 2014, 1:17

daniele1996 ha scritto:la cosa che odio di più è studiarmi il codice altrui
... questo non credo ti sia di supporto.
Ho scritto una domanda alla quale non hai risposto; la cosa, se tu corrispondessi, sarebbe di aiuto a te, più che a me.

Andando avanti, considerando che l'argomento potrebbe interessare ad altri utenti, ti suggerirei la lettura dell'articolo di Foto UtentePaolino.
La sequenza dei comandi (istruzioni da inviare al display) per la inizializzazione è quella; non si può procedere senza o con una inizializzazione incompleta.
Se non sbaglio i conti dovresti inviare un totale di sette byte(s), per metterti nella condizione di scrivere sul display.
Quindi, nel codice che hai riportato, e che adesso ho guardato, manca "qualcosa" per completare quella "void initLCD()" (come è già stato riportato).

Tieni presente che l'invio di un byte (sia esso una istruzione piuttosto che un dato) prevede la scrittura, sulla porta del microcontrollore, prima del nibble più significativo e poi dell'altro.
Se specifichi il tipo di display che stai utilizzando (numero righe e caratteri per riga) si possono impostare le istruzioni adeguate al caso.
Poi, a quel punto, si può adattare (in base all'esistente) o realizzare la funzione che scrive l'istruzione e o il dato; quindi ti potresti muovere in modo indipendente dalle librerie.
Quanto sopra a meno che tu non abbia risolto diversamente.

Saluti
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[8] Re: Interfacciamento LCD 1602A con AVR

Messaggioda Foto UtenteIlGuru » 29 ago 2015, 12:22

Scusa, ma la sequenza di inizializzazione del display in cui specifichi il tipo di interfaccia a 4 o 8 bit, il numero di linee, il tipo di shift del display, il tipo di caratteri usati ecc dov'è?
Avatar utente
Foto UtenteIlGuru
5.482 2 10 13
G.Master EY
G.Master EY
 
Messaggi: 1924
Iscritto il: 31 lug 2015, 23:32


Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti