-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 13

Thema: hilfe :Ultraschallsensor srf02

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.11.2007
    Alter
    38
    Beiträge
    16

    hilfe :Ultraschallsensor srf02

    Anzeige

    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:
    Code:
    #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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    14.01.2008
    Beiträge
    164
    ....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.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    15.11.2007
    Alter
    38
    Beiträge
    16

    Ultraschallsensor srf02

    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

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    30.01.2008
    Alter
    24
    Beiträge
    44
    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.)

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    30.01.2008
    Alter
    24
    Beiträge
    44
    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)

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    15.11.2007
    Alter
    38
    Beiträge
    16
    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;
    }

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    30.01.2008
    Alter
    24
    Beiträge
    44
    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

  8. #8
    Neuer Benutzer Öfters hier
    Registriert seit
    15.11.2007
    Alter
    38
    Beiträge
    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

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    30.01.2008
    Alter
    24
    Beiträge
    44
    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.

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    30.01.2008
    Alter
    24
    Beiträge
    44
    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

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •