Progetti

   

Tutorial

   

Servizi

   

Sponsor  

   
Benvenuto, Ospite
Nome utente: Password: Ricordami
  • Pagina:
  • 1
  • 2

ARGOMENTO: I2C - dsPIC

I2C - dsPIC 6 Anni 10 Mesi fa #1

  • Taglia
  • Avatar di Taglia
  • Offline
  • Junior Boarder
  • Messaggi: 21
  • Karma: 0
Ciao a tutti, eccomi di nuovo.

Sto cercando di far comunicare il mio dsPIC con una eeprom esterna(24LC512) attraverso il protocollo I2C, ma purtroppo sto sbagliando qualcosa!! :(

Il codice è scritto in mplab xc16.
Sotto metto il codice...
void Open_I2C(void)
{
 OpenI2C((I2C_ON & I2C_IDLE_CON & I2C_CLK_HLD & I2C_IPMI_DIS & I2C_7BIT_ADD &
          I2C_SLW_EN & I2C_SM_DIS & I2C_GCALL_DIS & I2C_STR_DIS & I2C_NACK & 
          I2C_ACK_DIS & I2C_RCV_DIS & I2C_STOP_DIS & I2C_RESTART_DIS & I2C_START_DIS), 0x2E);
 IdleI2C();
}
 
void WriteByte(unsigned char AddressIC, unsigned int AddressRegister, unsigned char DataByte)
{
 unsigned char i,j;
 i = AddressRegister >>8;
 j = AddressRegister;
 StartI2C();
 //scrivo l'indirizzo della eeprom
 MasterWriteI2C(AddressIC);
 AckI2C();
 
 MasterWriteI2C(i);
 AckI2C();
 MasterWriteI2C(j);
 AckI2C();
 
 MasterWriteI2C(DataByte);
 AckI2C();
 
 StopI2C();
 IdleI2C();
 return;
}
 
unsigned char ReadByte(unsigned char AddressIC, unsigned int AddressRegister)
{
 unsigned char i,j;
 unsigned char var=1;
 i = AddressRegister >>8;
 j = AddressRegister;
 
 StartI2C();
 //scrivo l'indirizzo della eeprom
 MasterWriteI2C(AddressIC);
 AckI2C();
 
 MasterWriteI2C(i);
 AckI2C();
 MasterWriteI2C(j);
 AckI2C();
 
 RestartI2C();
 //StartI2C();
 MasterWriteI2C(AddressIC+1);
 AckI2C();
 
 var = MasterReadI2C();
 //AckI2C();
 
 NotAckI2C();
 StopI2C();
 IdleI2C();
 
 return var;
}
 
 
int main(int argc, char** argv)
{
  unsigned char temp = 0;
 
  init_porte();
  DisableIntMI2C;
  Retroilluminazione=1;
  Open_I2C();
 
  HomeLCD;
  ClearLCD();
                    //12345678901234567890
  WriteStringLCD(0,0,"------esempio-------");
  __delay_ms(500);
  WriteStringLCD(0,1,"--valore-salvato:---");
  __delay_ms(500);
 
  WriteByte(0xA2,0x10,5);
  //__delay_ms(500);
  temp = ReadByte(0xA2,0x10);
  lcd_gotoxy(1,3);
  WriteCharLCD(48+(temp/10)%10);
  WriteCharLCD(48+temp%10);
 
  while(1) {
 }
}

Grazie!!!
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

I2C - dsPIC 6 Anni 10 Mesi fa #2

  • alfa75
  • Avatar di alfa75
  • Offline
  • Platinum Boarder
  • Messaggi: 527
  • Ringraziamenti ricevuti 86
  • Karma: 7
Ciao taglia
puoi darci qualche notizia in piu?
che genere di problemi ti sta dando...compliazione o altro?
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

I2C - dsPIC 6 Anni 10 Mesi fa #3

  • Taglia
  • Avatar di Taglia
  • Offline
  • Junior Boarder
  • Messaggi: 21
  • Karma: 0
Ciao alfa75,

In teoria il programma è semplicissimo, scrivo 5 nella cella 0x10 della eeprom, successivamente vado a leggerla e visualizzare il contenuto a display, dovrei trovare 5, invece trovo sempre "00".
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

I2C - dsPIC 6 Anni 9 Mesi fa #4

  • alfa75
  • Avatar di alfa75
  • Offline
  • Platinum Boarder
  • Messaggi: 527
  • Ringraziamenti ricevuti 86
  • Karma: 7
Allora..
ho dato un occhiata piu approfondita
se non vado errato dopo la funzione StartI2C() devi attendere la fine della sequenza di start tramite il flag I2CCONbits.SEN prima di poter continuare

ho trovato questo esempio se può essere d'aiuto
 
#include<i2c.h>                                                      
 
 
void main(void )
 
{
 
  unsigned int config2, config1;
 
  unsigned char *wrptr;
 
  unsigned char tx_data[] = {'M','I','C','R','O',’C’,'H','I','P','\0'};
 
  wrptr = tx_data;
 
  /* Baud rate is set for 100 kHz */
 
  config2 = 0x11;
 
  /* Configure I2C for 7 bit address mode */
 
  config1 = (I2C_ON & I2C_IDLE_CON & I2C_CLK_HLD &
 
             I2C_IPMI_DIS & I2C_7BIT_ADD &
 
             I2C_SLW_DIS & I2C_SM_DIS &
 
             I2C_GCALL_DIS & I2C_STR_DIS &
 
             I2C_NACK & I2C_ACK_DIS & I2C_RCV_DIS &
 
             I2C_STOP_DIS & I2C_RESTART_DIS &
 
             I2C_START_DIS);
 
  OpenI2C(config1,config2);
 
  IdleI2C();
 
  StartI2C();
 
  /* Wait till Start sequence is completed */
 
  while(I2CCONbits.SEN);
 
  /* Clear interrupt flag */
 
  IFS0bits.MI2CIF = 0;
 
  /* Write Slave address and set master for transmission */
 
  MasterWriteI2C(0xE);
 
  /* Wait till address is transmitted */
 
  while(I2CSTATbits.TBF);  // 8 clock cycles
 
  while(!IFS0bits.MI2CIF); // Wait for 9th clock cycle
 
  IFS0bits.MI2CIF = 0;     // Clear interrupt flag
 
  while(I2CSTATbits.ACKSTAT);
 
  /* Transmit string of data */
 
  MasterputsI2C(wrptr);
 
  StopI2C();
 
  /* Wait till stop sequence is completed */
 
  while(I2CCONbits.PEN);
 
  CloseI2C();
 
}
Ultima modifica: 6 Anni 9 Mesi fa da alfa75.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.

I2C - dsPIC 6 Anni 9 Mesi fa #5

  • Taglia
  • Avatar di Taglia
  • Offline
  • Junior Boarder
  • Messaggi: 21
  • Karma: 0
Ciao,
lo avevo notato infatti, ho inserito IdleI2C(); dopo lo start...in teoria fa la stessa funzione di quello che mi avevi suggerito.
Ora leggo il numero 255, che non è quello che ho scritto!!!
Sembra che il micro legga in una cella diversa da quella che gli dico di leggere o che salvi in una diversa!!
Ultima modifica: 6 Anni 9 Mesi fa da Taglia.
L\'Amministratore ha disattivato l\'accesso in scrittura al pubblico.
  • Pagina:
  • 1
  • 2
Moderatori: Mauro Laurenti, Matteo Garia
Powered by Forum Kunena
   
© LaurTec 2006-2015