Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema con display HD44780

Tipologie, strumenti di sviluppo, hardware e progetti

Moderatore: Foto UtentePaolino

2
voti

[21] Re: Problema con display HD44780

Messaggioda Foto UtentePaolino » 4 mar 2013, 21:42

Non riesco a trovare il tempo per scrivere un articolo decente, pertanto ti dò qualche dritta.
Prova a modificare il codice delle inizializzazioni in questo modo:

Codice: Seleziona tutto
#define   LCD_RS   PORTAbits.RA0   // Register select
#define   LCD_EN   LATAbits.RA1   // Enable
#define   LCD_D4   LATAbits.RA2   // LCD data 4
#define   LCD_D5   LATAbits.RA3   // LCD data 5
#define   LCD_D6   LATAbits.RA4   // LCD data 6
#define   LCD_D7   LATAbits.RA5   // LCD data 7


A questo punto il tuo codice dovrebbe funzionare senza alcuna altra modifica.

Fammi sapere.

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,2k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4203
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[22] Re: Problema con display HD44780

Messaggioda Foto Utenteangelorosso » 5 mar 2013, 14:28

avevo già provato ad impostare il registro LAT anzichè PORT ma nulla, al momento il mio codice è il seguente
Codice: Seleziona tutto
/*************************************************

//
// Autore: Angelo Fracanzino
// Data: 15-01-2013

Delay1KTCYx (1); equivale a 1 ms

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

 
#include <htc.h>
#include "xlcd.h"
#include <delays.h>
   
main () {
 
        ADCON1 = 0b11111111;
      ADCON0 = 0b00000000;
      OSCCON = 0b01101011;
        TRISA = 0; 
        TRISB = 0;
        LATA = 0;
        LATB = 0;
       
      Delay1KTCYx(15);
    OpenXLCD(FOUR_BIT & LINES_5X7);
 
   WriteCmdXLCD(CLEAR);
     
 
      } //Fine main

void DelayFor18TCY( void )
{
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
}
void DelayPORXLCD (void)
{
  Delay1KTCYx(15); // Delay of 15ms
                   // Cycles = (TimeDelay * Fosc) / 4
                   // Cycles = (15ms * 16MHz) / 4
                   // Cycles = 60,000
  return;
}
void DelayXLCD (void)
{
  Delay1KTCYx(5); // Delay of 5ms
                   // Cycles = (TimeDelay * Fosc) / 4
                   // Cycles = (5ms * 16MHz) / 4
                   // Cycles = 20,000
  return;
}


mentre l'header della libreria è questo

Codice: Seleziona tutto
#ifndef __XLCD_H
#define __XLCD_H
#include "p18cxxx.h"
/* PIC18 XLCD peripheral routines.
*
*   Notes:
*      - These libraries routines are written to support the
*        Hitachi HD44780 LCD controller.
*      - The user must define the following items:
*          - The LCD interface type (4- or 8-bits)
*          - If 4-bit mode
*              - whether using the upper or lower nibble
*          - The data port
*              - The tris register for data port
*              - The control signal ports and pins
*              - The control signal port tris and pins
*          - The user must provide three delay routines:
*              - DelayFor18TCY() provides a 18 Tcy delay
*              - DelayPORXLCD() provides at least 15ms delay
*              - DelayXLCD() provides at least 5ms delay
*/

/* Interface type 8-bit or 4-bit
* For 8-bit operation uncomment the #define BIT8
*/
/* #define BIT8 */

/* When in 4-bit interface define if the data is in the upper
* or lower nibble.  For lower nibble, comment the #define UPPER
*/
/* #define UPPER */

/* DATA_PORT defines the port to which the LCD data lines are connected */
#define DATA_PORT            PORTB
#define TRIS_DATA_PORT       TRISB

/* CTRL_PORT defines the port where the control lines are connected.
* These are just samples, change to match your application.
*/
#define RW_PIN   LATAbits.LATA1         /* PORT for RW */
#define TRIS_RW  TRISAbits.TRISA1       /* TRIS for RW */

#define RS_PIN   LATAbits.LATA0         /* PORT for RS */
#define TRIS_RS  TRISAbits.TRISA0       /* TRIS for RS */

#define E_PIN    LATAbits.LATA2        /* PORT for E  */
#define TRIS_E   TRISAbits.TRISA2       /* TRIS for E  */

/* Display ON/OFF Control defines */
#define DON         0b00001111  /* Display on      */
#define DOFF        0b00001011  /* Display off     */
#define CURSOR_ON   0b00001111  /* Cursor on       */
#define CURSOR_OFF  0b00001101  /* Cursor off      */
#define BLINK_ON    0b00001111  /* Cursor Blink    */
#define BLINK_OFF   0b00001110  /* Cursor No Blink */

/* Cursor or Display Shift defines */
#define SHIFT_CUR_LEFT    0b00000100  /* Cursor shifts to the left   */
#define SHIFT_CUR_RIGHT   0b00000101  /* Cursor shifts to the right  */
#define SHIFT_DISP_LEFT   0b00000110  /* Display shifts to the left  */
#define SHIFT_DISP_RIGHT  0b00000111  /* Display shifts to the right */

