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); } } |
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