PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit SRF02



Mr Bean
09.09.2007, 10:05
Hallo

Ich hab mir einen Ultraschallsensor besorgt um einfach mal ein wenig damit zu experimentieren. Und auch mal was mit dem I2C Bus zu machen. Aber da fangen die Probleme schon an. Ich möchte momentan einfach nur abfragen ob ein Messergebniss vorliegt oder nicht. Wenn das Ergebniss der Messung also größer als 0 ist, dann sollen LED`s an einem Port angehen. Aber schon das funktioniert nicht. Ich denke dass ich irgend ein Problem mit den Startbedingungen für den Bus habe, weiß aber nicht genau was. Könntet ihr da mal drüber schaun?
Ich arbeite mit der I2C Lib von Peter Fleury. Vielleicht muss ich da auch noch irgend etwas in der i2cmaster.h ändern. Aber ich weiß nicht was. Quarz hab ich ein 4 MHz drin, das ist eigenlich in der header Datei auch eingestellt.



#include <avr/io.h>
#include <i2cmaster.h>


#define SLAVE_ADRESSE 0xE0 ;


int main(void)
{
i2c_init();
DDRD = 0xff;
PORTD = 0xff;
return 0;
}

unsigned int read_cm(unsigned char address)
{
unsigned char lowbyte,highbyte;
unsigned int distance;

i2c_start_wait(address+I2C_WRITE);
while (i2c_write(0));
while (i2c_write(81));
i2c_stop();

i2c_start_wait(address+I2C_WRITE);
while (i2c_write(2));
i2c_stop();

i2c_start_wait(address+I2C_READ);
highbyte = i2c_readAck();
lowbyte = i2c_readNak();
distance = (highbyte+256)+lowbyte;
i2c_stop();

if(distance > 0)
{
PORTD = 0x00;
}

return distance;

}

Chattychan
09.09.2007, 18:35
Hi,

ich hatte das Problem auch mal und habs so gelöst, dass ich die
twimaster.h genommen habe. Ich arbeite mit dem RN-Control Board. Da
ist ein i2c Anschluss und man kann direkt über die Hardware senden/empfangen.

Hoffe ich konnte dir helfen. Wenn alles nichts bringt meld dich nochmal und ich schau in meinen alten Quellcodes nach.

P.S.
Ich hab gestern ne Gruppe "Roboternetz" im StudiVZ gegründet. Wenn du möchtest kannst du gerne eintreten bzw jeder der das liest und hier Mitglied ist.

Viele Grüsse
Thomas

Chattychan
09.09.2007, 18:39
Hi,

hab mir grad mal deinen Code angesehen und da fällt mir auf, dass du
read_cm(SLAVEADRESSE) gar nicht in der Main Methode aufrufst.

Viele Grüsse
Thomas

Chattychan
09.09.2007, 18:49
Und nochwas,

distance = (highbyte+256)+lowbyte;

musst du so schreiben

distance = (highbyte*256)+lowbyte;

weil du willst ja 16bit darstellen und wenn du *256 machst dann ist das wie
*2*2*2*2*2*2*2*2 und das ist quasi ein linksverschieben

zb

0000000000000000 distance
10101101 highbyte
10001111 lowbyte

daraus soll 1010110110001111 werden

distance = (highbyte*256) macht das
1010110100000000

distance = (highbyte*256)+lowbyte macht demnach das
1010110110001111


Hättest du +256 gemacht dann käm was anderes raus hab keine lust zu rechnen.

Ich weiss das du den Fehler nur kopiert hast. Steht so in P.Fleury Lib drin.

Viele Grüsse
Thomas

linux_80
09.09.2007, 21:22
Hallo,
und noch ein Tipp,
nicht vergessen nach dem starten der Messung ist der SRF02 für mind. 65ms nicht ereichbar, erst danach kann der Wert ausgelesen werden !

Mr Bean
10.09.2007, 08:03
So danke erstmal für eure Hilfe! Wäre vielleicht noch wichtig dass ich den AtMega8 verwende. Hab den SRF 02 dann direkt mit SDA und SCL verbunden mit 4k7 Pull up`s natürlich.
Werde eure Tips dann heut Abend mal ausprobieren.

