Pagina 1 di 2

Polling

MessaggioInviato: 17 set 2013, 10:07
da wizard
Buongiorno :-)
Devo far comunicare un dispositivo master con 2 slaves attraverso il protocollo di comunicazione I2C. Il mio scopo è quello di "accorgermi" dei 2 slaves realizzando il polling.
Nel momento in cui ho un unico slave non ho problemi perché esso viene tranquillamente riconosciuto; i problemi nascono quando ne ho 2: viene riconosciuto sempre e solo un unico dispositivo ovvero quello avente l'indirizzo più "piccolo" (per spiegarmi meglio: se ho 2 slaves aventi indirizzo 0x90 e 0x98, mi viene riconosciuto solo quello con indirizzo 0x90).
Detto ciò, volevo chiedere se è possibile riuscire a vedere i 2 dispositivi attraverso il polling (cioè se è formalmente corretto) o esiste un altro modo per poterlo fare. Nel caso in cui il polling vada bene inoltre, volevo chiedere, se possibile, qualche piccolo suggerimento per risolvere questo mio problema.
Grazie in anticipo :-)

Re: Polling

MessaggioInviato: 17 set 2013, 10:16
da c1b8
Non so come hai implementato il polling, secondo me non dovresti avere il problema di vedere solo uno slave.
Puoi riportare il codice che utilizzi?

Re: Polling

MessaggioInviato: 17 set 2013, 10:26
da wizard
Codice: Seleziona tutto
unsigned char polling(void)
{
unsigned char addr[5]={0x90,0x92,0x94,0x96,0x98};
char i;

i=0;
while(i<5)
{
   start();
   idle();
   write(addr[i]);
   idle();
   if(ACKSTAT==0)
   {
      stop();
      idle();
      return addr[i];
   }
   else
   {
      i++;
      stop();
      idle();   
   }
}
return 0xFF;
}


La dimensione dell'array è fissata per provare il tutto

Re: Polling

MessaggioInviato: 17 set 2013, 10:32
da c1b8
Implementato così ritorna l'indirizzo del primo slave presente, la causa è quel return addr[i];
Personalmente modificherei la polling(void) in modo che ritorni non un char ma un array di char con ogni elemento valorizzato a 0 se il dispositivo non è presente o con l'indirizzo del dispositivo se presente.

Re: Polling

MessaggioInviato: 17 set 2013, 10:38
da wizard
Ok la implementerò e ti farà sapere :-)

Re: Polling

MessaggioInviato: 20 set 2013, 17:00
da wizard
Niente da fare, solito problema :roll:

Re: Polling

MessaggioInviato: 20 set 2013, 17:09
da c1b8
Ciao,
potresti postare il codice così come lo hai implementato?

Solito problema nel senso che continua a riconoscere solo il primo slave?

Re: Polling

MessaggioInviato: 20 set 2013, 17:17
da wizard
Codice: Seleziona tutto
char polling(unsigned char addr_disp[5])
{
unsigned char addr[5]={0x90,0x92,0x94,0x96,0x98};
char i,n_disp;

n_disp=0;
for (i=0;i<5;i++)
{
   start();
    idle();
    write(addr[i]);
    idle();
    if(ACKSTAT==0)
   addr_disp[n_disp]=addr[i];
   n_disp++;
    stop();
    idle();
}
return n_disp;
}


n_disp indica il numero di slave che rispondono con l'ACK e addr_disp[] contiene gli indirizzi
Successivamente passo queste informazioni ad un'altra funzione che scrive volta per volta i 2 indirizzi e vede se è stato ricevuto un ACK o meno immettendo gi indirizzi contenuti in addr_disp[]
c1b8 ha scritto:Solito problema nel senso che continua a riconoscere solo il primo slave?

:ok:

Re: Polling

MessaggioInviato: 20 set 2013, 17:25
da c1b8
Prova così:
Codice: Seleziona tutto
    char polling(unsigned char addr_disp[5])
    {
    unsigned char addr[5]={0x90,0x92,0x94,0x96,0x98};
    char i,n_disp;

    n_disp=0;
    for (i=0;i<5;i++)
    {
       start();
        idle();
        write(addr[i]);
        idle();
        if(ACKSTAT==0) {
             addr_disp[n_disp]=addr[i];
             n_disp++;
        }
        stop();
        idle();
    }
    return n_disp;
    }


Se continua a non funzionare prova a farci vedere anche la parte di codice che richiama la polling e poi ne utilizza i risultati.

Re: Polling

MessaggioInviato: 20 set 2013, 17:39
da wizard
Sì il problema persiste...mostrare l'altra funzione sarebbe troppo perché questa a sua volta ne richiama un'altra e alla fine dei giochi è richiamata da un'altra funzione ancora...darei veramente troppo impiccio :lol:
Ti ringrazio per la disponibilità e per la pazienza, proverò a risolvere questo problema da solo :-)