PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : hilfe :Ultraschallsensor srf02



sterncapture
24.01.2008, 12:04
hallo zusammen.Für mein Projektarbeit hatte ich die Aufgabe,ein Roboter zu bringen,Hindernisse zu erkennen mittel ein Ultrastrahlsensor.
ich hab mich für den srf02 entschieden.Ich benutze dazu ein ATMEGAA8515L board.
ich hab folgenende Program geschrieben:

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

#define SRF02_ADRESSE 0xE0
#define F_CPU 8000000UL
#define BAUD 19200UL

#include <util/delay.h>

// USART_INIT--
void initusart(void) // Hauptfunktion
{
unsigned char x; //Hilfsvariable
// #idef UBRRL //USART-Schnittstelle
UBRRL = (F_CPU / (16UL*BAUD)) -1; //Baudrate mit TAKT und Baud
UCSRB |= (1<< TXEN) | (1<<RXEN); //Sender und Empfänger ein
UCSRC |= (1<< URSEL) | (1<< UCSZ1) | (3<<UCSZ0); //ansync 8bit

x = UDR;
}

void sendeusart(char x)
{
while (!(UCSRA & (1<<UDRE))); // warten bis Senden moeglich

UDR = x;
}



unsigned int read_cm(unsigned char address);

int main(void)
{


int distance =0;
initusart();
sendeusart(distance);

i2c_init();

DDRA = 0xff;
PORTA = 0xff;
while(1)
{
read_cm(SRF02_ADRESSE);

distance = read_cm(SRF02_ADRESSE);
sendeusart(distance);
}

return 0;
}

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

i2c_init();
i2c_start(SRF02+I2C_WRITE);
while (i2c_write(0));
while (i2c_write(81));
i2c_stop();

i2c_start(SRF02+I2C_WRITE);
while (i2c_write(2));
i2c_stop();

_delay_ms(65);

i2c_start(SRF02+I2C_READ);
highbyte = i2c_readAck();
lowbyte = i2c_readNak();
distance = (highbyte*256)+lowbyte;
sendeusart(distance);

i2c_stop();

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

return distance;

}

ich benutze die bibliotek von Flury und ich hab versucht durch die RS232 vom Board zu senden und zu sehen was rauskommt, die Ergibnisse sehe ich auf dem Programm HTERM.
das problem ich bekomme nur Statische Werte also nix.
kann mir bitte jemand helfen und sagen was ich im programm noch ändern soll damit es funktionniert.Würde mich freuen über jeden Vorschlag.
danke
Grüsse Alex

sechsrad
25.01.2008, 12:21
....Die Wartezeit der Funktion _delay_ms() ist auf 262,14ms/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 13,1ms warten. Die Wartezeit der Funktion _delay_us() ist auf 768us/F_CPU (in MHz) begrenzt, d.h. bei 20 MHz kann man nur max. 38,4us warten.....


deine delay funktioniert ist nicht richtig, ist bei dir überzogen.

sterncapture
28.01.2008, 10:37
danke zuerst für deine Antwort.Das stimmt ,wenn ich versuche auf dem HTERM programm zusehen,was der sensor sendet,komm nur 255 oder 127,ausserdem die LED Lampe von dem sensir blinkt sehr schnell obwohl die sollte nur 15 messungen pro 15s messen.
ich werd versuchen das zu ändern und sag ich dir was passiert ist.danke
und schönen tag noch
grüss
amri

Tenorm
08.02.2008, 18:03
Ich kenn dein Board zwar nicht, aber da der SRF02 über I2C läuft, brauchst du nen Pullupwiderstand. Womöglich hat dein Board schon einen integriert, dann musst du ihn nur am Anfang des Programms aktivieren.
(in cc heißt der Befehl: "Port_WriteBit(PORTNUMMER, 1);", dürfte bei dir ähnlich bzw. gleich sein. Einfach in den main-Block oben einfügen.)

