display 16x2 I2C

  • x206
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
5 Anni 1 Mese fa - 5 Anni 1 Mese fa #1 da x206
display 16x2 I2C è stato creato da x206
Salve,

oggi ho provato a collegare un display lcd 16x2 con modulo I2C e chip integrato PCF8574T, ho

realizzato un semplice programma per visualizzare una scritta ma niente da fare non ci sono

riuscito, utilizzando la libreria LaurTec_PIC_libraries_v_3.3.1 nel file "LCD_44780_I2C.h" ho

provato sia l'impostazione per PCF8574 che PCF8574A ottenendo lo stesso risultato di display

vuoto. Il debug si ferma alla riga LCD_initialize(20). Vi posto il codice
Code:
#include <xc.h> #include <i2c.h> #include <PIC18f4550_config.h> #include "LCD_44780_I2C.h" #include "LCD_44780_I2C.c" #include "PCF8574.h" #include "PCF8574.c" #include "delay.h" #include "delay.c" void board_initialization (void); void main (void){ board_initialization (); // Inizializza il modulo I2C a 100KHz @20MHz OpenI2C(MASTER, SLEW_OFF); SSPADD = 49; // Inizializzo il display LCD con quarzo a 20MHz LCD_initialize (20); LCD_backlight (LCD_TURN_OFF_LED); LCD_write_message ("Hello"); goto_line_LCD (2); LCD_write_message ("World!"); // Ciclo infinito while (1) { } } void board_initialization (void){ // Imposto PORTA tutti ingressi LATA = 0x00; TRISA = 0xFF; // Imposto PORTB tutti ingressi LATB = 0x00; TRISB = 0xFF; // Imposto PORTC tutti ingressi LATC = 0x00; TRISC = 0xFF; // Imposto PORTD tutti ingressi LATD = 0x00; TRISD = 0xFF; // Imposto PORTE tutti ingressi LATE = 0x00; TRISE = 0xFF; //Attivo i restitori di pull-up su PORTB INTCON2bits.RBPU = 0; }

Saluti
Luca
Ultima Modifica 5 Anni 1 Mese fa da x206.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
5 Anni 4 Settimane fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic display 16x2 I2C
Salve Luca,

ci sono troppe variabili in gioco.

Potresti fare prima una prova con gli esempi del PCF8574?

In particolare cerca di migrare alle nuove librerie LTlib che hanno diversi esempi.

Hai un oscilloscopio con cui controllare il bus I2C?

Il problema è che ci sono diversi collegamenti con i fili e devi accertarti che il PCF risponde sul bus.

Saluti,

mauro

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • x206
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
5 Anni 4 Settimane fa - 5 Anni 4 Settimane fa #3 da x206
Risposta da x206 al topic display 16x2 I2C
Salve Mauro,

non posso provare gli esempi del PCF8574 perchè è integrato in un modulo del quale non riesco a reperire il

datasheet, inoltre non posseggo un oscilloscopio, di seguito inserisco il link del modulo che sto usando

LCD_I2C

ho provato ad usare le LTlib 5 per quel poco che ci ho capito :lol: ottenendo questo codice
Code:
#include <xc.h> #include "LTlib.h" #include "LTlib_utilities.h" #include "LTlib_utilities.c" #include "module_IO.h" #include "module_IO.c" #include "module_I2C.h" #include "module_I2C.c" #include "LTlib_delay.h" #include "LTlib_delay.c" #include "MCP2300x.h" #include "MCP2300x.c" #include "LCD_44780_I2C.h" #include "LCD_44780_I2C.c" #include "PCF8574.h" #include "PCF8574.c" void board_initialization (void); void main (void){ board_initialization (); I2C1_open (I2C_MASTER); I2C1_baud_rate (100); PCF8574_initialize(100); // Inizializzo il display LCD con quarzo a 20MHz LCD_initialize (20); LCD_backlight (LCD_TURN_ON_LED); LCD_goto_line (1); LCD_write_message ("Hello"); LCD_goto_line (2); LCD_write_message ("World!"); // Ciclo infinito while (1) { } } void board_initialization (void){ // Imposto PORTA tutti ingressi LATA = 0x00; TRISA = 0xFF; // Imposto PORTB tutti ingressi LATB = 0x00; TRISB = 0xFF; // Imposto PORTC tutti ingressi LATC = 0x00; TRISC = 0xFF; // Imposto PORTD tutti ingressi LATD = 0x00; TRISD = 0xFF; // Imposto PORTE tutti ingressi LATE = 0x00; TRISE = 0xFF; //Attivo i restitori di pull-up su PORTB INTCON2bits.RBPU = 0; }

