Pagina 1 di 2

MikroC e libreria I2C

MessaggioInviato: 14 feb 2014, 13:23
da c1b8
Salve a tutti,
ho deciso di provare le librerie I2C (hardware non software) di MikroC per realizzare un piccolo master I2C con un PIC18, mannaggia a me...
Ho riscontrato un problema di blocco del software sulla I2C1_Rd() quando non è connesso un dispositvo slave.
Cercando nel forum della Mikroe trovo che lo stesso problema è già stato segnalato alla Mikroe stessa già nel 2004.
La domanda è: vi risulta che questo problema sia ancora presente o sono io a sbagliare?
Se è ancora presente, dal 2004 ad oggi, senza che l'abbiano corretto, direi che butto subito nel cesso MikroC e le sue librerie... :mrgreen:

Re: MikroC e libreria I2C

MessaggioInviato: 14 feb 2014, 13:27
da Paolino
Ciao Foto Utentec1b8.
Ho impiegato le routine che indichi (MikroC PRO) 4 anni fa, ma onestamente non ho riscontrato il malfunzionamento. Forse perché l'esperimento prevedeva una connessione sempre presente tra master e slave.

Grazie per la segnalazione! Da tenere presente (= non userò MikroC PRO per I2C)

Ciao.

Paolo.

Re: MikroC e libreria I2C

MessaggioInviato: 14 feb 2014, 13:39
da TardoFreak
c1b8 ha scritto:... butto subito nel cesso MikroC e le sue librerie... :mrgreen:

Io l' ho fatto 3 anni fa quando dopo tre passaggi innestati di un puntatore come argomento di funzione il puntatore scompariva.
Era il MikroC per DsPic
Da allora non l' ho mai più utilizzato se non per programmini delle balle.

Re: MikroC e libreria I2C

MessaggioInviato: 14 feb 2014, 13:53
da c1b8
TardoFreak ha scritto:Io l' ho fatto 3 anni fa ...

Bene! Allora procedo anch'io :ok:

Re: MikroC e libreria I2C

MessaggioInviato: 14 feb 2014, 14:14
da TardoFreak
Per correttezza riporto la situazione (più o meno era questa)
Codice: Seleziona tutto
void func_a(int *pippo)
{
  // Cucu', pippo non punta piu'
}

void func_b(int *pluto)
{
  // Fa qualcosa
  func_a(pluto);
}

void func_c(int *paperino)
{
  // Fa qualcosa
  func_b(paperino);
}

void clarabella(int a, int b)
{
  a++;
  func_c(&a);
}

Re: MikroC e libreria I2C

MessaggioInviato: 4 mar 2014, 0:49
da giovannispina
TardoFreak ha scritto:Per correttezza riporto la situazione (più o meno era questa)
Codice: Seleziona tutto
void func_a(int *pippo)
{
  // Cucu', pippo non punta piu'
}

void func_b(int *pluto)
{
  // Fa qualcosa
  func_a(pluto);
}

void func_c(int *paperino)
{
  // Fa qualcosa
  func_b(paperino);
}

void clarabella(int a, int b)
{
  a++;
  func_c(&a);
}


è normale che perde il puntatore.

c1b8 ha scritto:Salve a tutti,
ho deciso di provare le librerie I2C (hardware non software) di MikroC per realizzare un piccolo master I2C con un PIC18, mannaggia a me...
Ho riscontrato un problema di blocco del software sulla I2C1_Rd() quando non è connesso un dispositvo slave.
Cercando nel forum della Mikroe trovo che lo stesso problema è già stato segnalato alla Mikroe stessa già nel 2004.
La domanda è: vi risulta che questo problema sia ancora presente o sono io a sbagliare?
Se è ancora presente, dal 2004 ad oggi, senza che l'abbiano corretto, direi che butto subito nel cesso MikroC e le sue librerie... :mrgreen:


I2C_Rd aspetta finché non viene letto il messaggio per questo non ha molto senso leggere da una periferica non connessa. Altrimenti se proprio vuoi che il programma non si blocchi puoi fare una tua implementazione con timeout.

Codice: Seleziona tutto
unsigned int count;
bit rd_flag;

void interrupt()
{
  if (INTCON.T0IF && rd_flag)
  {
    count++;
      
    INTCON.TMR0IE = 1;
    INTCON.T0IF   = 0;
    TMR0L = valore;
  }
}

unsigned short I2C1_MyRead(unsigned short ack)
{
  unsigned short tmp;

  rd_flag = 1;                       
  PIR1.SSPIF = 0;                 
  SSPCON2.RCEN = 1;           
  while (!PIR1.SSPIF && count < 5000/*ms*/) ;

  tmp = SSPBUF;
  if (ack == 0)
    SSPCON2.ACKDT = 1;
  else
    SSPCON2.ACKDT = 0;
   
  PIR1.SSPIF = 0;                 
  SSPCON2.ACKEN = 1;         
  while (!PIR1.SSPIF && count < 5000/*ms*/) ;

  rd_flag = 0;
  return tmp;
}


Spero di esserti stato utile :)

Re: MikroC e libreria I2C

MessaggioInviato: 4 mar 2014, 1:03
da TardoFreak
Normale? :-M

Re: MikroC e libreria I2C

MessaggioInviato: 4 mar 2014, 1:04
da c1b8
giovannispina ha scritto:è normale che perde il puntatore.

A me non sembra molto normale... perche affermi questo?

giovannispina ha scritto:I2C_Rd aspetta finché non viene letto il messaggio per questo non ha molto senso leggere da una periferica non connessa.
Il punto del mio messaggio non è questo, ma il fatto che a distanza di ormai 9 anni da quando più utenti hanno segnalato il desiderio di avere una funzione di read non bloccante, non sia anocra stata implementata. Questo mi sa di poca affidabilità.

giovannispina ha scritto:Altrimenti se proprio vuoi che il programma non si blocchi puoi fare una tua implementazione con timeout.
Ed allora a cosa mi serve avere delle librerie pronte se devo riscrivermi le funzioni?
Sul forum della Mikroe, nel lontano 2004, ad una richiesta simile alla mia veniva risposto dalla Mikroe, postando il codice della read così come presente nella libreria, dicendo che commentando una sola riga il problema si risolveva... perché non hanno fatto la modifica da loro suggerita in una versione successiva?

Edit: vedo che Foto UtenteTardoFreak ha i miei stessi dubbi....

Re: MikroC e libreria I2C

MessaggioInviato: 4 mar 2014, 1:19
da giovannispina
TardoFreak ha scritto:Normale? :-M


Sì, in mC, in assenza di uno stack riservato, lo spazio delle variabili locali (parametri compresi) viene riutilizzato da funzione a funzione, per questo non è consigliabile passare un puntatore ad una variabile locale. Per far funzionare il tuo codice su mC dovresti specificare le variabili locali come statiche.

Re: MikroC e libreria I2C

MessaggioInviato: 4 mar 2014, 1:23
da TardoFreak
Quindi confermi che è una cag ... ehm ... un compilatore , diciamo, migliorabile. :roll:
Alla faccia della compatibilità con ANSI C.
Con il C18 lo fai senza problemi. -:-