BASIC4MCU | 센서 | 자이로센서 | mpu6050_writeBits() 함수 설명
페이지 정보
작성자 키트 작성일2017-08-21 15:54 조회1,235회 댓글0건본문
처음보는 연산이 있어서 몇자 적어봅니다.
/**initialize the accel and gyro */
void mpu6050_init(){
TWBR=72; TWSR=0; //100 kHz i2c_init();
delay_ms(100); //allow mpu6050 chip clocks to start up
mpu6050_setSleepDisabled(); //set sleep disabled
delay_ms(10); //wake up delay needed sleep disabled
//set clock source
// it is highly recommended that the device be configured to use one of the gyroscopes (or an external clock source)
// as the clock reference for improved stability
mpu6050_writeBits(MPU6050_RA_PWR_MGMT_1,MPU6050_PWR1_CLKSEL_BIT,MPU6050_PWR1_CLKSEL_LENGTH,MPU6050_CLOCK_PLL_XGYRO);
MPU6050 초기화 함수에보면 레지스터중 몇개의 비트를 write하는 함수가 있습니다.
//
void mpu6050_writeBits(uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data);
함수의 프로토타입 설정은 이렇게 되어 있습니다.
//
void mpu6050_writeBits(uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data);
특정 레지스터에서
void mpu6050_writeBits(uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data);
몇번째 비트부터
void mpu6050_writeBits(uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data);
몇개를
void mpu6050_writeBits(uint8_t regAddr, uint8_t bitStart, uint8_t length, uint8_t data);
data로 write 하는 함수입니다.
//
void mpu6050_writeBits(unsigned char regAddr,unsigned char bitStart,unsigned char length,unsigned char data){
unsigned char mask,b=0;
// 010 value to write
// 76543210 bit numbers
// xxx args: bitStart=4,length=3
// 00011100 mask byte
// 10101111 original value (sample)
// 10100011 original&~mask
// 10101011 masked|value
if(mpu6050_readByte(regAddr,&b)!=0){//get current data
mask=((1<<length)-1)<<(bitStart-length+1);
data<<=(bitStart-length+1);// shift data into correct position
data&=mask; // zero all non-important bits in data
b&=~(mask); // zero all important bits in existing byte
b|=data; // combine data with existing byte
mpu6050_writeByte(regAddr,b);
}
}함수입니다.
//----------------------
친절하게 설명까지 있습니다.
// 010 데이터가 010일 때
// 76543210 bit numbers
// xxx 비트4부터,3자리가 변경 될 위치입니다.
// 00011100 mask byte는 이렇게되고
// 10101111 원래값이 이렇다고 가정 하면
// 10100011 마스크 시키면 비트2,3,4는 크리어됩니다.
// 10101011 마스크 위치에 data를 채운 최종값
//--
if(mpu6050_readByte(regAddr,&b)!=0){ // 원래값을 읽어온 후
mask=((1<<length)-1)<<(bitStart-length+1); //length가 3이라고하면
(1<<length)은 00001000이 됩니다.
((1<<length)-1) 여기서 1을 빼면
00000111이 됩니다.
3자리 마스크데이터는 만들어졌고,
mask=((1<<length)-1)<<(bitStart-length+1); 비트 위치를 이동 시켜줘야합니다.
data<<=(bitStart-length+1); // data도 마스크처럼 비트 위치를 이동 시켜줍니다.
data&=mask; // data 비트만 남기고 다른 비트는 삭제
b&=~(mask); // 원래 레지스터 값은 데이터가 들어갈 자리를 삭제
b|=data; // 레지스터값에 데이터를 더해서
mpu6050_writeByte(regAddr,b); // 레지스터에 write 합니다.
}//--------
저라면
void mpu6050_writeBits(unsigned char regAddr,unsigned char bitMask,unsigned char data){
unsigned char mask,b=0;
if(mpu6050_readByte(regAddr,&b)!=0){//get current datab = (b&bitMask) | data;
mpu6050_writeByte(regAddr,b);
}
}선언부를 다시 만들어야 해서 귀찮겠지만..이렇게 단순하게 처리 할 것 같습니다.
댓글 0
조회수 1,235등록된 댓글이 없습니다.