O código a seguir é parte de um protocolo para a leitura dos dados do acelerômetro MPU6050.
ISR(TWI_vect){
if (I2Cestado == 1){
if ( (TWSR&0xF8)!=COD_START_OK )
TWI_erro(7,I2Cestado);
TWDR=MPU_WR; // endereço de escrita no MPU
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); // envia
end.
}
...
if (I2Cestado == 5){
if ((TWSR&0xF8)!=COD_SLA_RD_ACK)
TWI_erro(7,I2Cestado);
/* inicia a recepção do dados do MPU */
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN) | (1<<TWIE);
}
if (I2Cestado>5 && I2Cestado<18){
if ((TWSR&0xF8)!=COD_RX_DATA_ACK)
TWI_erro(7,I2Cestado);
MPUvet[MPUix++]=TWDR; // recebe um dado
/* prepara para receber próximo dado do MPU */
TWCR = (1<<TWINT) | (1<<TWEA) | (1<<TWEN) | (1<<TWIE);
}
if (I2Cestado==18){
if ((TWSR&0xF8)!=COD_RX_DATA_ACK)
TWI_erro(7,I2Cestado);
MPUvet[MPUix++]=TWDR; // recebe penúltimo dado
/* prepara para receber o último dado e gerar NACK */
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWIE); // NACK
}
if (I2Cestado == 19){
if ((TWSR&0xF8)!=COD_RX_DATA_NACK)
TWI_erro(7,I2Cestado);
MPUvet[MPUix++]=TWDR; // recebe último dado
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO); // envia STOP
MPUax=(MPUvet[0]<<8) | MPUvet[1];
MPUay=(MPUvet[2]<<8) | MPUvet[3];
MPUaz=(MPUvet[4]<<8) | MPUvet[5];
MPUtp=(MPUvet[6]<<8) | MPUvet[7];
MPUgx=(MPUvet[8]<<8) | MPUvet[9];
MPUgy=(MPUvet[10]<<8)| MPUvet[11];
MPUgz=(MPUvet[12]<<8)| MPUvet[13];
}
I2Cestado++; // incrementa estado
}
Após uma análise preliminar do código acima, é correto concluir que a leitura das informações foi realizada, sequencialmente, em