/* Function Set defines */
#define FOUR_BIT   0b00101100  /* 4-bit Interface               */
#define EIGHT_BIT  0b00111100  /* 8-bit Interface               */
#define LINE_5X7   0b00110000  /* 5x7 characters, single line   */
#define LINE_5X10  0b00110100  /* 5x10 characters               */
#define LINES_5X7  0b00111000  /* 5x7 characters, multiple line */

#ifdef _OMNI_CODE_
#define PARAM_SCLASS
#else
#define PARAM_SCLASS auto
#endif

/* OpenXLCD
* Configures I/O pins for external LCD
*/
void OpenXLCD(PARAM_SCLASS unsigned char);

/* SetCGRamAddr
* Sets the character generator address
*/
void SetCGRamAddr(PARAM_SCLASS unsigned char);

/* SetDDRamAddr
* Sets the display data address
*/
void SetDDRamAddr(PARAM_SCLASS unsigned char);

/* BusyXLCD
* Returns the busy status of the LCD
*/
unsigned char BusyXLCD(void);

/* ReadAddrXLCD
* Reads the current address
*/
unsigned char ReadAddrXLCD(void);

/* ReadDataXLCD
* Reads a byte of data
*/
char ReadDataXLCD(void);

/* WriteCmdXLCD
* Writes a command to the LCD
*/
void WriteCmdXLCD(PARAM_SCLASS unsigned char);

/* WriteDataXLCD
* Writes a data byte to the LCD
*/
void WriteDataXLCD(PARAM_SCLASS char);

/* putcXLCD
* A putc is a write
*/
#define putcXLCD WriteDataXLCD

/* putsXLCD
* Writes a string of characters to the LCD
*/
void putsXLCD(PARAM_SCLASS char *);

/* putrsXLCD
* Writes a string of characters in  to the LCD
*/
void putrsXLCD(const char *);

/* User defines these routines according to the oscillator frequency */
extern void DelayFor18TCY(void);
extern void DelayPORXLCD(void);
extern void DelayXLCD(void);

#endif


I miei dubbi sono i seguenti:
- forse sbaglio nella dichiarazione iniziale in OpenXLCD perché non so quale sia la parola giusta per indicare i bit da D4 a D7, ho provato "UPPER", "XLCD_UPPER" e "XLCDUPPER"
- ho controllato il mio display da 2x16 righe, ogni carattere è 5*8 pixel mentre nella libreria è previsto solo il formato 5*7, come è possibile?
- dite che faccio prima a testare il funzionamento a 8 bit?
Avatar utente
Foto Utenteangelorosso
40 3
New entry
New entry
 
Messaggi: 61
Iscritto il: 17 lug 2011, 22:36

0
voti

[23] Re: Problema con display HD44780

Messaggioda Foto Utenteangelorosso » 5 mar 2013, 18:44

Ho provato ad utilizzare il bus dati a 8bit mettendo nei parametri d'inizializzazione "OpenXLCD(EIGHT_BIT & LINES_5X7);

Niente da fare :? "
Avatar utente
Foto Utenteangelorosso
40 3
New entry
New entry
 
Messaggi: 61
Iscritto il: 17 lug 2011, 22:36

1
voti

[24] Re: Problema con display HD44780

Messaggioda Foto UtentePaolino » 5 mar 2013, 21:52

Mah, io mi sono scritto 4 righe di codice e con il mio PIC18F2520 non ho problemi.
Perché devi usare la libreria xlcd? Prova con il codice che hai indicato nel promo post, impiegando 4 bit e LAT al posto di PORT.

Fammi sapere.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,2k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4203
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[25] Re: Problema con display HD44780

Messaggioda Foto Utenteangelorosso » 6 mar 2013, 7:57

davvero??? e io che mi ero fissato che xlcd.h è fatto per PIC18 mentre l'altra libreria non poteva funzionare #-o

appena possibile proverò.

Una domanda: sul mio PIC18F1320 ho impostato l'oscillatore interno a 4 MHz impostando OSCCON "0b01100110".

Non ho ben capito a cosa servono i 2 bit
- OSTS: Oscillator Start-up Time-out Status bit
1 = Oscillator Start-up Timer time-out has expired; primary oscillator is running
0 = Oscillator Start-up Timer time-out is running; primary oscillator is not ready

e

- IOFS: INTOSC Frequency Stable bit
1 = INTOSC frequency is stable
0 = INTOSC frequency is not stable

Sono andato "ad intuito" impostandoli rispettivamente 0 & 1... ?%
Avatar utente
Foto Utenteangelorosso
40 3
New entry
New entry
 
Messaggi: 61
Iscritto il: 17 lug 2011, 22:36

1
voti

[26] Re: Problema con display HD44780

Messaggioda Foto UtentePaolino » 6 mar 2013, 21:46

Si tratta di due bit a sola lettura. Il core del microcontrollore li pone a 1 in base a:
OSTS: quando l'oscillatore principale è avviato
IOFS: quando la frequenza selezionata è stabile.

