센서 > mpu6050_writeBits() 함수 설명

TODAY239 TOTAL2,276,461
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


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 data

        b = (b&bitMask) | data;
        mpu6050_writeByte(regAddr,b);
    }
}

선언부를 다시 만들어야 해서 귀찮겠지만..이렇게 단순하게 처리 할 것 같습니다.

 

댓글 0

조회수 1,235

등록된 댓글이 없습니다.

센서HOME > 센서 > 자이로센서 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기