Visualizza un messaggio singolo
  #1  
Vecchio 04-12-2013, 09:14 AM
peppe89kl peppe89kl non è collegato
Nuovo Roboter
 
Registrato dal: Mar 2013
Messaggi: 8
predefinito 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.
Rispondi quotando