Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

[PIC16F877] Problema funzionamento LCD

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

0
voti

[1] [PIC16F877] Problema funzionamento LCD

Messaggioda Foto Utenteanto2014 » 24 ott 2014, 21:37

Salve,
ho un display che proprio non vuole saperne di fare il suo lavoro (o forse è la mia inesperienza) è un LCD 16x1(16 caratteri sulla stessa colonna) della NAN YA PLASTIC mod LMKC3R006C2E

il datasheet l' ho trovato qui: http://www.mark-products.com/pdf/c16x1/ ... 20spec.pdf

Ho collegato il display ad un trimmer come riportato nel datascheet e il rusultato è questo:
-primi 8 caratteri spenti e i restanti 8 accesi
-una volta "collegato" il picmicro no succede niente.

2° tentativo:
Ho usato un trimmer per regolare il contrasto e un altro per regolare la tensione di alimentazione, risultato:
-variando la tensione dei trimmer tutti i caratteri accesi
-collegato il display al picmicro tutti i caretteri si sono spenti

Ho usato due librerie diverse per gli LCD ma niente, inoltre sul datascheet non viene riportato il diagramma di flusso per l' inizializzazione ma leggendo l' interfce timing (data write) a pag. 8 vedo che i tempi minimi sono tutti al di sotto di quelli normalmente usati nello standard HD44780 quindi deduco (dal basso della mia enesperienza :D ) che con la stessa libreria dovrebbe funzionare,
consigli ?

PS sono tre giorni che ci sbatto la testa #-o
Avatar utente
Foto Utenteanto2014
10 2
 
Messaggi: 14
Iscritto il: 16 mag 2014, 19:15

0
voti

[2] Re: [PIC16F877] Problema funzionamento LCD

Messaggioda Foto UtenteWALTERmwp » 24 ott 2014, 21:48

Ciao Foto Utenteanto2014, in base a quello che hai riportato non si può scrivere nulla di mirato.
Hai programmato (penso) un microcontrollore e lo hai collegato ma come hai fatto sia una cosa che l'altra non si "vede".

Se speri che qualcuno ti porti un suo contributo dovresti mettere a disposizione più informazioni.
Puoi, ad esempio, inserire in un Post il tuo codice (... tra i tag(s) [Code]) ed altrettanto puoi fare con lo schema elettrico (... tra i tag(s) [fcd]).

Per lo schema usa FidoCad o FidoCadJ (vedi nel menu a tendina nella parte superiore della tua pagina: "Help" -> "Guida all'uso del Forum").
Se hai qualche difficoltà in merito puoi chiedere ( ... anche di questo).

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

0
voti

[3] Re: [PIC16F877] Problema funzionamento LCD

Messaggioda Foto Utenteanto2014 » 24 ott 2014, 22:09

Lo schema elettrico per quanto riguarda l' alimentazione è quello riportato sul dascheet pagina 7, per ora non lo posto perché uso soltanto autocad e devo prendere confidenza con fidocad :(

il codice è:

Codice: Seleziona tutto
/// Autore: Antonio
// Programma di esmpio: visualizzare la scritta Hello  su LCD 16x1 Nan Ya Plastic
// nel file lcd.c sono settate le funzioni per l' lcd

#define  XTAL_FREQ 20MHZ //usato dalla routine per ritardi

#include <PIC.h>

__CONFIG (HS & WDTDIS & PWRTEN & BORDIS & LVPDIS & DUNPROT & WRTEN & DEBUGDIS & UNPROTECT);


#include "delay.c"//routine di ritardo inclusa
#include "lcd.c"//libreria per controller inclusa

void main(void)
{
TRISA=0b0000000; //registro tristato delle porte RA
TRISB=0b0000000; //registro tristato delle porte RB
TRISC=0b0000000; //registro tristato delle porte RC
TRISD=0b0000000; //registro tristato delle porte RD
TRISE=0b0000000; //registro tristato delle porte RE
//tutte le porte impostate come uscita
LCD_INIT(); // inizializzazione dell'LCD
      
DelayMs(100); //ritardo iniziale
LCD_CLEAR(); //il display viene ripulito e il cursore viene portato nella prima riga della prima colonna

LCD_GOTO(1,1); //il cursore dell' LCD: viene posizionato in riga 1 colonna uno

LCD_PUTS("HELLO"); //comando che permette di scrivere una stringa di lettere o numeri


while(1) //ciclo while infinito, cosi  il programma continua a funzionare senza bloccarsi
         {
         }
}]

