Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Polling

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Polling

Messaggioda Foto Utentewizard » 17 set 2013, 10:07

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 :-)
Avatar utente
Foto Utentewizard
25 1 5
Frequentatore
Frequentatore
 
Messaggi: 162
Iscritto il: 12 gen 2013, 17:48

0
voti

[2] Re: Polling

Messaggioda Foto Utentec1b8 » 17 set 2013, 10:16

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?
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[3] Re: Polling

Messaggioda Foto Utentewizard » 17 set 2013, 10:26

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
Avatar utente
Foto Utentewizard
25 1 5
Frequentatore
Frequentatore
 
Messaggi: 162
Iscritto il: 12 gen 2013, 17:48

0
voti

[4] Re: Polling

Messaggioda Foto Utentec1b8 » 17 set 2013, 10:32

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.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[5] Re: Polling

Messaggioda Foto Utentewizard » 17 set 2013, 10:38

Ok la implementerò e ti farà sapere :-)
Avatar utente
Foto Utentewizard
25 1 5
Frequentatore
Frequentatore
 
Messaggi: 162
Iscritto il: 12 gen 2013, 17:48

0
voti

[6] Re: Polling

Messaggioda Foto Utentewizard » 20 set 2013, 17:00

Niente da fare, solito problema :roll:
Avatar utente
Foto Utentewizard
25 1 5
Frequentatore
Frequentatore
 
Messaggi: 162
Iscritto il: 12 gen 2013, 17:48

0
voti

[7] Re: Polling

Messaggioda Foto Utentec1b8 » 20 set 2013, 17:09

Ciao,
potresti postare il codice così come lo hai implementato?

Solito problema nel senso che continua a riconoscere solo il primo slave?
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[8] Re: Polling

Messaggioda Foto Utentewizard » 20 set 2013, 17:17

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:
Avatar utente
Foto Utentewizard
25 1 5
Frequentatore
Frequentatore
 
Messaggi: 162
Iscritto il: 12 gen 2013, 17:48

1
voti

[9] Re: Polling

Messaggioda Foto Utentec1b8 » 20 set 2013, 17:25

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.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[10] Re: Polling

Messaggioda Foto Utentewizard » 20 set 2013, 17:39

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 :-)
Avatar utente
Foto Utentewizard
25 1 5
Frequentatore
Frequentatore
 
Messaggi: 162
Iscritto il: 12 gen 2013, 17:48

Prossimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 11 ospiti