Tenorm
08.02.2008, 18:07
Wenn du immer 255 bekommst, liegt das daran, das die SRF-softwear oder sowas noch nicht hochgelaufen ist (siehe Bedienungsanleitung oder auf http://www.robotikhardware.de/download/srf02doku.pdf)

sterncapture
12.02.2008, 15:03
Danke für eure Antwort.Also ich hab die Wartezeit und das Programm verändert aber leider immer nichts ](*,) .
Ich hab festgesteht dass, mein Board die stk 500 kein Pullup Wiederstand hat,deswegen hab ich 2 Wiederstände am Sensor gelötet :ein hat 7k und der andere 10 k Ohm,aber ich bekomme immer noch 255 als Wert oder 127 wennn ich der Hand vor dem sensor stelle.
Bin echt am druchdrehen:-( bitte brauche eure hilfe.An was kann dann hängen und was muss ich noch ändern ?
hier nochmal das Programm:
#include <avr/io.h>


#include <C:\Dokumente und Einstellungen\java\Eigene Dateien\sensor\i2cmaster.h>

#define SRF02_ADRESSE 0xE0
#define F_CPU 8000000L
#define BAUD 19200L

#include <util/delay.h>




// USART_INIT--
void initusart(void) // Hauptfunktion
{
unsigned char x; //Hilfsvariable
// #idef UBRRL //USART-Schnittstelle
UBRRL = (F_CPU / (16UL*BAUD)) -1; //Baudrate mit TAKT und Baud
UCSRB |= (1<< TXEN) | (1<<RXEN); //Sender und Empfänger ein
UCSRC |= (1<< URSEL) | (1<< UCSZ1) | (3<<UCSZ0); //ansync 8bit

x = UDR;
}

void sendeusart(int x)
{
while (!(UCSRA & (1<<UDRE))); // warten bis Senden moeglich
{
}
UDR = x;
}



unsigned int read_cm();

int main(void)

{


int distance =0;
initusart();

sendeusart(distance);

i2c_init();


PORTA = 0xff;
DDRA = 0xff;
while(1)
{
read_cm();

distance = read_cm(SRF02_ADRESSE);
sendeusart(distance);
}

return 0;
}

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



i2c_init();
i2c_start_wait(SRF02_ADRESSE+I2C_WRITE);

i2c_write(0);

i2c_write(81);


i2c_stop();

_delay_ms(100);

i2c_start_wait(SRF02_ADRESSE+I2C_WRITE);

i2c_write(2);

i2c_stop();

_delay_ms(100);

i2c_rep_start(SRF02_ADRESSE+I2C_READ);

highbyte = i2c_readAck();

lowbyte = i2c_readNak();

distance = (highbyte*256)+lowbyte;


i2c_stop();

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

return distance;
}

Tenorm
13.02.2008, 19:37
Hast du eigendlich schon einen Hardwearfehler ausgeschlossen? Wenn du die Hand davor hebst und sich der Wert verändert kann ja schon mal garnicht soviel falsch laufen! Kopf hoch! Ich bin mir jetzt nicht ganz sicher, aber wenn du die Widerstände in Reihe vor den Sensor schaltest, kommst du doch auf 18kO, oder? Waren das in der BEdienungsanleitung nicht 1,8kO? Ich weiß auch nicht ob du JEWEILS einen Widerstand an SCL und SDA hängen musst. Prüfs aber lieber nochmal in der Bedienungsanleitung nach, dürfte zwar nix kaputt gehen aber sonst bin ich ja noch schuld...
Viel Glück:

Tenorm

sterncapture
14.02.2008, 11:16
hab ich überpruft ,es liegt nnicht dran.weiss nich aber ich hab eigentlich das gleiche problem wie du,bei compelieren hängt immer bei i2c_start_wait(SRF02_ADRESSE+I2C_WRITE);weiss nicht .kannste mir sagen ob der programm richtig ist indem du es auf dein sensor probierst ?
danke
MFG amri

Tenorm
14.02.2008, 12:39
Wenn din Programm bei I2C_Start hängen bleibt, heißt das, dass kein I2C-Bus gestartet werden kann, was (normalerweise) daran liegt, dass der Widerstand nicht ordnungsgemäß verlötet ist, oder das der verkehrte Widerstand eingelötet wurde oder das die I2C-Schnittstelle nicht richtig initalisiert wurde.

Tenorm
14.02.2008, 12:42
Noch was: Normalerweise muss man die Geschwindigkeit des Buses festlegen (normalerweise 100kHz oder 400kHz), kann ich jetzt bei dir nicht finden, ist aber womöglich in einer Lib festgelegt. Testen kann ichs leider nicht, weil ich mit compact c arbeite, sorry...

Gruß

Tenorm

Tenorm
14.02.2008, 12:45
Weißt du eigendlich, wo man sich einen c-compiler runterladen kann oder geht das auch gut mit microsoft visual c toolkit? Mit was arbeitest du eigendlich?
Apropo testen; meiner läuft auch noch nicht hundertprozentig, ich pax heut aber glaub noch...

Viel Glück

Tenorm

sterncapture
14.02.2008, 15:43
ich benutze der avr studio 4 ,kannste von internet runterladen und ich lese die werte auf HTERM das sit auch so ein programm ,das man von internet runterladen kann.
MFG amri

Tenorm
14.02.2008, 15:49
Zum Programm:

1)Du initalisierst die I2C_Schnittstelle 2 mal.
2)In compact c legt man beim initalisieren gleich noch den Arbeitstakt fest: "I2C_Init(I2C_100kHz);". Kanst ja mal das ausprobieren.
3)Meistens muss man beim I2C_Bus nicht warten, er wartet von alleine. An deiner Stelle würde ich das Programm mal auf die wirklich wichtigen Sachen, nur mal zum testen, kürzen.
4)Du schreibst "UCSRB |= (1<< TXEN) | (1<<RXEN);", aber "TX" und "RX" sind doch die Ports der RS232-Schnittstelle, bei I2C heißen die Leitungen "SDA" und "SCL".
5)Hast du schon überprüft, ob der Compiler alle Include-Dateien findet?

Hoffentlich geht dann was; probier das Programm so zu kürzen:


I2Cstart(Deviceadresse+write)
I2Cwrite(Registeradresse, ab wo gelesen werden soll)
I2Cstart(Deviceadresse+read)
highbyte = I2Cread(Ack)
lowbyte = I2cread(Nack)
I2Cstop()
distance = (highbyte*256)+lowbyte

Wenn ich mehr weiß, schreib ich, viel Erfolg

Tenorm