le funzioni per il display sono (la routine non è mia quindi riporta anche la fonte ecc.) :


[code][//***********************************************************************
POOR's (universal) LCD interface V1.4b                 
simple and complete LCD routines by Andrea Bonzini

some edits by Bernardo Giovanni (http://www.settorezero.com) (see changelog.txt)
************************************************************************
Please report any bug or suggestion at zypkin@inwind.it

************************************************************************
This code will interface to a standard LCD controller
like the Hitachi HD44780 or Samsung KS0066
It has been tested and works correctly with the followings
LCD types:
1x8, 2x8, 1x16, 2x16, 2x20, 4x16, 4x20

!!! WARNINGS !!!

This routines had been written to meet minimum hardware
requirements...so you can use it even when your main
application has left a few I/O lines not on the same port :)
To let this you have the following restriction and benefits:

1) LCD works only in 4 bit mode.
2) You can use any Output pin of your MCU, you have only
      to change pin assignments in the define section.
3) R/W select is not available so you must ground LCD's R/W pin

  !!! NOTE !!!

These routines use delay.c

************************************************************************

USER'S ROUTINES DESCRIPTION:

LCD_INIT() -----------> Initialize the LCD.
                        you must call it the first time you use the LCD
                        and before any other LCD routines.

LCD_CLEAR() ----------> Clears and Home LCD.

LCD_CMD('char') ------> Sends a command to the LCD.
                        See LCD datasheet for the complete commands list

LCD_GOTO(line,pos) ---> Set the Cursor to a specified Line and position.
                        Lines available are from 1 to 4. Pos available
                        starts from 1 to max available on your LCD.

LCD_PUTCH('char') ----> Writes a character on LCD (ASCII representation).

LCD_PUTS("string") ---> Writes a string on LCD.

LCD_PUTUN(number)  ---> Writes an Unsigned Number on LCD.
                        It works both with INT (16bit) and CHAR (8bit).

LCD_PUTSN(number)  ---> Writes a Signed Number on LCD (with Sign if <0).
                        It works both with INT (16bit) and CHAR (8bit).
                  
LCD_CUSTOMCHAR(pos,byte1,byte2,byte3,byte4,byte5,byte6,byte7,byte8) -->
                        customizes the character in the CGRAM at position (pos)
         bytes from 1 to 8 are the pattern of the new character.
         WARNING: this function can only used if the flag
         LCD_CANCUSTOMIZE is set to 1

************************************************************************

!!! ATTENTION !!!
Follow these simple instructions to configure your LCD module

1) check your hardware to determine which lines to use
    (you need 6 output lines).
2) set properly TRIS registers in your main code to configure
    the 6 lines as outputs.
3) In the next step use the defines to set the 6 lines as your
     hardware requires.
4) Set LCD Rows and Columns number using the define as shown
5) Set LCD cursor blinking and visibility as shown
6) You are ready...your LCD will work!!! :)

************************************************************************/


/************************************************************************
Use this includes if these files are not included in your main code
************************************************************************/
//#include "PIC.h"
//#include "delay.c"


/************************************************************************
Use the following defines to set the lines as your hardware requires
You can use ANY output line of the MCU, even on several ports :)
************************************************************************/
#define   LCD_RS   RD2   // Register select
#define   LCD_EN   RD3   // Enable
#define   LCD_D4   RD4   // LCD data 4
#define   LCD_D5   RD5   // LCD data 5
#define   LCD_D6   RD6   // LCD data 6
#define   LCD_D7   RD7   // LCD data 7

/************************************************************************
Now you have only to write LCD Rows and Columns number
and the cursor behaviour
/************************************************************************
!!! NOTE !!!
Some 1x16 LCD works as 2x8!!! ...be sure how to configure
yours, see its datasheet!!!
************************************************************************/

#define LCD_ROWS 1 // valid numbers are: 1,2 (set to 2 for 2 or more rows)
#define LCD_COLS 16 // valid numbers are: 8,16,20
#define LCD_CURSOR_VISIBLE 0 // 1:cursor on 0:cursor off
#define LCD_CURSOR_BLINK 0 // 1:cursor blinks 0:cursor doesn't blinks
#define LCD_TYPEWRITE 0 // 1:delay between characters
#define LCD_TW_DELAY 50 // milliseconds between characters

