- 12V Akku mit 280 Ah bauen         
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

    Praxistest und DIY Projekte
    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
    44
    Beiträge
    1.273
    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
  •  

Labornetzteil AliExpress