al PIC sono solo collegati 4 fili, 2 per l'alimentazione del display

e due per le linee SDA e SDL

Saluti
Luca
Ultima Modifica 5 Anni 4 Settimane fa da x206.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • x206
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
5 Anni 4 Settimane fa - 5 Anni 3 Settimane fa #4 da x206
Risposta da x206 al topic display 16x2 I2C
Salve,

oggi ho trovato questo Link

dove dice che l'indirizzo i2c predefinito del modulo che sto usando è lo 0x27, dove posso trovare quello impostato

nella libreria? ho provato a spulciare ma non sono sicuro, all'interno della libreria <I2C.h> c'è un define SLAVE_7, è

corretto?

Grazie

Luca
Ultima Modifica 5 Anni 3 Settimane fa da x206.

Si prega Accesso o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
5 Anni 3 Settimane fa #5 da Mauro Laurenti
Risposta da Mauro Laurenti al topic display 16x2 I2C
Un esempio dovrebbe essere questo:
Code:
//****************************************************************************** // The software writes "Hello World" to the LCD. // The LCD must be connected as specified in the library included above. // // // Tested Platform: Freedom III // Tested MCU: PIC18F46K22 // Tested Compiler: XC8 2.05 //****************************************************************************** #include <xc.h> #include "LTlib.h" #include "LTlib_utilities.h" #include "LTlib_utilities.c" #include "module_IO.h" #include "module_IO.c" #include "module_I2C.h" #include "module_I2C.c" #include "LTlib_delay.h" #include "LTlib_delay.c" #include "PCF8574.h" #include "PCF8574.c" #define PCF8574 #include "LCD_44780_I2C.h" #include "LCD_44780_I2C.c" void main(void) { IO_set_all_ports_as_inputs(); LCD_initialize(20); LCD_write_message(" Hello World"); LCD_backlight(LCD_TURN_ON_LED); while(1); }

poi devi aprire il file LCD:44780_I2C.h e modificare le seguenti linee:
Code:
//************************************************** // LCD constants // Each bit is connected to the PCF8574/MC23008 //************************************************** // Standard LaurTec Definition #define LCD_D0 1 #define LCD_D1 2 #define LCD_D2 4 #define LCD_D3 8 #define LCD_E 16 #define LCD_RW 32 #define LCD_RS 64 #define LCD_LED 128 //PCF8574 LCD module adapter layout (may differ from product to product) //#define LCD_D0 16 //#define LCD_D1 32 //#define LCD_D2 64 //#define LCD_D3 128 //#define LCD_E 4 //#define LCD_RW 2 //#define LCD_RS 1 //#define LCD_LED 8

in
Code:
//************************************************** // LCD constants // Each bit is connected to the PCF8574/MC23008 //************************************************** // Standard LaurTec Definition //#define LCD_D0 1 //#define LCD_D1 2 //#define LCD_D2 4 //#define LCD_D3 8 //#define LCD_E 16 //#define LCD_RW 32 //#define LCD_RS 64 //#define LCD_LED 128 //PCF8574 LCD module adapter layout (may differ from product to product) #define LCD_D0 16 #define LCD_D1 32 #define LCD_D2 64 #define LCD_D3 128 #define LCD_E 4 #define LCD_RW 2 #define LCD_RS 1 #define LCD_LED 8

L'indirizzo del modulo dipende dai resistori montati sulla schedina.
sono collegati alle linee A0, A1, A2.

L'indirizzo lo puoi cambiare sempre nello stesso file modificando il seguente codice con il tuo indirizzo.
Code:
//PCF8574 #ifdef PCF8574 #define DEVICE_ADDRESS_H 0x40 #define DEVICE_ADDRESS_L 0x00 #define PCF8574_GENERIC #endif //PCF8574A #ifdef PCF8574A #define DEVICE_ADDRESS_H 0x70 #define DEVICE_ADDRESS_L 0x00 #define PCF8574_GENERIC #endif


Le modifiche precedenti creano i relativi collegamenti tra i pin del PCF8574 e il modulo LCD.

Saluti,

Mauro

Si prega Accesso o Crea un account a partecipare alla conversazione.

Moderatori: Mauro LaurentiPinnaStefAMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Forum - Ultimi messaggi