/************************************************************************
YOUR LCD IS NOW READY TO WORK!!! :)
YOU CAN IGNORE THE FOLLOWING CODE
ENJOY !!!
************************************************************************/

// define the right control value to set the cursor behavior
#if LCD_CURSOR_VISIBLE==1
   #if LCD_CURSOR_BLINK==1
   #define LCD_CONTROL 0b00001111
   #else
   #define LCD_CONTROL 0b00001110
   #endif
#else
   #define LCD_CONTROL 0b00001100
#endif

/************************************************************************
Use the following defines to send fast command to the LCD
Ex.: LCD_CMD(LCD_line2); will set the cursor on line 2
You can add fast command of your own!!!
*************************************************************************
!!! NOTE !!!
DON'T CHANGE THE DEFINES WITHIN #if-#endif
*************************************************************************/

#define LCD_CLR  0x01 // Clears Display
#define LCD_HOME 0x02 // Cursor to Home position

#define LCD_line1 0x80 // Cursor to Line 1 position 1
#define LCD_line2 0xC0 // Cursor to Line 2 position 1

#if (LCD_COLS==20)
   #define LCD_line3 0x94 // Cursror to Line 3 position 1 (20 char LCD)
   #define LCD_line4 0xD4 // Cursor to Line 4 position 1 (20 char LCD)
#else
   #define LCD_line3 0x90 // Cursor to Line 3 position 1 (16 char LCD)
   #define LCD_line4 0xD0 // Cursor to Line 4 position 1 (16 char LCD)
#endif

/************************************************************************/

/****************************************
Enable LCD to read data
*****************************************/
void LCD_STROBE (void)
   {
   LCD_EN = 1;
   DelayUs(1);
   LCD_EN=0;
   }   

/****************************************
Write a nibble to the LCD
****************************************/
void LCD_NIBBLE_OUT (unsigned char c)
   {
   if (c & 0b10000000)
      LCD_D7=1;
   else LCD_D7=0;
   
   if (c & 0b01000000)
      LCD_D6=1;
   else LCD_D6=0;

   if (c & 0b00100000)
      LCD_D5=1;
   else LCD_D5=0;

   if (c & 0b00010000)
      LCD_D4=1;
   else LCD_D4=0;

   LCD_STROBE();
   }

/****************************************
Write a byte to the LCD (4 bit mode)
****************************************/
void LCD_WRITE (unsigned char c)
   {
   LCD_NIBBLE_OUT(c);
   c <<= 4;
   LCD_NIBBLE_OUT(c);
   DelayUs(50);
   #if LCD_TYPEWRITE==1
   if (LCD_RS)
      {
      DelayMs(LCD_TW_DELAY); // Delay between characters
      }
   #endif
   }

/****************************************
Sends a command to the LCD
****************************************/
void LCD_CMD (char c)
   {
   LCD_RS = 0; // writes command
   LCD_WRITE(c);
   }

/****************************************
GoTo specified line and position
****************************************/
void LCD_GOTO (char line,char pos)
   {
   switch(line)
      {
      case 1: LCD_CMD((LCD_line1-1)+pos);
      break;
      
      case 2: LCD_CMD((LCD_line2-1)+pos);
      break;
      
      case 3: LCD_CMD((LCD_line3-1)+pos);
      break;
      
      case 4: LCD_CMD((LCD_line4-1)+pos);
      }
   }

/****************************************
Clears and Home LCD
*****************************************/
void LCD_CLEAR (void)
   {
   LCD_CMD(LCD_CLR);
   DelayMs(3);
   }

/****************************************
Writes one character (ASCII) to LCD
****************************************/
void LCD_PUTCH (char c)
   {
   LCD_RS = 1; // write characters
   LCD_WRITE(c);
   }

/****************************************
  Writes unsigned numbers to the LCD
*****************************************/
void LCD_PUTUN (unsigned int c)
   {
   unsigned char t1,i,wrote;
   unsigned int k;
   wrote=0;
   for (i=4;i>=1;i--)
      {
      switch(i)
         {
         case 4: k=10000;
         break;
   
         case 3: k=1000;
         break;
         
         case 2: k=100;
         break;
   
         case 1: k=10;
         }
      
      t1=c/k;
      
      if((wrote)||(t1!=0))
         {
         LCD_PUTCH(t1+'0');
         wrote=1;
         }
   
      c-=(t1*k);
      }

   LCD_PUTCH(c+'0');
   }

