ohamoha Postat Decembrie 21, 2009 Partajează Postat Decembrie 21, 2009 Salut, Incerc sa simulez accesul la un EEPROM extern folosind MikroC si Proteus. Ma chinui de vreo doua zile sa-i dau de cap. Daca ati mai folosit MikroC, poate va dati seama unde e beleaua ca eu sunt destul de incepator. Am pornit de la exemplul din manualul MikroC. Pic: PIC18F4620 Eeprom: 24C16 Asta e codul: #include "lcd.h"void main() { char i; char txt[16]; int k; UART1_Init(9600); ADCON1 = 0x0F; // Configure AN pins as digital CMCON = 7; // Turn off comparators i=0; k=0; initLcd(); k++; //1 I2C1_Init(100000); // initialize I2C communication k++; //2 I2C1_Start(); // issue I2C start signal k++; //3 I2C1_Wr(0b10100000); // send byte via I2C k++; //4 I2C1_Wr(0x00); // send byte (address of EEPROM location) k++; //5 I2C1_Wr(0xAA); // send data (data to be written) k++; //6 I2C1_Stop(); // issue I2C stop signal delay_ms(100); I2C1_Start(); // issue I2C start signal I2C1_Wr(0b10100000); // send byte via I2C (device address + W) I2C1_Wr(0x00); // send byte (data address) I2C1_Repeated_Start(); // issue I2C signal repeated start I2C1_Wr(0b10100001); // send byte i=I2C1_Rd(0); // Read the data (NO acknowledge) I2C1_Stop(); // issue I2C stop signal //UART1_Write_Text("Gata");UART1_Write(10);UART1_Write(13); ByteToStr(i,txt); setText(txt,0,0,3); ByteToStr(k,txt); setText(txt,0,8,3);} Programul se blocheaza la primul I2C1_Wr(0x00); dupa cum se vede in imaginea de mai jos, k nu ajunge decat la valoarea 4. [attachment=2]s1.jpg[/attachment] Daca la I2C1_Init(100000); in loc de 100.000 pun 1.000.000 nu se mai blocheaza si afiseaza ca citeste din memorie 161. [attachment=1]s2.jpg[/attachment] Foarte aiurea este ca daca sterg modulul EEPROM cu totul, tot 161 se afiseaza. [attachment=0]s3.jpg[/attachment] Daca la I2C1_Init pun 2.000.000 imi afiseaza 255 cu sau fara EEPROM. Nu m-am lamurit foarte clar ce inseamna parametrul dat la I2C1_Init. In manual e 100.000 si explicatia este: "Initializes I?C with desired clock (refer to device data sheet for correct values in respect with Fosc)." Am vazut ca EPPROM-urile astea au ceasul la 100kHz sau 400kHz, dar dupa cum ziceam, valoarea 100.000 nu merge. Multumesc mult Link spre comentariu
ohamoha Postat Decembrie 21, 2009 Autor Partajează Postat Decembrie 21, 2009 Daca folosesc libraria Soft I2C totul functioneaza corect. Se pare ca este o problema cu utilizarea modului MSSP al PIC-ului. Poate aveti un sfat cum sa-l fac si pe asta sa mearga. Soft_I2C_Init(); // initialize I2C communication Soft_I2C_Start(); // issue I2C start signal Soft_I2C_Write(0b10100000); // send byte via I2C Soft_I2C_Write(0x00); // send byte (address of EEPROM location) Soft_I2C_Write(0xAA); // send data (data to be written) Soft_I2C_Stop(); // issue I2C stop signal delay_ms(100); Soft_I2C_Start(); // issue I2C start signal Soft_I2C_Write(0b10100000); // send byte via I2C (device address + W) Soft_I2C_Write(0x00); // send byte (data address) Soft_I2C_Start(); // issue I2C signal repeated start Soft_I2C_Write(0b10100001); // send byte i=Soft_I2C_Read(0); // Read the data (NO acknowledge) Soft_I2C_Stop(); // issue I2C stop signal Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum