-
        

Ergebnis 1 bis 6 von 6

Thema: SRF02 an RP6

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Ort
    Preetz
    Alter
    30
    Beiträge
    150

    SRF02 an RP6

    Anzeige

    Hallo,

    Ich möchte eigentlich nur ganz simpel zwei Register vom SRF02 auslesen.

    Ich habe das Makefile angepasst und die I2C Library eingebunden.

    Code:
    // Includes:
    
    #include "RP6RobotBaseLib.h" 	
    
    #include "RP6I2CmasterTWI.h"
    
    #define	SRF02	0xE0
    
    // Main:
    
    int main(void)
    {
    	initRobotBase(); 
    	setLEDs(0b111111);
    	mSleep(1000);
    	setLEDs(0b100100); 
    	I2CTWI_initMaster(100);
    	
    	// Main loop
    	while(true) 
    	{
    		task_RP6System();
    
    		I2CTWI_transmit2Bytes(SRF02, 0, 81);
    		mSleep(65);
    		I2CTWI_transmitByte(SRF02, 2);
    		uint8_t highbyte = I2CTWI_readByte(2);
    		I2CTWI_transmitByte(SRF02, 3);
    		uint8_t lowbyte = I2CTWI_readByte(3);
    		uint16_t distance = (highbyte+256)+lowbyte;
    		writeString_P("\n distance:");
    		writeInteger(distance,DEC);
    		mSleep(500);
    	
    	}
    	
    	return 0;
    }
    Woran liegt der Fehler, dass nicht die Distanz, sondern immer nur die 256 ausgegeben werden? Demnach sind Low und Highbyte beide 0.

    Ich denke mal, dass ich es nicht falsch angeschlossen habe.

    mfg WarChild
    (c) Rechtschreibfehler sind rechtmäßiges Eigentum des Autors (c)

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    10.08.2007
    Beiträge
    47
    Du willst eigentlich:

    Code:
    uint16_t distance = (highbyte<<8)+lowbyte;
    // oder
    uint16_t distance = (highbyte*256)+lowbyte;
    hth
    Kay

  3. #3
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.783
    Blog-Einträge
    8
    Hallo

    Die Formel für 16bit-Werte lautet:
    uint16_t distance = (highbyte*256)+lowbyte;

    Das ist der Grund für deine 256 im Ergebniss, mit * dürfte es 0 sein. Warum der Wert immer 0 ist liegt vielleicht an deiner etwas knappen Wartezeit: mSleep(65); Irgendwo habe ich letzens was von minimaler Wartezeit=65ms gelesen, größer dürfte beim Testen sicher nicht schaden.

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.791
    Hallo WarChild,

    ich habe den SRF02 nicht und kann das nicht testen:
    Code:
    // Includes: 
    
    #include "RP6RobotBaseLib.h"     
    
    #include "RP6I2CmasterTWI.h" 
    
    #define   SRF02   0xE0 
    
    uint8_t srfbuffer[2];
    uint16_t distance;
    
    
    // Main: 
    
    int main(void) 
    { 
       initRobotBase(); 
       setLEDs(0b111111); 
       mSleep(1000); 
       setLEDs(0b100100); 
       I2CTWI_initMaster(100); 
        
       // Main loop 
       while(true) 
       { 
          task_RP6System(); 
    
          I2CTWI_transmit2Bytes(SRF02, 0, 81); 
          mSleep(65); 
          I2CTWI_transmitByte(SRF02, 2); 
    
          I2CTWI_readBytes(SRF02, srfbuffer, 2);
          distance = (srfbuffer[0] << 8) + srfbuffer[1];
    
          writeString_P("\n distance:"); 
          writeInteger(distance,DEC); 
          mSleep(500); 
        
       } 
        
       return 0;
    }
    Vielleicht klappt's ja etwa so!

    Gruß Dirk

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Ort
    Preetz
    Alter
    30
    Beiträge
    150
    Ich kann das programm leider erst morgen testen.
    Bei der berechnung der Distanz habe ich mich vertippt.

    Aber prinzipiell sollten die Befehle für die Übertragung von einzelnen Bytes trotzdem funktionieren. Ich bin nicht mal sicher ob das senden des ersten Bytes funktioniert, da die LED, die bei jeder Messung aufleuchten soll, nicht blinkte.

    Vielleicht sieht ja jemand noch einen Fehler in meinem Quellcode.

    mfg WarChild
    (c) Rechtschreibfehler sind rechtmäßiges Eigentum des Autors (c)

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.09.2007
    Ort
    Preetz
    Alter
    30
    Beiträge
    150
    Nochmal Danke an Dirk,
    der Fehler muss darin gelegen haben, dass ich nacheinander zwei einzelne Register auslesen wollte. Mit der Funktion um automatisch zwei Register auszulesen Funktioniert es einwandfrei. Ich wollte das programm nur für einen ersten funktionstest möglichst simpel halten.

    mfg WarChild
    (c) Rechtschreibfehler sind rechtmäßiges Eigentum des Autors (c)

Berechtigungen

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