/****************************************
  Writes signed numbers to the LCD
*****************************************/
void LCD_PUTSN (signed int c)
   {
   if(c<0)
      {
      LCD_PUTCH('-');
      c*=(-1);
      }
   
   LCD_PUTUN(c);
   }

/****************************************
Writes a string to the LCD
****************************************/
void LCD_PUTS (const char * s)
   {
   LCD_RS = 1; // write characters
   while(*s)
      LCD_WRITE(*s++);
   }

/****************************************
Customizes the CGRAM characters (0-7)
****************************************/
void LCD_CUSTOMCHAR(unsigned char pos,unsigned char byte0,unsigned char byte1,unsigned char byte2,unsigned char byte3,unsigned char byte4,unsigned char byte5,unsigned char byte6,unsigned char byte7)
   {
   LCD_CMD(0b00001000); // display off
   LCD_CLEAR();
   LCD_CMD(64+(pos*8)); // goto the right CGRAM location
   LCD_PUTCH(byte0);
   LCD_PUTCH(byte1);
   LCD_PUTCH(byte2);
   LCD_PUTCH(byte3);
   LCD_PUTCH(byte4);
   LCD_PUTCH(byte5);
   LCD_PUTCH(byte6);
   LCD_PUTCH(byte7);
   LCD_CMD(LCD_CONTROL); // display on with preferred settings
   }

/****************************************
Initializes LCD
****************************************/   
void LCD_INIT (void)
   {
   
   LCD_RS = 0; // write control bytes
   DelayMs(50); // power on delay

   LCD_D4=1;
   LCD_D5=1;
   LCD_D6=0;
   LCD_D7=0;

   LCD_STROBE();
   DelayMs(6);

   LCD_STROBE();
   DelayUs(150);

   LCD_STROBE();
   DelayMs(6);

   LCD_D4=0; // set 4 bit mode
   LCD_STROBE();
   
   DelayUs(100);
   
   #if (LCD_ROWS==1)
      LCD_WRITE(0b00100000);   // 4 bit mode, 1 line, 5x8 font
   #else
      LCD_WRITE(0b00101000);   // 4 bit mode, 2 or more lines, 5x8 font
   #endif
   
   LCD_WRITE(0b00001000); // display off
   LCD_WRITE(0b00000000); // clear display
   LCD_WRITE(LCD_CONTROL); // display on, set the cursor behavior as specified
   LCD_WRITE(0b00000110); // entry mode, display not shifted, cursor increments
   }

/************************************************************************/
#undef LCD_ROWS
#undef LCD_COLS
#undef LCD_CURSOR_BLINK
#undef LCD_CURSOR_VISIBLE
/************************************************************************
!!! END !!!
THANKS FOR EXAMINING MY CODE ;)
/************************************************************************
**************************************


Spero di aver messo i codici correttamente ;)
Ultima modifica di Foto UtenteWALTERmwp il 24 ott 2014, 22:24, modificato 1 volta in totale.
Motivazione: Inseriti correttamente i delimitatori per il codice
Avatar utente
Foto Utenteanto2014
10 2
 
Messaggi: 14
Iscritto il: 16 mag 2014, 19:15

0
voti

[4] Re: [PIC16F877] Problema funzionamento LCD

Messaggioda Foto Utenteanto2014 » 24 ott 2014, 22:10

Scusatemi per lo smile che vola via è uscito casualmente #-o
Avatar utente
Foto Utenteanto2014
10 2
 
Messaggi: 14
Iscritto il: 16 mag 2014, 19:15

0
voti

[5] Re: [PIC16F877] Problema funzionamento LCD

Messaggioda Foto UtenteWALTERmwp » 24 ott 2014, 22:49

Hai inserito in modo errato il codice sorgente; comunque l'ho sistemato.
Per la prossima volta tieni presente che i tag(s) delimitatori, tra i quali puoi inserire (incollare, se vuoi) le righe del tuo software dopo averle copiate dal file, li faresti apparire nel tuo Post selezionando il rettangolino "Code" ...
img_code.JPG
img_code.JPG (6.76 KiB) Osservato 3179 volte
Per quanto riguarda l'eventuale schema è opportuno che questo, se lo si ritiene utile alla discussione, venga riportato in un Post tramite l'uso dello strumento che ti ho indicato; lo scarichi, lo scompatti in una directory (non necessita installazione) e lo usi.
In questo modo chi interviene nel thread ha la possibilità di apportare le modifiche del caso allo schema stesso riprendendolo nel proprio Post.
E' semplice ed intuitivo; tra l'altro, se sei abituato con autocad non dovresti avere alcuna difficoltà.

Saluti

p.s.
Solo un piccola anticipazione: per il fatto che "primi 8 caratteri spenti e i restanti 8 accesi" tieni presente che questi display se vengono solo alimentati (e non inizializzati) hanno questo tipo di comportamento.
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
23,6k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 6999
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

1
voti

[6] Re: [PIC16F877] Problema funzionamento LCD

Messaggioda Foto Utenteanto2014 » 25 ott 2014, 13:37

Grazie per tutte queste informazioni,

ho appena ultimato lo schema, ho anche ricontrollato tutti i collegamenti ma niente, sempre 8 caratteri spenti e 8 accesi:




Spero che qualcuno possa darmi una mano..
Avatar utente
Foto Utenteanto2014
10 2
 
Messaggi: 14
Iscritto il: 16 mag 2014, 19:15

0
voti

[7] Re: [PIC16F877] Problema funzionamento LCD

Messaggioda Foto UtenteWALTERmwp » 26 ott 2014, 22:39

Per quanto riguarda i tuoi riscontri sarebbe utile sapere esattamente cosa visualizzi quando scrivi ...
anto2014 ha scritto:-primi 8 caratteri spenti e i restanti 8 accesi
... anche una foto andrebbe bene (nel caso, inserirla seguendo le regole).

Per l'hardware, guardando lo schema, i collegamenti sembrano corretti; ti suggerisco comunque di riguardarli (anche se hai scritto di averli già controllati).
Per eliminare un dubbio: presumo che l'alimentazione del display e del micro sia la stessa (quindi anche lo zero è in comune).

Sul piano del software sarebbe utile trovare conferma, per la funzione DelayXX non visibile nel codice inserito nel Post, dell'ordine di grandezza richiamato dal mnemonico postfisso "XX".

Facendo riferimento alla funzione di inizializzazione del display stesso potresti spiegare il reiterato richiamo del ...
Codice: Seleziona tutto
LCD_STROBE();
DelayMs(6);
... (all'interno della "LCD_INIT();") a quale necessità risponde ?

Chiarito o precisato quanto sopra può essere di aiuto, per esempio, anche capire(o spiegare) per quale motivo all'interno della funzione "LCD_NIBBLE_OUT();" si ricorre alla "LCD_STROBE();" per un impulso di solo un microsecondo per la linea EN.

Intanto questo, poi vediamo.

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

0
voti

[8] Re: [PIC16F877] Problema funzionamento LCD

Messaggioda Foto Utenteanto2014 » 27 ott 2014, 11:42

Ciao,
grazie per aver analizzato il codice.
Prima venivano visualizzati solo quattro quadrati neri portando al max il contrasto.
Ti confermo che l' alimentazione del PICmicro e quella del display è la stessa. Per quanto riguarda l' impulso di 1us hai centrato il punto: anche io (non essendo tanto esperto con la programmazione) ho capito che qualcosa non andava, quindi ieri ho messo al posto di 1us un tempo molto lungo di 5ms.

In questo modo l lcd si inizializza e mostra i caratteri come dovrebbero essere, l' inconveniente è che comunque mostra solo i primi otto "almeno so che funziona", non ci ho lavorato più da ieri quindi oggi cercherò il modo di farlo funzionare per intero.

Se ho bisogno poi chiederò ancora nel forum :)
Avatar utente
Foto Utenteanto2014
10 2
 
Messaggi: 14
Iscritto il: 16 mag 2014, 19:15

0
voti

[9] Re: [PIC16F877] Problema funzionamento LCD

Messaggioda Foto UtenteWALTERmwp » 27 ott 2014, 11:50

anto2014 ha scritto:Se ho bisogno poi chiederò ancora nel forum
... a prescindere dalle tue necessità penso sarebbe gradito, anche agli utenti che hanno letto il thread, sapere poi come risolvi la questione.
Diversamente ... saremo qua ...

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

0
voti

[10] Re: [PIC16F877] Problema funzionamento LCD

Messaggioda Foto Utenteanto2014 » 27 ott 2014, 11:55

Beh.. questo è ovvio,

avrei dovuto "forse" specificarlo.. avrete mie notizie :) grazie ancora per l' interessamento.
Avatar utente
Foto Utenteanto2014
10 2
 
Messaggi: 14
Iscritto il: 16 mag 2014, 19:15

Prossimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti