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
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 .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); }
Kann jemand von euch durchschauen und Suche wo ich Fehler gemacht habe.
Vielen Dank
Mit freundlichen Grüssen







Zitieren

Lesezeichen