2011-10-29 3 views
2

저는 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(); 
    } 

모든 것이 예상대로 작동합니다. 내가 원래의 "데이터"변수를 이동시키고 타이프 캐스팅하는 방법에는 분명히 어떤 종류의 문제가 있지만 동일한 결과로 모든 종류의 순열을 시도했습니다. 누군가 내가 잘못 될지도 모른다는 점을 지적 해 주면 많은 도움이 될 것입니다.

+1

증가 및 왼쪽 시프 팅을 수행하는 코드를 표시 할 수 있습니까? 코드가 좋지 않을 수도 있습니다. –

+0

우리에게 전화 코드를 보여주십시오 ... –

+0

gcc는 실제로 1077WriteDiv를 식별자로 사용하지 않습니다. 실제 코드를 보여줄 수 있습니까? –

답변

1

당신은 당신이 제거하려고하는 상위 비트를 삭제하는 작은 INT로 캐스팅에 의존 할 수

uint8_t upperByte = (uint8_t) ((data & 0x3FC) >> 2); 

을보십시오.

1
i2c_write(thing++); 

귀하의 전화를 할 때마다 분배기가 증가한다는 뜻입니다. "데이터"를 증가시키고 2만큼 오른쪽으로 시프트하면 디바이더가 매번 번씩 증가합니다. 콜. 귀하의 두 코드 섹션은 동일하지 않습니다.

이 함수를 어떤 간격으로 호출하고 있습니까? "쓰레기"는 무엇입니까? 함수에 전달 된 값이 정확한지 어떻게 알 수 있습니까? DS1077에 전송 된 값이 잘못되었음을 어떻게 알 수 있습니까?

가정 사항을 모두 확인하십시오.

나에게 캐스트와 시선이 잘 보입니다. 적어도 나는 그들이 사용했던 C 컴파일러에서 일할 것이라고 생각한다. 는 C 표준의 관점에서 당신은 (ISO/IEC 9899:TC2 6.3 변환)이 초안을 참조 할 수 있습니다 : 새로운 유형의 서명되지 않은 경우

그렇지 않으면, 값이 반복적으로 추가하거나 을 그 최대 값보다 하나를 뺀 에 의해 변환된다 값이 범위에 속할 때까지 새 유형으로 나타낼 수 있습니다. 새 유형

현재 내가 액세스 할 수있는 것은 하나뿐입니다. 아마도 다른 사람이 표준 질문에 귀를 기울일 수 있습니다. 컴파일러는 표준을 준수하지 않을 수도 있습니다 ...

+0

불행히도 이것은 다소 불분명 한 하드웨어 문제라고 생각합니다. 디스어셈블러를 신중하게보고 시뮬레이터의 코드를 실행하는 데 몇 시간을 보냈으며 시뮬레이션에서 모든 것이 완벽하게 작동합니다._software_가 제대로 작동하지 않는 이유를 찾는 데 정말로 어려움을 겪고 있습니다. – Bitrex

+0

@Bitrex는 상세한 조사 결과와 함께 질문을 수정하고 누군가가 당신을 도울 수 있습니다 ... 불행히도 대부분의 문제는 "duh"momemnt :-)까지 모호합니다. –