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 );
}
Lesezeichen