PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ultraschall per I2C



falkenroby
27.03.2007, 13:33
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

damaltor
27.03.2007, 14:20
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.

falkenroby
27.03.2007, 16:08
Hier mal meine Vorstellung:


#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.

damaltor
27.03.2007, 20:02
hab heute abend keine zeit dafür leider, werds die nächsten tage mal probieren. das schaffen wir schon =)

falkenroby
28.03.2007, 00:13
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:


#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.

damaltor
28.03.2007, 16:29
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.

falkenroby
28.03.2007, 20:21
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.

damaltor
28.03.2007, 20:46
verdammt... =)

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

m.a.r.v.i.n
28.03.2007, 21:28
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?)

falkenroby
28.03.2007, 21:34
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:-)

falkenroby
28.03.2007, 21:46
danke m.a.r.v.i.n

habe mich nicht mit dem 3. parameter nicht richtig beschäftigt.
aber wenn ich für den radix 6 und wenigsten strlen verwende
dann kommen wenigstens werte, die proportional steigen oder fallen
und nicht ein sinnloses chaos wie vorher ergeben.
aber 10 für dezimal lässt sich wirklich besser weiter verarbeiten.

DANKE

werde es im anderen beitrag auch gleich hinzufügen.