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
Lesezeichen