Ciao, no va bene anche un altro PIC, ho disponibile anche un 16F876 se no lo compro non c'è problema. E' che ho già il 16f84 e pensavo che per questo semplice compito bastasse anche lui che è più piccolo.
Grazie per l'aiuto.
Pier
I2C tra PIC16F84 e eeprom 24C02
Moderatore:
Paolino
20 messaggi
• Pagina 2 di 2 • 1, 2
0
voti
0
voti
Va bene quello che hai. Per sapere come collegarlo devi leggerti il datasheet. Sostanzialmente basta dargli la giusta alimentazione, probabilmente devi collegargli il quarzo perché non mi sembra abbia un oscillatore interno (verificare sul datasheet).
poi sulla I2C devi metterci due resistori di pull-up da 10K.
E poi devi scriverci il programma.
poi sulla I2C devi metterci due resistori di pull-up da 10K.
E poi devi scriverci il programma.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
Ciao io ho in mente di fare questo circuito sostituendo il 16f877 con il 16f876. In questo schema però non vedo le resistenze di pullup. Sei sicuro che servano?
Dove le devo inserire?
Grazie per l'aiuto.
Pier
Dove le devo inserire?
Grazie per l'aiuto.
Pier
0
voti
Devi guardare il datasheet! Forse sono interne al micro, non ricordo ...
Io non uso più i PIC da molto tempo.
Io non uso più i PIC da molto tempo.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
In effetti leggendo il datasheet dice che sulla linea sda e scl sono necessarie le resistenze di pullup esterne. Si possono abilitare via software su rbo.
Allora metterò anche queste resistenze. Basta mettere la resistenza da 10K tra sda e +5vcc e tra scl e +5vcc vero? Grazie tantissimo.
Pier
Allora metterò anche queste resistenze. Basta mettere la resistenza da 10K tra sda e +5vcc e tra scl e +5vcc vero? Grazie tantissimo.
Pier
0
voti
Dipende dalla velocità. Lavorando a 400KHz ci metto delle 2K2, a 100KHz bastano le 10K.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
ma come faccio a decidere se lavorare a 400 o a 100 kHz? lo dico in fase di programmazione o a seconda del valore delle resistenze di pullup varia la frequenza a cui programmo la eprom?
scusate se sono domande banali ma sono alle prime armi e vorrei riuscire nell'intento.
grazie dell'aiuto
pier
scusate se sono domande banali ma sono alle prime armi e vorrei riuscire nell'intento.
grazie dell'aiuto
pier
0
voti
Dipende dai dispositivi I2C che hai collegati. Non tutti riescono a lavorare a 400KHz.
Per metterti al sicuro programma la periferica per 100KHz, ci metti le 10K e vivi felice.
Per metterti al sicuro programma la periferica per 100KHz, ci metti le 10K e vivi felice.
-

TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 11:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
allora ho fatto il circuito con le resistenze di pullup da 10k ma non funziona la eprom non viene scritta. Ho utilizzato mikroC pro e ho preso il programma di esempio:
void main(){
ANCON0 = 0; // Configure PORTB pins as digital
ANCON1 = 0; // Configure PORTC pins as digital
ANCON2 = 0;
TRISB = 0; // Configure PORTB as output
LATB = 0; // Clear PORTB
I2C1_Init(100000); // initialize I2C communication
I2C2_Init(100000);
Delay_ms(500);
// TRISD5_bit = 0;
while(1){
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA2); // send byte via I2C (device address + W)
I2C1_Wr(2); // send byte (address of EEPROM location)
I2C1_Wr(0xAA); // send data (data to be written)
I2C1_Stop(); // issue I2C stop signal
Delay_100ms();
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA2); // send byte via I2C (device address + W)
I2C1_Wr(2); // send byte (data address)
I2C1_Repeated_Start(); // issue I2C signal repeated start
I2C1_Wr(0xA3); // send byte (device address + R)
LATB = I2C1_Rd(0u); // Read the data (NO acknowledge)
I2C1_Stop(); // issue I2C stop signal
Delay_ms(1000);
I2C2_Start(); // issue I2C start signal
I2C2_Wr(0xA2); // send byte via I2C (device address + W)
I2C2_Wr(2); // send byte (address of EEPROM location)
I2C2_Wr(0x55); // send data (data to be written)
I2C2_Stop(); // issue I2C stop signal
Delay_100ms();
I2C2_Start(); // issue I2C start signal
I2C2_Wr(0xA2); // send byte via I2C (device address + W)
I2C2_Wr(2); // send byte (data address)
I2C2_Repeated_Start(); // issue I2C signal repeated start
I2C2_Wr(0xA3); // send byte (device address + R)
LATB = I2C2_Rd(0u); // Read the data (NO acknowledge)
I2C2_Stop(); // issue I2C stop signal
Delay_ms(1000);
}
Poi gli ho detto programma e dalla finestra che appare mi sono salvato l'hex che ho programmato nel PIC con icprog.
Ho provato anche a mettere come indirizzo di scrittura 0xA0 e di lettura 0xA1 visto che io ho tutti i pin connessi a masssa.
Potreste dirmi dove sbaglio?
Grazie a tutti per l'aiuto.
Pier
void main(){
ANCON0 = 0; // Configure PORTB pins as digital
ANCON1 = 0; // Configure PORTC pins as digital
ANCON2 = 0;
TRISB = 0; // Configure PORTB as output
LATB = 0; // Clear PORTB
I2C1_Init(100000); // initialize I2C communication
I2C2_Init(100000);
Delay_ms(500);
// TRISD5_bit = 0;
while(1){
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA2); // send byte via I2C (device address + W)
I2C1_Wr(2); // send byte (address of EEPROM location)
I2C1_Wr(0xAA); // send data (data to be written)
I2C1_Stop(); // issue I2C stop signal
Delay_100ms();
I2C1_Start(); // issue I2C start signal
I2C1_Wr(0xA2); // send byte via I2C (device address + W)
I2C1_Wr(2); // send byte (data address)
I2C1_Repeated_Start(); // issue I2C signal repeated start
I2C1_Wr(0xA3); // send byte (device address + R)
LATB = I2C1_Rd(0u); // Read the data (NO acknowledge)
I2C1_Stop(); // issue I2C stop signal
Delay_ms(1000);
I2C2_Start(); // issue I2C start signal
I2C2_Wr(0xA2); // send byte via I2C (device address + W)
I2C2_Wr(2); // send byte (address of EEPROM location)
I2C2_Wr(0x55); // send data (data to be written)
I2C2_Stop(); // issue I2C stop signal
Delay_100ms();
I2C2_Start(); // issue I2C start signal
I2C2_Wr(0xA2); // send byte via I2C (device address + W)
I2C2_Wr(2); // send byte (data address)
I2C2_Repeated_Start(); // issue I2C signal repeated start
I2C2_Wr(0xA3); // send byte (device address + R)
LATB = I2C2_Rd(0u); // Read the data (NO acknowledge)
I2C2_Stop(); // issue I2C stop signal
Delay_ms(1000);
}
Poi gli ho detto programma e dalla finestra che appare mi sono salvato l'hex che ho programmato nel PIC con icprog.
Ho provato anche a mettere come indirizzo di scrittura 0xA0 e di lettura 0xA1 visto che io ho tutti i pin connessi a masssa.
Potreste dirmi dove sbaglio?
Grazie a tutti per l'aiuto.
Pier
20 messaggi
• Pagina 2 di 2 • 1, 2
Torna a Firmware e programmazione
Chi c’è in linea
Visitano il forum: Nessuno e 6 ospiti

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)