hallo an alle. ich hab ein problem beim auslesen der resigster vom
SRF02 Ultraschallsensor. ich verwende den sensor über twi an einem
atmega128 und 16mhz. für TWBR habe ich 72 eigetragen.
die funktion bleib an der kommentierten stelle hängen und läuft nicht
mehr weiter. kann mir da jemand weiterhelfen, wie ich über twi die
register auslesen kann??? alleine finde ich den fehler leider nicht.
das übertragen mit einer anderen funktion läuft ohne problme, nur am
empfangen / lesen gibt es schwierigkeiten.
hier hatte jemand das gleiche problem würde ich sagen:
http://www.mikrocontroller.net/topic/99910#1606143
Code:#include <inttypes.h> // these four library headers are part of WinAVR compiler #include <stdio.h> #include <stdlib.h> #include <avr/io.h> ... int main() { ... unsigned int range_h; unsigned int range_l; DDRD = 0xff; PORTD = 0xff; setup(); printf( "Ultraschallsensor SRF02\n"); while(1) { PORTA ^= ( 1 << PA2 ); i2c_transmit(0xE0,0,0x51); // srf02 ping command, result in cm _delay_ms(120); range_h = i2c_read(0xE0,2); // read srf02 range, high byte range_l = i2c_read(0xE0,3); // read srf02 range, low byte printf( "high: %d\tlow: %d\n", range_h, range_l); //printf( "Abstand: %dcm\n", range); } } char i2c_read(char address, char reg) { char read_data = 0; TWCR = 0xA4; // send a start bit on I2C bus while(!(TWCR & 0x80)); // wait for confirmation of transmit TWDR = address; // load address of I2C device TWCR = 0x84; // transmit while(!(TWCR & 0x80)); // wait for confirmation of transmit TWDR = reg; // send register number to read from TWCR = 0x84; // transmit while(!(TWCR & 0x80)); // wait for confirmation of transmit TWCR = 0xA4; // send repeated start bit while(!(TWCR & 0x80)); // wait for confirmation of transmit TWDR = address+1; // transmit address of I2C device with readbit set TWCR = 0xC4; // clear transmit interupt flag while(!(TWCR & 0x80)); // wait for confirmation of transmit TWCR = 0x84; // transmit, nack (last byte request) //----------------------------ab hier geht es dann nicht mehr weiter------------- while(!(TWCR & 0x80)); // wait for confirmation of transmit read_data = TWDR; // and grab the target data TWCR = 0x94; // send a stop bit on I2C bus return read_data; } void i2c_transmit(char address, char reg, char data) { TWCR = 0xA4; // send a start bit on I2C bus while(!(TWCR & 0x80)); // wait for confirmation of transmit TWDR = address; // load address of I2C device TWCR = 0x84; // transmit while(!(TWCR & 0x80)); // wait for confirmation of transmit TWDR = reg; TWCR = 0x84; // transmit while(!(TWCR & 0x80)); // wait for confirmation of transmit TWDR = data; TWCR = 0x84; // transmit while(!(TWCR & 0x80)); // wait for confirmation of transmit TWCR = 0x94; // stop bit } void setup(void) { TWBR = 72; // 100khz I2C bus speed TWSR = 0; // no prescaler PORTA &= ~( 1 << PA1 ); }







Zitieren


Lesezeichen