In fase di preparazione del registro OSCCON, li puoi porre a 0 o a 1, indifferentemente. Il micro ne ignorerà il valore scritto da te (in effetti non verrà scritto alcun valore).

Ciao.

Paolo.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong

-------------------------------------------------------------

PIC Experience - http://www.picexperience.it
Avatar utente
Foto UtentePaolino
32,2k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 4203
Iscritto il: 20 gen 2006, 11:42
Località: Vigevano (PV)

0
voti

[27] Re: Problema con display HD44780

Messaggioda Foto Utenteangelorosso » 7 mar 2013, 17:49

ecco perché mi lasciavano perplesso, non afferravo il concetto al 100% :evil:

Ho provato come mi hai detto e non funziona, quindi mi sono intestardito e ho fatto dei test partendo dallo zero assoluto:
- ho verificato tutti i contatti elettrici affinchè siano davvero efficienti
- ho provato un'altra zona della breadboard, magari quella attualmente utilizzata fosse difettosa
- sono partito con un programmino che mi fa lampeggiare un led in tutte le porte
Codice: Seleziona tutto
#include <htc.h>

#include <delays.h>


   
main () {
 
       
      ADCON0 = 0b00000000;
      OSCCON = 0b01101110;
      INTCON = 0;
        TRISA = 0; 
        TRISB = 0;
         
 
               
      while (1)
               {
                  PORTA=0B11111111;
                  PORTB=0B11111111;
                  Delay10KTCYx(100);
                  PORTA=0;;
                  PORTB=0;
                  Delay10KTCYx(100);
                                   }
                                    } //Fine main

Il risultato è che non tutte le porte commutano correttamente fra 0 ed 1. In dettaglio non funzionano i PIN 3,4,8, che sarebbero RA4, RA5, RB0 (ho ovviamente provato a disattivare interruzioni, A\D, PWM)

Ho allora fatto un debug , vi allego una immagine del risultato dopo le istruzioni PORTA=1 e PORTB=1

anche qui si vede che c'è qualche problema, ma discorda coi testi pratici.

dite che devo sostituire il PIC?
Allegati
Cattura.PNG
Cattura.PNG (8.08 KiB) Osservato 1630 volte
Avatar utente
Foto Utenteangelorosso
40 3
New entry
New entry
 
Messaggi: 61
Iscritto il: 17 lug 2011, 22:36

0
voti

[28] Re: Problema con display HD44780

Messaggioda Foto Utenteangelorosso » 9 mar 2013, 20:12

Una situazione davvero surreale :shock:

Ho impostato questo programmino per inizializzare il display e scrivere "ciao"
Codice: Seleziona tutto
#include <htc.h>
#include <delays.h>
#include "lcd.c"



void main ()

{
   TRISB=0;
   PORTB=0;
   TRISA=0;
   PORTA=0;
   OSCCON=0b01100110;
   ADCON0=0;
   
LCD_INIT();
LCD_GOTO(1,1);
LCD_PUTS("ciao");

                                  } //Fine main


usando la libreria lcd.c suggerita da Paolino, ora il display non ha più la riga in basso con tutti i pixel accesi (ergo si inizializza) ma il display non visualizza la scritta!
Non c'è uno strumento di debug per simulare il circuito con PIC e display HD44780?
Avatar utente
Foto Utenteangelorosso
40 3
New entry
New entry
 
Messaggi: 61
Iscritto il: 17 lug 2011, 22:36

0
voti

[29] Re: Problema con display HD44780

Messaggioda Foto UtenteJAndrea » 9 mar 2013, 20:50

Forse ho trovato l' errore, nonostante la documentazione da me trovata, il DISPLAYTECH 162B non monta controller HITACHI, bensì st7066.
Adesso proverò a riscrivere il programma alla luce di questa scoperta.
Avatar utente
Foto UtenteJAndrea
2.952 2 5 9
Master
Master
 
Messaggi: 1594
Iscritto il: 16 giu 2011, 15:25
Località: Rovigo

0
voti

[30] Re: Problema con display HD44780

Messaggioda Foto UtenteTardoFreak » 10 mar 2013, 3:16

No [-X , non ci siamo proprio, qui c'è un errore concettuale gravissimo.
Non puoi fare un programma sperando che questo si fermi alla fine perché dai per scontato che un programma abbia un inzio ed una fine.
I programmi per i microcontrollori non si scrivono così.
Non basta scrivere un commento "fine main" per immaginare che il programma di debba ... fermare senza problemi e finirla lì.
I programmi per i micro non si possono fermare così, alla cavolo! [-X
Ti suggerisco di leggerti questo articolo.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
Avatar utente
Foto UtenteTardoFreak
73,4k 8 12 13
-EY Legend-
-EY Legend-
 
Messaggi: 15764
Iscritto il: 16 dic 2009, 11:10
Località: Torino - 3° pianeta del Sistema Solare

PrecedenteProssimo

Torna a Realizzazioni, interfacciamento e nozioni generali.

Chi c’è in linea

Visitano il forum: Nessuno e 13 ospiti