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