+1yak-40 писал(а):Ну это как раз очень даже интересно
Технический форум по робототехнике.
+1yak-40 писал(а):Ну это как раз очень даже интересно
Scorpio писал(а):Интерактивный мобильный робот Vanessa. И вот, что получилось...
Skyline писал(а):Что-то я туплю, как контакты прикручены? Такое чувство, что все напрямую к металлической пластинки приделано!
Scorpio писал(а):КАК ПРАВИЛЬНО ПОДКЛЮЧИТЬ линии SCL, SDA?
Scorpio писал(а):Пробую тоже самое от NXT - ни одного сбоя за 10000 циклов считывания!
Scorpio писал(а):Ну помогите кто-нибудь с I2C!
#define TWI_BAUD 60 // BAUD=Fsys/2Ftwi -5
#define TWINT 7
#define TWEA 6
#define TWSTA 5
#define TWSTO 4
#define TWWC 3
#define TWEN 2
#define TWIE 0
void fi2c_init(void)
{
TWBR = TWI_BAUD;
TWSR = 0x02;
TWCR = (1<<TWEN)| // Enable TWI-interface and release TWI pins.
(0<<TWIE)|(0<<TWINT)| // Disable Interupt.
(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // No Signal requests.
(0<<TWWC);
};
unsigned char fi2c_start(void)/*issues a START condition.
Returns 1 if bus is free or 0 if the I2C bus is busy or error.*/
{
TWCR = (1<<TWEN)| // TWI Interface enabled.
(1<<TWIE)|(1<<TWINT)| // Enable TWI Interupt and clear the flag.
(0<<TWEA)|(1<<TWSTA)|(0<<TWSTO)| // Initiate a START condition.
(0<<TWWC); //
while (!(TWCR & (1<<TWINT)));
if (((TWSR & 0xF8) == 0x08) || ((TWSR & 0xF8) == 0x10)) //$ 08 - start condition has been transmitted, $ 10 repeated start condition has been transmitted
{
return 1;
}
else
{
return 0;
};
};
void fi2c_stop(void)//issues a STOP condition.
{
TWCR = (1<<TWEN)| // TWI Interface enabled
(0<<TWIE)|(1<<TWINT)| // Disable TWI Interrupt and clear the flag
(0<<TWEA)|(0<<TWSTA)|(1<<TWSTO)| // Initiate a STOP condition.
(0<<TWWC);
};
unsigned char fi2c_read(unsigned char ack)
/*reads a byte from the bus.
The ack parameter specifies if an acknowledgement is to be issued after the byte was read.
Set ack to 0 for no acknowledgement or 1 for acknowledgement.*/
{
unsigned char data;
if (ack == 0)
TWCR = (1<<TWEN)| // TWI Interface enabled
(1<<TWIE)|(1<<TWINT)| // Enable TWI Interupt and clear the flag to read next byte
(0<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // Send NACK after reception
(0<<TWWC); //TWCR &= 0x40; //TWEA = 0
else
TWCR = (1<<TWEN)| // TWI Interface enabled
(1<<TWIE)|(1<<TWINT)| // Enable TWI Interupt and clear the flag to read next byte
(1<<TWEA)|(0<<TWSTA)|(0<<TWSTO)| // Send ACK after reception
(0<<TWWC); // //TWCR |= 0x40; //TWEA =1
delay_ms(1); //while (!(TWCR & (1<<TWINT)));
data = TWDR;
return data;
};
unsigned char fi2c_write(unsigned char data)
/*writes the byte data to the bus.
Returns 1 if the slave acknowledges or 0 if not.
*/
{
TWDR = data;
TWCR &= 0xcf; //TWSTA, TWSTO =0
TWCR |= 0x84; //TWNT TWEN =1
while (!(TWCR & (1<<TWINT)));
if (((TWSR & 0xF8) == 0x18) || ((TWSR & 0xF8) == 0x28) || ((TWSR & 0xF8) == 0x40)) //$ 40 SLA+R transmiteed, $18 SLA+W transmitted, $ 28 DATA transmitted ACK received
{
return 1;
};
if (((TWSR & 0xF8) == 0x20) || ((TWSR & 0xF8) == 0x30) || ((TWSR & 0xF8) == 0x48)) //$20 SLA+W transmited, $ 30 - DATA transmited NOT ACK received $ 48 SLA+R transmitted
{
return 0;
};
};
/* read a byte from I2C device */
unsigned char I2C_read_byte (unsigned char BUS_ADR,unsigned char address)
{
unsigned char data;
#asm("cli");
fi2c_start();
data=fi2c_write(BUS_ADR);
data &=fi2c_write(address);
fi2c_start();
data &=fi2c_write(BUS_ADR | 1);
if(data)data=fi2c_read(0);
fi2c_stop();
#asm("sei")
return data;
}
/* write a byte to the I2C device */
unsigned char I2C_write_byte(unsigned char BUS_ADR,unsigned char address, unsigned char data)
{
unsigned char wr_status=1;
#asm("cli");
fi2c_start();
wr_status=fi2c_write(BUS_ADR);
wr_status &=fi2c_write(address);
wr_status &=fi2c_write(data);
fi2c_stop();
#asm("sei");
return wr_status;
}
Michael_K писал(а):земля от ноги проца до ноги компаса звонится? Если осциллом померить землю компаса относительно земли проца, то что?