Grüße!

Bean

Mr Bean
10.09.2007, 20:41
So habe heut Abend noch einiges geändert Funzt aber leider immer noch nicht... ](*,) ](*,) ](*,)
Ich hab grad keinen Plan mehr... werd jetzt dann aber auch erstmal ne Nacht drüber schlafen und morgen dann wieder weiter machen...


#include <avr/io.h>
#include <i2cmaster.h>
#include <avr/delay.h>

#define SLAVE_ADRESSE 0xE0 ;


unsigned int read_cm(unsigned char address);

int main(void)
{

int distance;

i2c_init();
DDRD = 0xff;
PORTD = 0xff;
read_cm(SLAVE_ADRESSE);
distance = read_cm(SLAVE_ADRESSE);

return 0;
}

unsigned int read_cm(unsigned char address)
{
unsigned char lowbyte,highbyte;
unsigned int distance;

i2c_start_wait(address+I2C_WRITE);
while (i2c_write(0));
while (i2c_write(81));
i2c_stop();

i2c_start_wait(address+I2C_WRITE);
while (i2c_write(2));
i2c_stop();

_delay_ms(65);

i2c_start_wait(address+I2C_READ);
highbyte = i2c_readAck();
lowbyte = i2c_readNak();
distance = (highbyte*256)+lowbyte;
i2c_stop();

if(distance > 0)
{
PORTD = 0x00;
}

return distance;

}


Grüße!!

Bean

Mr Bean
11.09.2007, 21:39
Hallo

Also das ganze funktioniert jetzt. Hat wohl nur an einem ";" nach der define Anweisung gelegen und daran dass ich die Taktrate (4Mhz) nicht im Hauptprogramm eingefügt/definiert habe. Dachte das reicht wenn ich es in der headerdatei mache.
Hier mal der Code:

#include <avr/io.h>
#include <i2cmaster.h>
#include <avr/delay.h>

#define SLAVE_ADRESSE 0xE0
#define F_CPU 4000000UL


unsigned int read_cm(unsigned char address);

int main(void)
{

int distance;

i2c_init();
DDRD = 0xff;
PORTD = 0xff;
read_cm(SLAVE_ADRESSE);
distance = read_cm(SLAVE_ADRESSE);

return 0;
}

unsigned int read_cm(unsigned char address)
{
unsigned char lowbyte,highbyte;
unsigned int distance;

i2c_start_wait(address+I2C_WRITE);
while (i2c_write(0));
while (i2c_write(81));
i2c_stop();

i2c_start_wait(address+I2C_WRITE);
while (i2c_write(2));
i2c_stop();

_delay_ms(65);

i2c_start_wait(address+I2C_READ);
highbyte = i2c_readAck();
lowbyte = i2c_readNak();
distance = (highbyte*256)+lowbyte;
i2c_stop();

if(distance > 150)
{
PORTD = 0x00;
}

return distance;

}


Jetzt hätte ich noch eine Frage zum SRF02: Der Sensor macht bei mir jetzt alle 65ms eine Messung. Blinkt da die LED am Sensor? Bzw leuchtet die während einer Messung? Ich glaube schon oder?

Danke!

Grüße!!

Bean

mefiX
28.09.2007, 16:38
Blinkt bei meinem Modul auch bei jeder Mesung, also entweder Alles i.O. oder beide einen Fehler (hoffe doch Ersteres ;))
LG,
mefiX

Mr Bean
28.09.2007, 17:52
Hallo

Ich hab mal in der englischen Doku zu dem Sensor nachgelesen. Da steht drin dass die LED mit jeder Messung aufleuchtet. Also alles im grünen ähhhh roten Bereich.... ;-) Stimmt schon alles so.....

Grüße!!

Bean