.: robotitaly.NET :. - la community italiana sulla robotica

.: robotitaly.NET :. - la community italiana sulla robotica (http://www.robot-italy.net/roboforum/index.php)
-   990.005 MuIn - Multi Inteface Board (http://www.robot-italy.net/roboforum/forumdisplay.php?f=30)
-   -   srf08 problema acquisizione 12c (http://www.robot-italy.net/roboforum/showthread.php?t=5172)

peppe89kl 04-12-2013 08:14 AM

srf08 problema acquisizione 12c
 
Ciao a tutti.
Sto lavorando ad un progetto in cui devo acquisire una misura di distanza da un sensore ad ultrasuoni (srf08), ma la routine non funziona come dovrebbe, in quanto non riesco a comunicare con il sensore, in particolare quando provo a leggere il bus dati rimane allo stato iniziale, cioè non ricevo nulla...
Il codice che ho scritto è il seguente:
codice:

#include <p18f2520.h> 
#include <adc.h>       
#include <usart.h>     
#include <delays.h>   
#include <stdlib.h> 
#include <i2c.h>   


#pragma config OSC = HSPLL           
#pragma config WDT = OFF               
#pragma config LVP = OFF               

int address1=0xE2;
unsigned char cmdCm=0x51;                //result in centimeters
unsigned char cmdRange=0x32;    //massima distanza 2.3m

unsigned char cmdGain=0x04;
unsigned char registroCm=0x00;
unsigned char registroGain=0x01;
unsigned char registroRangeAndEcho1=0x02;
unsigned char d1;

char dato[5];
void main()
{

        LATA = 0x00;     
        TRISA = 0b0000000;
        LATB = 0x00;
        TRISB = 0b00000000;
        LATC = 0x00;
        TRISC = 0b00000000;
               
OpenUSART( USART_TX_INT_OFF &
                USART_RX_INT_OFF &                           
                USART_ASYNCH_MODE &                               
                USART_EIGHT_BIT &                               
                USART_CONT_RX &
                USART_BRGH_HIGH,129 );


        //inizializzo la comunicazione con l'SRF08
                OpenI2C(MASTER, SLEW_OFF);
                SSPADD=99;

                // imposto il range
                StartI2C();
                        IdleI2C();
                        WriteI2C(0XE2);          //indirizzo con permesso a scrivere
                        IdleI2C();
                        WriteI2C(registroRangeAndEcho1); 
                        IdleI2C();
                        WriteI2C(cmdRange);          //valore da mettere nel registro
                        IdleI2C();
                StopI2C();
               
       
                // imposto il guadagno
                StartI2C();
            IdleI2C();
                        WriteI2C(0XE2);            //indirizzo con permesso a scrivere
                        IdleI2C();
                        WriteI2C(registroGain);
                        IdleI2C();
                        WriteI2C(cmdGain);
                        IdleI2C();
                StopI2C();


//Lettura della distanza
        while(1)
        {
                Delay10KTCYx(100);
                       
                StartI2C();
                                IdleI2C();
                                WriteI2C(0XE2);
                                IdleI2C();
                                WriteI2C(registroCm);
                                IdleI2C();
                                WriteI2C(cmdCm);
                        StopI2C();
                       

                        Delay10KTCYx(100);

                       
                        // effettuo la lettura
                        StartI2C();
                                IdleI2C();
                                WriteI2C(0XE2);
                                IdleI2C();
                                WriteI2C(registroRangeAndEcho1);
                                IdleI2C();
                                RestartI2C();
                               
                                Delay10KTCYx(100);

                                WriteI2C(0XE3);      //indirizzo + permesso a leggere
                                IdleI2C();
                                d1=ReadI2C();
                                IdleI2C();
                        StopI2C();
                        // end
                                                       
                       
                        while(BusyUSART());
            WriteUSART(d1);
                       
                        Delay10KTCYx(100);         
                       
        }
}

Qualcuno saprebbe dirmi quale può essere il problema? Ho provato ad eliminare i vari idle quando non sono strettamente necessari, ma il risultato non cambia.

blueice80 04-13-2013 10:17 AM

Al posto di scrivere
codice:

StartI2C();
IdleI2C();
WriteI2C(0XE2);          //indirizzo con permesso a scrivere
IdleI2C();
WriteI2C(registroRangeAndEcho1); 
IdleI2C();
WriteI2C(cmdRange);          //valore da mettere nel registro
IdleI2C();
StopI2C();

prova ad usare questa funzione (si usa per la eeprom ma va bene comunque):
codice:

EEByteWrite(0xE2, registroRangeAndEcho1, cmdRange);
e per leggere i valori usa:
codice:

d1=EERandomRead(0xE2, registro);


Tutti gli orari sono GMT. Attualmente sono le 12:33 AM.

Powered by vBulletin versione 3.8.7
Copyright ©: 2000 - 2018, Jelsoft Enterprises Ltd.