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

Vai indietro   .: robotitaly.NET :. - la community italiana sulla robotica > Microcontrollori > Altri Microcontrollori

Altri Microcontrollori Forum dedicato a tutti i microcontrollori e microprocessori non compresi nelle Categorie precedenti

Rispondi
 
Strumenti della discussione ModalitÓ di visualizzazione
  #1  
Vecchio 12-20-2011, 07:52 PM
Katter Katter non Ŕ collegato
Nuovo Roboter
 
Registrato dal: Dec 2011
Messaggi: 1
predefinito Problema con sensore sfr08 e fpga

Salve,
siccome Ŕ la prima volta che posto qui spero sia la sezione guista e spero inoltre che possiate aiutarmi.

Sto cercando di comunicare tramite protocollo i2c con un sensore di distanza sfr08 usando una scheda de1 della altera con un fpga cyclone 2, usando un processore nios e un programma in C.
Il codice che ho scritto sembra corretto, infatti il led sul sensore si accende quando invio il comando per una nuova scansione, inoltre riesco anche a leggere la versione del software nel registro 0.
Tuttavia quando vado a leggere gli altri registri li trovo sempre vuoti, la lettura avviene correttamente ma il valore letto Ŕ 0.
Al momento non ho idea di dove possa essere l'errore e spero possiate suggerirmi qualcosa, di seguito lascio il link al datasheet del sensore e il codice che sto usando.

http://www.robot-electronics.co.uk/htm/srf08tech.shtml

codice:
	volatile int * red_LED_ptr = (int *) 0x00101050;    // red LED address
	volatile int * green_LED_ptr = (int *) 0x00101000;  // green LED address
	int * sw_ptr = (int *) 0x00101010;                  // switches address, non utilizzati
	int * SDA = (int *) 0x00101030;						// sda output address
	int * SCL = (int *) 0x00101020;						// scl output address
	volatile int * SDA_IN = (int *)0x00101040;		    // sda input address
	volatile int * SCL_IN = (int *)0x00101020;			// scl input address, usato per controllo

int i2c_dly(void)
{
* (red_LED_ptr)= 0x000;
}

void i2c_start(void)
{
  *(SDA) = 1;             // i2c start bit sequence
  i2c_dly();
  *(SCL) = 1;
  i2c_dly();
  *(SDA) = 0;
  i2c_dly();
  *(SCL) = 0;
  i2c_dly();
}

void i2c_stop(void)
{
  *(SDA) = 0;             // i2c stop bit sequence
  i2c_dly();
  *(SCL) = 1;
  i2c_dly();
  *(SDA) = 1;
  i2c_dly();
}


int i2c_send(unsigned char d)		//invia il l'argomento della funzione
{
  char x;
  unsigned char c;
  for(x=8; x; x--) {
    if((d & 0x80) == 0x80 ) *(SDA) = 1;
    else *(SDA) = 0;
    *(SCL) = 1;
    d <<= 1;
    *(SCL) = 0;
  }
  *(SDA) = 1;
  i2c_dly();
  *(SCL) = 1;
  c = *(SDA_IN);          // possible ACK bit
  *(SCL) = 0;
  return c;
}

unsigned char i2c_receive(char ack)  //legge il valore dal sensore
{
  char x, d=0;
  *(SDA) = 1; 
  for(x=0; x<8; x++) {
    d <<= 1;
    do {
      *(SCL) = 1;
    }
    while(SCL_IN==0);    // wait for any SCL clock stretching
    i2c_dly();
    if(*(SDA_IN)) d |= 1;
    else d |= 0;
    *(SCL) = 0;
  } 
  if(ack) *(SDA) = 0;
  else *(SDA) = 1;
  *(SCL) = 1;
  i2c_dly();             // send (N)ACK bit
  *(SCL) = 0;
  *(SDA) = 1;
  return d;
}
//viene prima inviato un comando per una nuova scansione, poi viene interrogato il registro 0 finchŔ non ritorna il valore corretto poi vengono letti gli altri registri
//uso i led verdi come segnalazione di errori
int main(void)
{
  int k;
  unsigned char c,version,l,d1,d2;
      i2c_start();              	// send start sequence
    c = i2c_send(0xE0);             // SRF08 I2C address with R/W bit clear
    if (c == 0){
	c = i2c_send(0x00);}             // SRF08 command register address
    else {
	*(green_LED_ptr) = 0x81;		
	}
    if (c == 0){
    	c = i2c_send(0x51);}             // command to start ranging in cm
    else{
	*(green_LED_ptr) = 0x41;
	}
    i2c_stop();               // send stop sequence

  //fine scrittura

  i2c_dly();
  if (c==0){	
    do{
	i2c_start();              		  // send start sequence
    	c=i2c_send(0xE0);             // SRF08 I2C address with R/W bit clear
    	if (c == 0){
    	   c=i2c_send(0x00);}             // SRF08 version register address
    	else{
	   *(green_LED_ptr) = 0x11;
	   continue;
	   }
    	i2c_start();              			// send a restart sequence
    	if (c == 0){
    	   c=i2c_send(0xE1);}             // SRF08 I2C address with R/W bit set
    	else{
	   *(green_LED_ptr) = 0x09;
	   continue;
	   }
    	if (c == 0){
    	   version = i2c_receive(0);		//read version register
	   } 
    	else {
	   *(green_LED_ptr) = 0x03;
	   continue;
	   }	
    	i2c_stop();               // send stop sequence  	  	
        * (red_LED_ptr)= version;}
    while(version != 0x0A);					// software version = 0x0A
    i2c_dly();

    //lettura dati

    i2c_start();              	  // send start sequence
    c=i2c_send(0xE0);             // SRF08 I2C address with R/W bit clear
    if (c == 0){
       c=i2c_send(0x00);}             // SRF08 version register address
    else *(green_LED_ptr) = 0x42;
    i2c_start();              		// send a restart sequence
    if (c == 0){
       c=i2c_send(0xE1);}             // SRF08 I2C address with R/W bit set
    else *(green_LED_ptr) = 0x22;
    if (c == 0){
	l = i2c_receive(1);				//light sensor value
	i2c_dly();			
	d1= i2c_receive(1);				//1st Echo High Byte
	i2c_dly();
	d2= i2c_receive(0);} 			//1st Echo Low Byte
    else *(green_LED_ptr) = 0x12;
    i2c_stop();               // send stop sequence
    * (green_LED_ptr) = d1;
    * (green_LED_ptr) = d2;
    * (red_LED_ptr) = l;
  }

}
Rispondi quotando
Rispondi

Segnalibri

Strumenti della discussione
ModalitÓ di visualizzazione

Regole d'invio
Non puoi inserire discussioni
Non puoi inserire repliche
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code Ŕ attivo
Le smilie sono attive
Il codice IMG Ŕ attivo
il codice HTML Ŕ disattivato

Salto del forum


Tutti gli orari sono GMT. Attualmente sono le 01:48 AM.


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