Du willst eigentlich:
hthCode:uint16_t distance = (highbyte<<8)+lowbyte; // oder uint16_t distance = (highbyte*256)+lowbyte;
Kay
Hallo,
Ich möchte eigentlich nur ganz simpel zwei Register vom SRF02 auslesen.
Ich habe das Makefile angepasst und die I2C Library eingebunden.
Woran liegt der Fehler, dass nicht die Distanz, sondern immer nur die 256 ausgegeben werden? Demnach sind Low und Highbyte beide 0.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; }
Ich denke mal, dass ich es nicht falsch angeschlossen habe.
mfg WarChild
(c) Rechtschreibfehler sind rechtmäßiges Eigentum des Autors (c)
Du willst eigentlich:
hthCode:uint16_t distance = (highbyte<<8)+lowbyte; // oder uint16_t distance = (highbyte*256)+lowbyte;
Kay
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
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo WarChild,
ich habe den SRF02 nicht und kann das nicht testen:
Vielleicht klappt's ja etwa so!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; }
Gruß Dirk
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)
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)
Lesezeichen