-         

Ergebnis 1 bis 3 von 3

Thema: i2c mit ultraschallsensor

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2007
    Beiträge
    27

    i2c mit ultraschallsensor

    Anzeige

    Hallo zusammen,
    Ich habe mit Bascom programmiert und mit dem funktioniert der Ultraschallsensor wunderbar ( per I2C). Ich bin jeztz auf C umgestiegen habe Problem getroffen.
    Ich benutzt ATmega644P in einer sogenannte Flight-control in dem Mikrokopter.
    Hier sind der Code
    main.c
    Code:
    //Diese Codeteil liegt in while Schleife , der pro 2ms einmal durchlauft. //66ms =33 mal .Ich habe den sensorcounter für diesen Zweck benutzt.
    if (!sensorcounter)
    				{
    				i2c_start();
    				i2c_write_byte(sensorID);
    				i2c_write_byte(0x00);
    				//in cm messen
    				i2c_write_byte(0x51);
    				i2c_stop();
    				}
    				//wait 65ms
    				if (sensorcounter>33)
    				{
    				i2c_start();
    				i2c_write_byte(sensorID);
    				//leseregister
    				i2c_write_byte(0x02);
    				i2c_stop();
    				i2c_start();
    				i2c_write_byte(sensorID+1);
    				
    				highbyte=i2c_receive_byte();
    				
    				
    				lowbyte=i2c_receive_lastbyte();
    				
    				
    				
    				i2c_stop();
    				cm=(highbyte*256)+lowbyte;   //Abstand
    				sensorcounter=0;
    				printf("Highbyte:%d  ,lowbyte:%d \n",highbyte,lowbyte);
    				}
    				else
    				sensorcounter++;

    ich habe I2C funktion wie unten gemacht
    Code:
    //############################################################################
    //Start I2C
    char i2c_start(void) 
    //############################################################################
    {
        TWCR = (1<<TWSTA) | (1<<TWEN) | (1<<TWINT) | (1<<TWIE);
        //TWIE :Interrupt enable ,eine Aktion wird ausgelöst wenn der global interrupt enable ist
        //TWINT: Flag wird zurückgesetzt=1 ,danach wird Aktion ausgelöst.Nachdem der Aktion fertig ist, wird dieses Bit automatisch auf Null gesetzt.
        //TWEN:=1 Aktiviert TWImodus ,dh:das TWI übernimmt Steuerung über SDA und SCL
        /*TWSTA:    Die TWI-Hardware überprüft ob der Bus frei ist, und gibt die Startsequenz aus. 
                    Ist der Bus nicht frei, wartet das TWI-Modul bis eine Stopsequenz erkannt wurde und sendet die Startsequenz erneut*/
        // wait until transmission completed
        
    	return(0);
    }
    
    //############################################################################
    //Start I2C
    void i2c_stop(void)
    //############################################################################
    {
        TWCR = (1<<TWEN) | (1<<TWSTO) | (1<<TWINT);
        //TWSTO:TWI Stop Sequenz senden
    }
    
    void i2c_reset(void)
    //############################################################################
    {
                     i2c_stop();                
                     twi_state = 0;
                     motor = TWDR;
                     motor = 0;
                     TWCR = 0x80;//TWCR=(1<<TWSTO);
                     TWAMR = 0;//Atmega644 verhält sich wie andere ATmega 
                     TWAR = 0;//Slave Adresse Register : erste 7 bit=Slave Adresse von AVR
                     TWDR = 0;/*    Data Register, alle 8 bit 
                                    Beim Senden: nächstes Byte, das auf den Bus ausgegeben werden soll 
                                    Beim Empfangen: letztes Byte, das über den Bus gekommen ist 
                                    Die Daten sind gültig, solange das Bit TWINT in TWCR gesetzt is*/
                     TWSR = 0;//Status Register TWS7-3:Status der letzte Aktion
                     TWBR = 0;// Bit Rate Register :frequenz einstellen
                     i2c_init();
                     i2c_start();
                     i2c_write_byte(0);
    }
    
    
    
    
    unsigned char i2c_receive_byte(void)
    //#############################################################################
    {
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE) | (1<<TWEA);
    return TWDR;
    }
    
    
    unsigned char i2c_receive_lastbyte(void)
    //#############################################################################
    {
    TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
    return TWDR;
    }
    //############################################################################
    //Start I2C
    char i2c_write_byte(char byte)
    //############################################################################
    { 
        TWSR = 0x00;
        TWDR = byte;
        TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE);
        
        return(0);
        
    }
    Wenn ich 2 Byte über UART ausgebe, bekomme ich immer 255 , 255 .Wenn ich den Sensor entfern ,bekomme ich auch 255 ,255 .Dh: es gibt keine Kommunikation zwischen Platin und den Sensor . Die Hardware habe ich gestestet und alles ok. Es liegt nur bei meinem Programm .

    Kann jemand von euch durchschauen und Suche wo ich Fehler gemacht habe.

    Vielen Dank

    Mit freundlichen Grüssen

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    37
    Beiträge
    1.269
    Moin!
    Ich habe keine Ahnung von C, aber nur aus Interesse: Was hast du mit dem US Sensor vor? Höhe halten oder navigieren?
    Viele Grüße, William
    -> http://william.thielicke.org/

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2007
    Beiträge
    27
    Hallo ,
    Ich benutze den Sensor für Hinderniss abzuweichen.(zb :Wall)

    Mit freundlichen Grüssen

Berechtigungen

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