PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SRF02 an RP6



WarChild
27.01.2008, 22:29
Hallo,

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

Ich habe das Makefile angepasst und die I2C Library eingebunden.



// 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

KayH
27.01.2008, 23:20
Du willst eigentlich:



uint16_t distance = (highbyte<<8)+lowbyte;
// oder
uint16_t distance = (highbyte*256)+lowbyte;


hth
Kay

radbruch
27.01.2008, 23:20
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

Dirk
27.01.2008, 23:22
Hallo WarChild,

ich habe den SRF02 nicht und kann das nicht testen:

// 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

WarChild
27.01.2008, 23:35
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

WarChild
28.01.2008, 23:55
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