PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : i2c mit ultraschallsensor



tranh85bo
07.10.2009, 21:49
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


//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


//################################################## ##########################
//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

Willa
07.10.2009, 23:52
Moin!
Ich habe keine Ahnung von C, aber nur aus Interesse: Was hast du mit dem US Sensor vor? Höhe halten oder navigieren?

tranh85bo
08.10.2009, 10:37
Hallo ,
Ich benutze den Sensor für Hinderniss abzuweichen.(zb :Wall)

Mit freundlichen Grüssen