Strana anomalia LT lib module_EEPROM

  • marcoilgrande
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
5 Giorni 7 Ore fa #1 da marcoilgrande
Strana anomalia LT lib module_EEPROM è stato creato da marcoilgrande
Ciao a Tutti e mille grazie a Mauro per il suo enorme lavoro svolto.
uso Mplabx ver6.10 e compilatore 2.41 sto programmando su 18f46k22
mi succede una cosa molto strana con le librerie LT module_EEPROM ver.5.2.0.
quando vado a scrivere un valore sulla cella indirizzo 1, scaricando la EEPROM DATA nella cella 1 trovo il valore che ho scritto, ma quando vado a leggere dalla cella 1 non so perchè mi legge il valore contenuto nella cella 0.
Ovviamente lo posso risolvere aggiungendo +1 con l'istruzione di lettura su tutte le celle ma mi pare una porcheria.
A qualcuno è mai capitato? cosa sbaglio?

Grazie,
Marco

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

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
5 Giorni 6 Ore fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Strana anomalia LT lib module_EEPROM
Salve Marco,
grazie della segnalazione.
Puoi confermare se modificando l'esempio usato nella libreria (cartella ex), hai lo stesso comportamento?

Se non hai lo stesso comportamento, puoi inviare un ritaglio del codice che usi?
Che modello EEPROM usi?
Qual'è l'indirizzo dell amemoria e il control byte che invii alla libreria?

Saluti,

Mauro

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

  • marcoilgrande
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
4 Giorni 5 Ore fa #3 da marcoilgrande
Risposta da marcoilgrande al topic Strana anomalia LT lib module_EEPROM
Grazie Mauro,
no, con l'esempio della libreria tutto funziona correttamente.
ecco il ritaglio del codice che uso:

    //leggo la prima posizione della memoria, per cercare di capire se è un primo avvio
    unsigned char cella1=0;
    cella1=EEPROM_read_byte (1);
    delay_ms(100);

   
        if (cella1==255) { //verifico se è la prima volta che eseguo il codice
            //Si è la prima volta, allora imposto i parametri di default
            
            EEPROM_write_byte (1,1);
            delay_ms(10);
            EEPROM_write_byte (2,3);
            delay_ms(10);
            EEPROM_write_byte (3,2);
            delay_ms(10);
            EEPROM_write_byte (4,0);
            delay_ms(10);
            EEPROM_write_byte (5,1);
            delay_ms(10);

              LCD_goto_line(2);
            LCD_write_message("Prima accensione...");
            delay_ms(3000);
            }
    
    
           LCD_goto_line(1);
           LCD_write_message("cella1:");
           LCD_write_integer(cella1,3,0);
           delay_ms(3000)


anche dopo 3 avvi continua a visualizzare a display "Prima accensione...".
ed il valore di cella1 è sempre 255.
forse il problema è tutto il resto di codice ma preferirei non pubblicarlo anche perchè appoggia su librerie

 

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

  • Mauro Laurenti
  • Moderatore
  • Moderatore
Di più
2 Giorni 6 Ore fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Strana anomalia LT lib module_EEPROM
Salve Marco,
in linea di massima il codice sembra corretto. 

Che valore viene visualizzato sul diplay LCD?

La funzione di scrittura restituisce 1 se la scrittura è andata a buon fine mentre 0 se ci sono stati errori.
Prova a leggere il valore restituito e visulizzalo.

Che PIC stai usando?

Saluti,

Mauro

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

  • marcoilgrande
  • Autore della discussione
  • Giovane Utente
  • Giovane Utente
Di più
1 Giorno 4 Ore fa #5 da marcoilgrande
Risposta da marcoilgrande al topic Strana anomalia LT lib module_EEPROM
sto usando 18f46k22, compilatore 2.41 e 2.50, packs 1.8.249

Ho fatto un po di prove e c'è qualcosa che non va ANCHE con l'esempio, cioè:

Se leggo la prima volta la cella1 giustamente legge 255 (FF) in quanto vuota
se scrivo la cella1 la funzione restituisce 1 e nella cella 1 viene effettivamente scritto il dato (lo vedo perchè scarico la EEPROM interna con il PROGRAMMATORE)
se leggo la cella1 restituisce il dato appena salvato

e fin qui tutto ok, MA:

AL RIAVVIO SUCCESSIVO la lettura della cella 1 resituisce inspiegabilmente di nuovo 255. (nonostante c'è un altro valore salvato precedentemente in quella cella)

L'anomalia è si verifica pure modificando il codice dell'esempio in questo modo (uso le LTlib 5.1.2 Maker):
Non credo sia un errore del pic in quanto leggendo la eprom interna il dato è correttamente memorizzato.

ecco il codice:

//******************************************************************************
// The software writes to the EEPROM location "address" the value "data".
// Afterward it reads the address back and write the content to PORTD.
// PORTD should have LEDs connected to it.
//
// 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_EEPROM.h"
#include "module_EEPROM.c"

#include "module_IO.h"
#include "module_IO.c"


#include "LTlib_delay.h"
#include "LTlib_delay.c"

#include "LCD_44780.h"
#include "LCD_44780.c"

void main(void) {
    
        LCD_initialize(20);
    LCD_home();
    LCD_clear();
    delay_ms(3000);
    //rilluminazione on
    //RILLCD=1;
    
    
    
    uint16_t address = 0x1F;
    uint8_t data = 0x53;
    uint8_t read_back = 0x00;
    uint8_t read_back2 = 0x00;
    //IO_set_all_ports_as_inputs();
    
    IO_set_port_direction(IO_PORTC, IO_ALL_PORT_OUTPUT);
    
        read_back2 = EEPROM_read_byte (2);
    //IO_write_port(IO_PORTC, read_back);
        LCD_goto_line(1);
           LCD_write_message("cella2 val avvio:");
           LCD_write_integer(read_back2,3,0);
           delay_ms(3000);
    
    
    EEPROM_write_byte(2, data);
    //wait for the data to be written, before read it back
    delay_ms (10);
    
     read_back2 = EEPROM_read_byte (2);
    //IO_write_port(IO_PORTC, read_back);
               LCD_goto_line(2);
           LCD_write_message("cella2 dopo salv:");
           LCD_write_integer(read_back2,3,0);
           delay_ms(3000);
     
    while(1);
}


a questo punto io non so piu cosa dire o fare....

 

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