+1yak-40 писал(а):Ну это как раз очень даже интересно
|  | roboforum.ruТехнический форум по робототехнике. |  | 
+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 писал(а):земля от ноги проца до ноги компаса звонится? Если осциллом померить землю компаса относительно земли проца, то что?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0