-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Ultraschall per I2C

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.03.2007
    Alter
    48
    Beiträge
    33

    Ultraschall per I2C

    Anzeige

    Ok. Ich stehe vor dem nächsten Problem.
    Habe mir das ganze wohl doch etwas einfacher vorgestellt.
    Also weitere 8574 für weitere I/O's klappt jetzt.
    Jetzt wollte ich mal ausprobieren den Ultraschallsensor SRF02 per I2C anzuschließen.
    Aber irgendwie ist die Ansteureung laut dem Datenblatt für mich ein Rätsel.
    In dem Datenblatt ist leider nur ein Beispiel für Bascom angegeben.
    Also das Senden für den Start der Messung verstehe ich noch( glaube ich zumindest).
    Aber wie lese ich die beiden Register aus?

    Danke für jede Hilfe

  2. #2
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.913
    also, bei einem display, welches ich vor kurzem probiert habe, ging das folgendermassen:

    i2cstart(adresse)
    i2cwrite(registernummer)
    i2cstart(adresse+1) //+1 bedeutet "lesen"
    i2cread()

    es wird also gestartet, die registernummer geschrieben, dann wieder gestartet mit der adresse+1 wodurch der baustein weiss dass er gelesen wird, und dann wird der lesebefehl benutzt. das da oben ist pseudocode, die funktionen heissen etwas anders glaub ich.

    ansonsten: such mal nach nem link für das datenblatt, ich schaus mir dann mal an.
    kleinschreibung ist cool!

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    05.03.2007
    Alter
    48
    Beiträge
    33
    Hier mal meine Vorstellung:

    Code:
    #include <stdlib.h>
    #include <avr/io.h>
    #include "i2cmaster.h"
    #include "asuro.h"
    
    #define SRF02   0xE0      // device address 
    
    int main(void)
    {
      unsigned char ret;
      int i;
      int t1, t2;
        
      Init();                                    // init Asuro
      i2c_init();                                // init I2C interface
    
      while(1)
      {	    
        ret = i2c_start(SRF02+I2C_WRITE);       // set device address and write mode
        if ( ret ) 
        {
          /* failed to issue start condition, possibly no device found */
          i2c_stop();
          StatusLED(RED);
          for (i=0; i<255; i++)
          {Sleep(255);}    
        }
        else 
        {
          
          i2c_write(0x51);                       // Startbefehl zum Start der Messsung
          i2c_stop();                           // 
          for (i=0;i<65;i++){Sleep(72);}   // mind. 65 ms warten bis Lesebefehl
    
        }
    
          i2c_write(0x02);
          i2c_rep_start(SRF02+I2C_READ);
          t1 = i2c_read();	
          i2c_stop();
    
          i2c_write(0x03);
          i2c_rep_start(SRF02+I2C_READ);
          t2 = i2c_read();	
          i2c_stop();
    
    	
          char text[6] =" ";
          itoa(t1, text, 6);    
          SerWrite(text, 6);
    	  
    	  SerWrite("      ", 6);
    	  
    	  char text2[6] =" ";
          itoa(t2, text2, 6);    
          SerWrite(text2, 6);
    	  
          SerWrite("\r\n", 2); /* Zeilenvorschub */
    
          for (i=0; i<255; i++)
          {Sleep(255);}
    
    
      }
    
    
      return 0;
    }
    Der Link der Datenblattes lautethttp://www.robotikhardware.de/download/srf02doku.pdf

    Danke für die Unterstützung.

  4. #4
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.913
    hab heute abend keine zeit dafür leider, werds die nächsten tage mal probieren. das schaffen wir schon =)
    kleinschreibung ist cool!

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    05.03.2007
    Alter
    48
    Beiträge
    33
    ok. hatte heute einen schlechten tag und habe wieder einen ausgleich gesucht.
    also den kleinen aus die kiste geholt, den rechner an und los.

    mit folgendem prog habe ich die ersten erfolge:

    Code:
    #include <stdlib.h>
    #include <avr/io.h>
    #include "i2cmaster.h"
    #include "asuro.h"
    
    
    #define SRF02   0xE0      // device address 
    
    int main(void)
    {
      int i;
      unsigned char t1, t2;
        
      Init();                                    // init Asuro
      i2c_init();                                // init I2C interface
    
      while(1)
      {	    
    
    	StatusLED(RED);
          for (i=0; i<200; i++)
          {Sleep(155);}
    	StatusLED(GREEN);
    
    	
    	  i2c_start_wait(SRF02+I2C_WRITE); 
          i2c_write(0x00);
          i2c_write(0x51);
          i2c_stop();
    	  for (i=0;i<90;i++){Sleep(72);}   // mind. 65 ms warten bis Lesebefehl
    	
    	  i2c_start_wait(SRF02+I2C_WRITE); 
          i2c_write(0x02);
          i2c_rep_start(SRF02+I2C_READ);
    	  t1 = i2c_readNak();	
          i2c_stop();
    	  
    	  i2c_start_wait(SRF02+I2C_WRITE); 
          i2c_write(0x03);
          i2c_rep_start(SRF02+I2C_READ);
          t2 = i2c_readNak();	
          i2c_stop();
    
    
    	  
          char text1[6] =" ";
          itoa(t1, text1, 6);    
          SerWrite(text1, 6);
    	  
    	  SerWrite("      ", 6);
    	  
    	  char text2[6] =" ";
          itoa(t2, text2, 6);    
          SerWrite(text2, 6);
    
      
          SerWrite("\r\n", 2); /* Zeilenvorschub */
    
      }
      return 0;
    }
    die messung wird gestartet und ich erhalte auch werte.
    leider werte mit denen man noch nichts anfangen kann.
    das high byte ist immer 0 egal wie weit ein objekt ist.
    das low byte bringt mir werte größer 255.
    1000 wurde mir auch angezeigt.
    auf entfernungsänderungen reagiert das ganze. habe aber noch nichts nachgemessen.
    für das low byte kommen werte wie:
    bei kurzer entfernung so ca. 30 cm werte wie: 33; 34; 40 wäre ja super.
    gehe ich dann aber nur ein wenig weiter kommt gleich 133;122;414..
    gehe ich wieder einige cm weiter 50;51...
    vielleicht fällt ja jemandem schon etwas ein.
    jetzt reichts mir erst einmal. kiste auf, den kleinen rein. morgen ist auch noch ein tag.

  6. #6
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.913
    lass ihn mal in ener endlosschleife die werte ausgeben (hyperterminal). dann kannst du den kleinen hinstellen und experimentieren. was steht denn im datenblatt, welche entfernung welche werte produziert? es könnte auch sein, dass je nach material der reflexionsschicht das signal verfälscht wird - die "weiche" hand wird andere werte machen als eine "harte" wand.
    kleinschreibung ist cool!

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    05.03.2007
    Alter
    48
    Beiträge
    33
    hallo.

    also durch das kleine prog oben bekomme ich ja durch die endlosschleife
    meine lustigen werte.
    die ausgabe soll laut datenblatt in cm erfolgen.
    die cm ergeben sich durch schreiben von 0x51 auf register 0.
    (0x50 für inch)

    und dann soll die ausgabe in register 2 highbyte und register 3 lowbyte
    erfolgen, wo dann meine werte erscheinen.

    habe die entfernung extra gegen eine wand gemacht, damit ich eine große gleichmäßige fläche habe.

  8. #8
    Moderator Robotik Einstein Avatar von damaltor
    Registriert seit
    28.09.2006
    Ort
    Jena
    Alter
    31
    Beiträge
    3.913
    verdammt... =)

    kann das an der übertragung liegen? kann das an der umwandlung in string liegen? probier mal PrintInt();...
    kleinschreibung ist cool!

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von m.a.r.v.i.n
    Registriert seit
    24.07.2005
    Ort
    Berlin
    Beiträge
    1.247
    Hi,

    itoa(t1, text1, 6);
    Der 3. Parameter der Funktion itoa ist die radix, und bezeichnet das Zahlensystem in das die Zahl gewandelt werden soll.
    10 wäre hier natürlich richtig fürs Dezimalsystem und nicht 6 (HexaSystem?)

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    05.03.2007
    Alter
    48
    Beiträge
    33
    genau an der wandlung liegt es.
    habe es gerade bei meinem 8574 test erkannt und auch schon in dem anderen beitrag geschrieben.
    printint verwendet strlen um die genau länge eines strings zu ermitteln.
    ich habe immer 6 zeichen gnadenlos gesendet. also auch den schrott
    der in so einem string sitzen kann.

    ich verspreche, ich werde jetzt immer artig strlen verwenden und bleibe
    bei der alten asuro.c
    die neue asuro.c ist mir doch zu groß.

    auf in den kampf bis zum nächsten problem

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •