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.