저는 AVR 마이크로 컨트롤러를 사용하여 I2C 버스를 통해 프로그램 가능한 주파수 분배기 칩에 쓰고 있습니다.AVR GCC - 형변환 문제
void 1077WriteDiv(int16_t data)
{
uint8_t upperByte = (uint8_t)((uint16_t)data>>2);
i2c_start(DS1077_BASE_ADDRESS);
i2c_write(DIVIDE_REGISTER);
i2c_write(upperByte);
i2c_write(0x0);
i2c_stop();
}
나는 "데이터"에 10 비트 값의 상위 8 비트를 얻으려고 : 특정 간격으로 나는 칩의 주파수 출력을 업데이트하기 위해 호출되는 다음과 같은 기능을 가지고하려고 해요 변수와 그것을 밖으로 씁니다. 두 번째 "쓰기"명령은 칩의 "나누기"레지스터의 하위 8 비트를 쓰며이 경우 0입니다.
"데이터"변수 (특정 이유로 서명해야 함)를 0부터 시작하여 2 비트 왼쪽으로 이동하고 매번이 함수를 호출하는 테스트 사례입니다. 나는 쓰레기를 버린다. 그러나 이렇게 할 때 :
void 1077WriteDiv(int16_t data)
{
//uint8_t upperByte = (uint8_t)((uint16_t)data>>2);
static uint8_t thing = 0;
i2c_start(DS1077_BASE_ADDRESS);
i2c_write(DIVIDE_REGISTER);
i2c_write(thing++);
i2c_write(0x0);
i2c_stop();
}
모든 것이 예상대로 작동합니다. 내가 원래의 "데이터"변수를 이동시키고 타이프 캐스팅하는 방법에는 분명히 어떤 종류의 문제가 있지만 동일한 결과로 모든 종류의 순열을 시도했습니다. 누군가 내가 잘못 될지도 모른다는 점을 지적 해 주면 많은 도움이 될 것입니다.
증가 및 왼쪽 시프 팅을 수행하는 코드를 표시 할 수 있습니까? 코드가 좋지 않을 수도 있습니다. –
우리에게 전화 코드를 보여주십시오 ... –
gcc는 실제로 1077WriteDiv를 식별자로 사용하지 않습니다. 실제 코드를 보여줄 수 있습니까? –