Modificato il codice SRF02 ora funziona correttamente

Riprendo dal post precedente relativo al sensore SRF02, come avevo scritto in precedenza seguendo il codice di esempio riportato sul sito riscontravo un comportamento anomalo sulla misurazione, chiedendo ad amici che avevano lo stesso sensore, ma testato con software scritto con linguaggi diversi avevano un comportamento più corretto.
Ho eseguito quindi dei test con mbed, per verificare se cambiando dispositivo anche a me il sensore funzionasse correttamente, ed in effetti i risultati sono stati positivi, confermando che il sensore non era guasto.
Il passo successivo è stato modificare il codice per utilizzare le librerie del C18 per il BUS I2C, definendo le funzioni per l’inizializzazione della periferica e la lettura del sensore.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <i2c.h>
 
#define SRF02   0xE0            // Address of SRF02
 
/**************************************************************************
 * Inizializza la periferica MSSP per il funzionamento in I2C Master
 *************************************************************************/
void srf02_config(void)
{
    OpenI2C(MASTER, SLEW_OFF);
    SSPADD = 0x63;              // 100khz BUS @ 40MHz PIC
}
 
/**************************************************************************
 * Esegue la misurazione tramite il sensore
 *
 * Restituisce la misura effettuata in centimetri
 *************************************************************************/
unsigned int srf02_read(void)
{
    int result=1;
    unsigned int measure=0;
    unsigned char measurement[2];
 
    result = EEByteWrite(SRF02, 0x00, 0x51);
    // Verifica l'esito dell'operazione di avvio della lettura
    if(result==0)
    {
        // Attende il completamento della misurazione del sensore
        Delay10KTCYx(70);
        // Recupera la misurazione fatta dal sensore
        result = EESequentialRead(SRF02, 0x02, measurement, 2);
        // Verifica l'esito dell'operazione di lettura del sensore
        if(result==0)
        {
            // Scrive il valore letto dal sensore
            measure = (measurement[0]<<8);
            measure += measurement[1];
        }
    }
 
    return measure;
}

Di seguito invece la chiamata a questi nuovi metodi:

1
2
3
4
5
6
7
8
9
10
11
12
void main(void)
{
    ...
    srf02_config();
    lcd_clear();
 
    for(;;)
    {
        lcd_put_uint(srf02_read(),0,0);
        Delay10KTCYx(500);
    }
}
1 Star2 Stars3 Stars4 Stars5 Stars (Ancora nessun voto)
Loading ... Loading ...

Ti è piaciuto questo articolo? Perché non lasci un commento e continui la discussione, oppure iscriviti ai feed e riceverai gli articoli sul tuo feed reader.

Commenti

Ancora nessun commento.

Pubblica commento

(obbligatorio)

(richiesta)