- Messaggi: 248
- Ringraziamenti ricevuti 0
Lettura e scrittura EEPROM su PIC16F18877
- FABRIZIO
-
Autore della discussione
- Elit Utente
-
Less
Di più
4 Anni 2 Settimane fa #1
da FABRIZIO
Lettura e scrittura EEPROM su PIC16F18877 è stato creato da FABRIZIO
Buongiorno a tutti, sto lottando per utilizzare l'ennesima funzione di questo cervellotico PIC16F18877.
Dovrei scrivere e leggere dei dati sulla EEPROM ma, dopo tantissimi tentativi e traduzione del datasheet non sono riuscito a combinare un bel niente. Qualcuno mi può dare qualche dritta?
Dovrei scrivere e leggere dei dati sulla EEPROM ma, dopo tantissimi tentativi e traduzione del datasheet non sono riuscito a combinare un bel niente. Qualcuno mi può dare qualche dritta?
Si prega Accesso o Crea un account a partecipare alla conversazione.
- FABRIZIO
-
Autore della discussione
- Elit Utente
-
Less
Di più
- Messaggi: 248
- Ringraziamenti ricevuti 0
4 Anni 1 Settimana fa #2
da FABRIZIO
Risposta da FABRIZIO al topic Lettura e scrittura EEPROM su PIC16F18877
Dalle risposte ricevute (zero), vedo con piacere che non è una passeggiata questa procedura!
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Cosimix
-
- Elit Utente
-
Less
Di più
- Messaggi: 198
- Ringraziamenti ricevuti 26
4 Anni 1 Settimana fa #3
da Cosimix
Risposta da Cosimix al topic Lettura e scrittura EEPROM su PIC16F18877
Salve!
Potresti scrivere la bozza che hai realizzato per le funzioni di lettura e scrittura? In questo modo possiamo vedere insieme cosa non va.
Saluti,
Cosimo
Potresti scrivere la bozza che hai realizzato per le funzioni di lettura e scrittura? In questo modo possiamo vedere insieme cosa non va.
Saluti,
Cosimo
Si prega Accesso o Crea un account a partecipare alla conversazione.
- FABRIZIO
-
Autore della discussione
- Elit Utente
-
Less
Di più
- Messaggi: 248
- Ringraziamenti ricevuti 0
4 Anni 1 Settimana fa #4
da FABRIZIO
Risposta da FABRIZIO al topic Lettura e scrittura EEPROM su PIC16F18877
Salve Cosimo mando subito le funzioni:
Vado a precaricare le variabili indirizzo1 e indirizzo2 rispettivamente 0xF0 0x01
#pragma config CP = OFF // UserNVM Program memory code protection bit (Program Memory code protection disabled)
#pragma config CPD = OFF // DataNVM code protection bit (Data EEPROM code protection
disabled)
#define _XTAL_FREQ 32000000
unsigned char Lettura_Memoria(unsigned char indirizzo1, unsigned char indirizzo2)
{
NVMCON1bits.NVMREGS = 1; //Settaggio uso EEPROM
NVMADRL = indirizzo2;
NVMADRH = indirizzo1;
NVMCON1bits.RD = 1;
asm("NOP"); asm("NOP"); asm("NOP");
Primaccensione = NVMDATL;
return Primaccensione;
}
unsigned char Scrittura_Memoria(unsigned char Primaccensione3)
{
PIE7bits.NVMIE = 1
NVMREGS = 1;
Primaccensione = Primaccensione3;
while (NVMIF == 1)
{
NVMADRL = 0x01;
NVMADRH = 0xF0;
NVMDATL = Primaccensione;
INTCONbits.GIE = 0;
NVMCON1bits.WREN = 1;
NVMCON2 = 0x55;
Routine_Ritardo(20);
NVMCON2 = 0xAA;
Routine_Ritardo(20);
NVMCON1bits.WR = 1;
INTCONbits.GIE = 1;
NVMCON1bits.WREN = 0;
asm("NOP"); asm("NOP");
}
return 0;
}
Vado a precaricare le variabili indirizzo1 e indirizzo2 rispettivamente 0xF0 0x01
#pragma config CP = OFF // UserNVM Program memory code protection bit (Program Memory code protection disabled)
#pragma config CPD = OFF // DataNVM code protection bit (Data EEPROM code protection
disabled)
#define _XTAL_FREQ 32000000
unsigned char Lettura_Memoria(unsigned char indirizzo1, unsigned char indirizzo2)
{
NVMCON1bits.NVMREGS = 1; //Settaggio uso EEPROM
NVMADRL = indirizzo2;
NVMADRH = indirizzo1;
NVMCON1bits.RD = 1;
asm("NOP"); asm("NOP"); asm("NOP");
Primaccensione = NVMDATL;
return Primaccensione;
}
unsigned char Scrittura_Memoria(unsigned char Primaccensione3)
{
PIE7bits.NVMIE = 1
NVMREGS = 1;
Primaccensione = Primaccensione3;
while (NVMIF == 1)
{
NVMADRL = 0x01;
NVMADRH = 0xF0;
NVMDATL = Primaccensione;
INTCONbits.GIE = 0;
NVMCON1bits.WREN = 1;
NVMCON2 = 0x55;
Routine_Ritardo(20);
NVMCON2 = 0xAA;
Routine_Ritardo(20);
NVMCON1bits.WR = 1;
INTCONbits.GIE = 1;
NVMCON1bits.WREN = 0;
asm("NOP"); asm("NOP");
}
return 0;
}
Si prega Accesso o Crea un account a partecipare alla conversazione.
- Cosimix
-
- Elit Utente
-
Less
Di più
- Messaggi: 198
- Ringraziamenti ricevuti 26
4 Anni 1 Settimana fa - 4 Anni 1 Settimana fa #5
da Cosimix
Risposta da Cosimix al topic Lettura e scrittura EEPROM su PIC16F18877
Salve!
La lettura dovrebbe essere corretta. Per quanto riguarda la scrittura credo che tu non riesca a scrivere perché racchiudi operazioni fondamentali all'interno del while, controllando il bit NVMIF. Questo vale 1 quando i cicli di scrittura sono terminati, quindi tu non riuscirai mai a scrivere nel registro NVMDATA.
Se una volta terminata la scrittura non ti interessa generare interrupt, puoi provare la soluzione seguente:
E' una versione grezza e arrangiata sulla base della funzione da te scritta. Manca ovviamente la possibilità di passare gli indirizzi così come l'hai impostata. [strike]Per questo motivo l'ho dichiarata void.[/strike] Inoltre con questa funzione scrivi solo un byte. Evidentemente per il tuo scopo è sufficiente.
Ovviamente la soluzione non è mai unica.
Saluti,
Cosimo
La lettura dovrebbe essere corretta. Per quanto riguarda la scrittura credo che tu non riesca a scrivere perché racchiudi operazioni fondamentali all'interno del while, controllando il bit NVMIF. Questo vale 1 quando i cicli di scrittura sono terminati, quindi tu non riuscirai mai a scrivere nel registro NVMDATA.
Se una volta terminata la scrittura non ti interessa generare interrupt, puoi provare la soluzione seguente:
Code:
void Scrittura_Memoria(unsigned char Primaccensione3)
{
// Step necessari per la scrittura mediante accesso al registro NVMREG:
NVMCON1bits.NVMREGS = 1;
NVMCON1bits.WREN = 1;
NVMADRL = 0x01;
NVMADRH = 0xF0;
// Disabilito gli interrupt (se attivi) durante la scrittura:
unsigned char flag_GIE = 0;
if (GIE)
{
GIE = 0;
flag_GIE = 1;
}
// Sequenza di sblocco:
NVMCON2 = 0x55;
NVMCON2 = 0xAA;
NVMCON1bits.WR = 1;
// Scrittura del byte:
NVMDATL = Primaccensione3;
// Attendo fino a completa scrittura del dato:
while(WR);
// Abilito nuovamente eventuali interrupt abilitati prima della scrittura;
if (flag_GIE)
{
GIE = 1;
}
}
Ovviamente la soluzione non è mai unica.
Saluti,
Cosimo
Ultima Modifica 4 Anni 1 Settimana fa da Cosimix.
Si prega Accesso o Crea un account a partecipare alla conversazione.
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.
Forum - Ultimi messaggi
-
- progetto can
- da marcelloraja
-
- MODULO GSM SIM900A
- da Mauro Laurenti
-
- Freedom III e compilazioni fallite
- da Mauro Laurenti
-
- Gestione degli errori su comunicazione seriale
- da Mauro Laurenti
-
- Timer0 e interrupt
- da Mauro Laurenti