- Messaggi: 38
- Ringraziamenti ricevuti 2
Lettura caratteri con PCF8574
12 Anni 9 Mesi fa #6
da Ale_Pic
Risposta da Ale_Pic al topic Re: Lettura caratteri con PCF8574
ah ok. Avcevo capito che inviavi una lettera da visualizzare al display ma quando andavi a leggerla non corrispondeva... Era il caso di leggermi meglio il sorgente. In questo caso non so come aiutarti
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Ale_Pic
- Junior Member
Riduci
Di più
12 Anni 9 Mesi fa #7
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
Risposta da Pinna al topic Re: Lettura caratteri con PCF8574
PROBLEMA RISOLTO: un maledetto falso contatto sulla breadboard..... un giorno perso
Chi vola vale, chi vale vola, chi non vola è un vile
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Pinna
- Autore della discussione
- Moderator
Riduci
Di più
- Messaggi: 1010
- Ringraziamenti ricevuti 107
12 Anni 8 Mesi fa #8
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
Risposta da Pinna al topic Re: Lettura caratteri con PCF8574
Ciao a tutti. Mi trovo davanti un grosso problema e non riesco a capirne l'origine: ho collegato la freedom al pcf8574 tramite il connettore di espansione, seguendo lo schema presente nel tutorial di Mauro, (esattamente la figura 5), ma senza i led perchè non mi servono. Modificando quelli della libreria Laurtec, ho creato due sorgenti di prova: il primo mi legge un carattere, il secondo un array di 16 caratteri (quanto una riga del display lcd). Con il primo programma (char) non ci sono problemi, nel senso che l'indirizzo dell'expander (0x40) viene riconosciuto perfettamente e se lo cambio via software o fisicamente, senza ricostruire il programma, ottengo caratteri strani nel display. Stessa cosa se estraggo il pcf dal circuito (prova necessaria, come si vedrà continuando a leggere). Invece, con il secondo sorgente (array), la stringa di sedici caratteri che vado a scrivere mi viene sempre riconosciuta senza errori, a prescindere dal fatto che io modifichi l'indirizzo via software, hardware o levi l'expander dal circuito. Ho provato addirittura a sostituire il pcf8574 con il pcf8574A lasciando inalterato l'indirizzo 0x40 ed ottengo sempre la stessa cosa: la stringa viene visualizzata correttamente. Pensando che, per qualche impossibile motivo, la eeprom a bordo della freedom potesse in qualche modo interferire ne ho letto il contenuto: non è lei la causa e d'altronde, se lo fosse, logica vuole che dovrebbe interferire in entrambi i casi. In parole povere, se scrivo un solo carattere (primo sorgente), sono sicuro al 100% che sta comunicando solo con il pcf mentre se scrivo una stringa qualunque di sedici caratteri (secondo sorgente) l'expander viene ignorato e la stringa alloggiata da qualche altra parte. Sicuramente l'errore sta tra le righe di quest'ultimo sorgente solo che io, sarà la stanchezza, non riesco a vederlo anzi, a livello concettuale, mi sembra corretto. In ogni casi li allego entrambi sperando che qualcuno abbia qualche idea e mi faccia notare dove, sicuramente, sto sbagliando:
PRIMO SORGENTE: CHAR
#include <p18f4550.h>
#include "PCF8574.c"
#define LCD_DEFAULT
#include "LCD_44780.h"
#include "delay.h"
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilito il watchdog timer
//LVP = OFF Disabilito programmazione LVP
//PBADEN = OFF Disabilito gli ingressi analogici
void main (void){
// Variabile per salvare il dato di ritorno
unsigned char data = 0;
// Imposto PORTA tutti ingressi
LATA = 0x00;
TRISA = 0xFF;
// Imposto PORTB tutti ingressi
LATB = 0x00;
TRISB = 0xFF;
// Imposto PORTC tutti ingressi, RC1 come output
LATC = 0x00;
TRISC = 0b11111101;
// Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0x00;
// Imposto PORTE tutti ingressi
LATE = 0x00;
TRISE = 0xFF;
// Imposto il quarzo per la libreria delay
setQuartz (20);
// Inizializza il modulo I2C a 400KHz @20MHz
OpenI2C(MASTER, SLEW_OFF);
SSPADD = 49;
/****************************************************************************************************/
OpenLCD (20);
BacklightLCD (TURN_ON);
/*********************************** SCRITTURA ****************************************************/
// Scrivo il dato nell'IO expander
PCF8574_write_data (0x40, 'S');
/*********************************** LETTURA ****************************************************/
// Leggo il dato dall' IO expander
PCF8574_read_data (0x40, &data);
WriteCharLCD (data);
LATD = data;
// Ciclo infinito
while (1) {
}
}
SECONDO SORGENTE: ARRAY
#include <p18f4550.h>
#include "PCF8574.c"
#define LCD_DEFAULT
#include "LCD_44780.h"
#include "delay.h"
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilito il watchdog timer
//LVP = OFF Disabilito programmazione LVP
//PBADEN = OFF Disabilito gli ingressi analogici
void main (void){
// Variabile per ciclo for
unsigned char i = 0;
// Definizione della stringa (16 caratteri)
unsigned char data [] ="WRITE COMPLETED";
// Imposto PORTA tutti ingressi
LATA = 0x00;
TRISA = 0xFF;
// Imposto PORTB tutti ingressi
LATB = 0x00;
TRISB = 0xFF;
// Imposto PORTC tutti ingressi, RC1 come output
LATC = 0x00;
TRISC = 0b11111101;
// Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0x00;
// Imposto PORTE tutti ingressi
LATE = 0x00;
TRISE = 0xFF;
// Imposto il quarzo per la libreria delay
setQuartz (20);
// Inizializza il modulo I2C a 400KHz @20MHz
OpenI2C(MASTER, SLEW_OFF);
SSPADD = 49;
/****************************************************************************************************/
OpenLCD (20);
BacklightLCD (TURN_ON);
for (i = 0; i < 16; i++) {
/*********************************** SCRITTURA ****************************************************/
// Scrivo il dato nell'IO expander
//PCF8574_write_data (0x40, &data); // l'operatore & è ininfluente
// Scrivo il dato nell'IO expander
PCF8574_write_data (0x40, data);
/*********************************** LETTURA ****************************************************/
// Leggo il dato dall' IO expander
PCF8574_read_data (0x40, data);
WriteCharLCD (data);
}
// Ciclo infinito
while (1) {
}
}
PRIMO SORGENTE: CHAR
#include <p18f4550.h>
#include "PCF8574.c"
#define LCD_DEFAULT
#include "LCD_44780.h"
#include "delay.h"
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilito il watchdog timer
//LVP = OFF Disabilito programmazione LVP
//PBADEN = OFF Disabilito gli ingressi analogici
void main (void){
// Variabile per salvare il dato di ritorno
unsigned char data = 0;
// Imposto PORTA tutti ingressi
LATA = 0x00;
TRISA = 0xFF;
// Imposto PORTB tutti ingressi
LATB = 0x00;
TRISB = 0xFF;
// Imposto PORTC tutti ingressi, RC1 come output
LATC = 0x00;
TRISC = 0b11111101;
// Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0x00;
// Imposto PORTE tutti ingressi
LATE = 0x00;
TRISE = 0xFF;
// Imposto il quarzo per la libreria delay
setQuartz (20);
// Inizializza il modulo I2C a 400KHz @20MHz
OpenI2C(MASTER, SLEW_OFF);
SSPADD = 49;
/****************************************************************************************************/
OpenLCD (20);
BacklightLCD (TURN_ON);
/*********************************** SCRITTURA ****************************************************/
// Scrivo il dato nell'IO expander
PCF8574_write_data (0x40, 'S');
/*********************************** LETTURA ****************************************************/
// Leggo il dato dall' IO expander
PCF8574_read_data (0x40, &data);
WriteCharLCD (data);
LATD = data;
// Ciclo infinito
while (1) {
}
}
SECONDO SORGENTE: ARRAY
#include <p18f4550.h>
#include "PCF8574.c"
#define LCD_DEFAULT
#include "LCD_44780.h"
#include "delay.h"
#pragma config FOSC = HS
#pragma config WDT = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
//OSC = HS Impostato per lavorare ad alta frequenza
//WDT = OFF Disabilito il watchdog timer
//LVP = OFF Disabilito programmazione LVP
//PBADEN = OFF Disabilito gli ingressi analogici
void main (void){
// Variabile per ciclo for
unsigned char i = 0;
// Definizione della stringa (16 caratteri)
unsigned char data [] ="WRITE COMPLETED";
// Imposto PORTA tutti ingressi
LATA = 0x00;
TRISA = 0xFF;
// Imposto PORTB tutti ingressi
LATB = 0x00;
TRISB = 0xFF;
// Imposto PORTC tutti ingressi, RC1 come output
LATC = 0x00;
TRISC = 0b11111101;
// Imposto PORTD tutte uscite
LATD = 0x00;
TRISD = 0x00;
// Imposto PORTE tutti ingressi
LATE = 0x00;
TRISE = 0xFF;
// Imposto il quarzo per la libreria delay
setQuartz (20);
// Inizializza il modulo I2C a 400KHz @20MHz
OpenI2C(MASTER, SLEW_OFF);
SSPADD = 49;
/****************************************************************************************************/
OpenLCD (20);
BacklightLCD (TURN_ON);
for (i = 0; i < 16; i++) {
/*********************************** SCRITTURA ****************************************************/
// Scrivo il dato nell'IO expander
//PCF8574_write_data (0x40, &data); // l'operatore & è ininfluente
// Scrivo il dato nell'IO expander
PCF8574_write_data (0x40, data);
/*********************************** LETTURA ****************************************************/
// Leggo il dato dall' IO expander
PCF8574_read_data (0x40, data);
WriteCharLCD (data);
}
// Ciclo infinito
while (1) {
}
}
Chi vola vale, chi vale vola, chi non vola è un vile
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Pinna
- Autore della discussione
- Moderator
Riduci
Di più
- Messaggi: 1010
- Ringraziamenti ricevuti 107
12 Anni 8 Mesi fa #9
da Pinna
Chi vola vale, chi vale vola, chi non vola è un vile
Risposta da Pinna al topic Re: Lettura caratteri con PCF8574
ho provato nuovamente i due sorgenti su un'altra demoboard provvista solo del 18f4550, il quarzo con i condensatori, la resistenza su mclr e le uscite per le porte: il comportamento è identico. Il primo sorgente (char) risente dei vari cambiamenti hardware o software, il secondo se ne frega altamente. Anche resettando o spegnendo tutto, cambiando la stringa, ricostruendo il progetto e programmando con il nuovo file hex, cambiando l'indirizzo via hardware o levando l'expander, la scritta è esatta al 100%. E' come se la memorizzasse nel pic e bypassasse la comunicazione I2C con il pcf8574. Sono veramente confuso...
Chi vola vale, chi vale vola, chi non vola è un vile
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Pinna
- Autore della discussione
- Moderator
Riduci
Di più
- Messaggi: 1010
- Ringraziamenti ricevuti 107
12 Anni 8 Mesi fa - 12 Anni 8 Mesi fa #10
da gcupini
Risposta da gcupini al topic Re: Lettura caratteri con PCF8574
ciao,
Se non capisco male, il secondo programma ti stampa sempre su LCD la stringa anche se cambi indirizzo o togli l'expander.
Dal codice è evidente che tu assegni all'array data [] ="WRITE COMPLETED";
poi esegui una serie di istruzioni di scrittura e lettura sull'expander e infine
scrivi nel ciclo WriteCharLCD (data);
E' evidente che l'array è memorizzato nella RAM del PIC e quindi viene stampato su LCD.
Questo significa che l'istruzione di lettura dall'expander NON PRODUCE EFFETTI quando cambi indirizzo o lo togli.
Per vedere qulcosa di diverso SU LCD dovresti Leggere dall'expander (esistente o no) i 16 caratteri
è immetterni in un nuovo array DATA1[] e quindi stamparlo. Basta che non sia una semplice assegnazione di DATA[x] in DATA1[x] e dovresti avere su LCD "strane cose"
Ciao se non sono stato chiaro chiedimi
Se non capisco male, il secondo programma ti stampa sempre su LCD la stringa anche se cambi indirizzo o togli l'expander.
Dal codice è evidente che tu assegni all'array data [] ="WRITE COMPLETED";
poi esegui una serie di istruzioni di scrittura e lettura sull'expander e infine
scrivi nel ciclo WriteCharLCD (data);
E' evidente che l'array è memorizzato nella RAM del PIC e quindi viene stampato su LCD.
Questo significa che l'istruzione di lettura dall'expander NON PRODUCE EFFETTI quando cambi indirizzo o lo togli.
Per vedere qulcosa di diverso SU LCD dovresti Leggere dall'expander (esistente o no) i 16 caratteri
è immetterni in un nuovo array DATA1[] e quindi stamparlo. Basta che non sia una semplice assegnazione di DATA[x] in DATA1[x] e dovresti avere su LCD "strane cose"
Ciao se non sono stato chiaro chiedimi
Ultima Modifica 12 Anni 8 Mesi fa da gcupini.
Si prega Accedi o Crea un account a partecipare alla conversazione.
- gcupini
- Visitatori
Moderatori: Mauro Laurenti, Pinna, StefA, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.