|
|
|
![]() |
Modulo eeprom I2C
|
|
|
|
|
Una sera apro il programma di posta elettronica e trovo una mail di Nicola Sellitto con allegato lo schema elettrico del modulo che presento ora.
L'idea di utilizzare le eeprom in questa maniera mi piace e lo contatto immediatamente.
In pochi giorni (e tante telefonate) mettiamo a punto il modulo eeprom e lo proviamo. (io dal vivo e Nicola per via telefonica).
Ne constatiamo subito il buon funzionamento e decidiamo di pubblicarlo per la gioia di tutti.
|
|
Qui sotto troverete tutto l'occorrente per procedere alla realizzazione
_____________________________________________________________________________
Le foto sopra mostrano il modulo montato tra l'alimentatore e la demoboard.
Dal momento che è gestito in I2C, occorre mettere due resistenze di pull-up da 2,2K tra i pin RC3 e RC4 del pic e il positivo dell'alimentazione.Queste resistenze possono essere anche da 10K ma ho preferito utilizzare i 2.2K per avere la maggiore velocità possibile sul bus I2C.
Invece di montarli direttamente sul modulo, ho preferito montarle separatamente per permettere l'uso contemporaneo di più mduli I2C sullo stesso bus creato dai due pin del pic.
Tutte le resistenze montate sul modulo, servono a proteggere le eeprom dai disturbi e dai picchi di tensione. Sono facoltative ma, le ho messe per completezza.
Il led giallo l'ho aggiunto perché è l'unico elemento che segnala la presenza di tensione al modulo, serve a togliere dubbi in caso di mancati funzionamenti.
Caratteristiche del modulo Eeprom
Questo modulo, gestito in I2C, può essere utilizzato con le eeprom 24LCxxx nel range che và dal 24LC64 al 24LC 512.
Cioè, potete mettere fino a 8 eeprom anche mischiate tra loro come modelli.
Ho previsto anche due DIP SWITCH per consentire la protezione in scrittura delle singole eeprom.
Le eeprom della serie 24LC16 non possono essere utilizzate su questo modulo, a causa della loro diversa organizzazione delle celle di memoria interne (è già divisa in banchi internamente).
Le eeprom della serie 24LC32 dovrebbero andare ma non ne ho nel cassetto e non le ho provate.
L'utilizzo di questo modulo è affidato alla vostra fantasia, un robottaro potrebbe usarlo come scatola nera per i suoi robot, come memoria aggiuntiva del pic per le mappature del territorio dei robot "esplorer", etc. etc.
Programma di prova
Nicola, ormai noto per la proverbiale bravura in programmazione, ha messo a punto le routine per la gestione I2C e le eeprom, routine che potete scaricare cliccando qui: ROUTINE.zip.
Dovrete scompattarle e metterle nella cartella include del vostro compilatore.
Eccoci ora arrivati al listato del sorgente:
Per i collegamenti, dovete collegare il modulo eeprom all'alimentazione, il filo SCL và collegato al pin RC3 del PIC 16F876/877.
Il filo DATA và collegato al pin RC4.
Collegate il modulo led alle porte B del PIC e ricordatevi di aggiungere due resistenze di pull-up tra i pin RC3, RC4 e il positivo dell'alimentazione.
// -----------------------------------------------------------------------------
// File: TExtpro2.c
// Autore: Nicola Sellitto snico_one@yahoo.it
// Versione: 1.0// Data: 28 Settembre 2003
// Descrizione:
// Esempio di utilizzo delle funzioni ExtEprom per gestire una eeprom esterna.
// secondo il protocollo I2C.
// Sono gestiti fino ad 8 device contemporaneamente, ciascuno è
// specificato da idDevice (0-7)./
/ L'indirizzo del byte da gestire è specificato da un word, cioè deve
// essere sempre di 16 bit.
// Verifiche: Prove eseguite con un 16F876 a 20Mhz ed eeprom 24CL256
// Note: In questo esempio si gestiscono 2 device. Il primo di indirizzo
// 0x00 con i pin A0, A1, A0 tutti collegati a massa, il secondo di
// indirizzo 0x01 con i pin A0 al positovo e A1, A0 tutti collegati a massa
// Collegando i pin A0, A1, A2 in un'altra configurazione bisogna
// impostare correttamente il nuovo identificativo del device
// valorizzando id Device.
// In questo esempio la PORTB è collegata a led per output visualizza
// il dato letto dalla eeprom.
// ------------------------------------------------------------------------
#include <pic.h>
#include "macro.h"
#include "delay.c"
#include "exteprom.c"
#include "i2c.c"
void main() {
BYTE idDevice1;
BYTE data1;
WORD address1;
BYTE idDevice2;
BYTE data2;
WORD address2;
ADCON0 = 0x00; // Disabilita A/D convertitore
ADCON1 = 0x07; // Configura PortA come digitale
PORTA = 0x00; // Reset ogni linea
PORTB = 0x00; // Reset ogni linea
PORTC = 0x00; // Reset ogni linea
TRISA = 0x00; // Tutte le porte definite come output
TRISB = 0x00; // Tutte le porte definite come output
TRISC = 0x00; // Tutte le porte definite come output
I2cInitMaster(); // Init I2c in modalità masterid
Device1 = 0x00; // Identificativo del device1 (A2 - A1 - A0)
address1 = 0x00AA; // Indirizzo della cella eeprom utilizzato
data1 = 0xF0; // Valore da scrivere nella eeprom
idDevice2 = 0x01; // Identificativo del device2 (A2 - A1 - A0)
address2 = 0x00A; // Indirizzo della cella eeprom utilizzato
data2 = 0x0F; // Valore da scrivere nella eeprom
PORTB = 0x00; // Reset led
DelaySec(1);
ExtEpromWrite(idDevice1, address1, data1); // Scrive dato
data1 = 0x00; // Reset dato
PORTB = 0xFF; // Segnala scrittura completata
DelaySec(2);
data1 = ExtEpromRead(idDevice1, address1); // Legge il dato
PORTB = data1; // Visualizza il dato numerico 0xF0
// i led saranno 11110000
DelaySec(5);
ExtEpromWrite(idDevice2, address2, data2); // Scrive dato
data2 = 0x00; // Reset dato
PORTB = 0xFF; // Segnala scrittura completata
DelaySec(2);
data2 = ExtEpromRead(idDevice2, address2); // Legge il dato
PORTB = data2; // Visualizza il dato numerico 0x0F
// i led saranno 00001111
DelaySec(5);
while(1) continue; // Loop infinito
}
Il sorgente appena messo lo dovete compilare e inserire nel pic.
Alla partenza, dopo 2 secondi vedrete accendersi tutti i led e dopo altri 2 secondi saranno accesi solo gli ultimi 4 led della porta B.
Vuol dire che il dato nella prima eeprom è stato scritto e letto, rimarranno accesi per 5 secondi.
Dopo i 5 secondi dei 4 led, si riaccenderanno tutti e 8 per altri due secondi e poi rimarranno accesi i primi 4 led della porta B (anziché gli ultimi).
Vuol dire che il dato è stato scritto e letto anche sulla seconda eeprom del modulo.Spero di aver chiarito tutto con questo…… buon lavoro.
|