Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с типами?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
Jenya7
Привет всем!
Тула IAR C/C++ Compiler for AVR 5.51.0.
Столкнулся с проблемой.
В ir.c:
CODE
union UWORD
{
int VALUE;
struct
{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
unsigned char bit8:1;
unsigned char bit9:1;
unsigned char bit10:1;
unsigned char bit11:1;
unsigned char bit12:1;
unsigned char bit13:1;
unsigned char bit14:1;
unsigned char bit15:1;
}bits;
};

union UWORD ir_bits = {0};

char get_rc5_bit(void)
{
delay_us(1650);
return IR_IN;
}

int GetRc5Data(void)
{
delay_us(3000);
tb = IR_IN; //ToggBit
//get address
ir_bits.bits.bit10 = get_rc5_bit();
ir_bits.bits.bit9 = get_rc5_bit();
ir_bits.bits.bit8 = get_rc5_bit();
ir_bits.bits.bit7 = get_rc5_bit();
ir_bits.bits.bit6 = get_rc5_bit();
//get command
ir_bits.bits.bit5 = get_rc5_bit();
ir_bits.bits.bit4 = get_rc5_bit();
ir_bits.bits.bit3 = get_rc5_bit();
ir_bits.bits.bit2 = get_rc5_bit();
ir_bits.bits.bit1 = get_rc5_bit();
ir_bits.bits.bit0 = get_rc5_bit();
return ir_bits.VALUE;
}


В main.c:
Код
volatile char ir_com;
volatile char ir_add;
volatile int ir_code;

if(intflag.ir)   //IR remote pressed
    {
      ir_code = GetRc5Data();
      ir_com = ir_code & 0x003F;     //bit0-bit5
      SendInt("ir command: ",ir_com);
      ir_add = (ir_code & 0x07C0) >> 6;  //bit6-bit10
      //ir_add = (ir_code >> 6) & 0x1F; - actually the same
      SendInt("ir address: ",ir_add);
      intflag.ir = 0;
    }


Проблема в том что в ir_com я получаю корректный результат, а в ir_add я получаю ерунду( т.е 0).
К тому же при компиляции вылетает:Warning[w6]: Type conflict for external/entry "GetRc5Data", in module main against external/entry in module ir; function return types are different; different
basic types
Буду признателен если кто нибудь прояснит где я напортачил.
Xenia
Похоже на то, что в модуле main.c компилятор полагает, что функция GetRc5Data() возвращает char, а int. И поэтому старший байт возвращаемого ею значения в переменную ir_code не копирует.

В этой ситуации виноваты вы, а не компилятор, т.к. именно вы были обязаны познакомить компилятор с прототипом внешней функции раньше, чем ее использовать. Обычно в случаях, когда функция определена в одном модуле, а используется в другом, положено описывать прототип такой функции в (самодельном) хидере, которой инклюдить в ОБА модуля.
Jenya7
У меня есть хедер
ir.h:
Код
#ifndef IR_H
#define IR_H

#define F_CPU 8000000  
#define delay_us(us)  (__delay_cycles((F_CPU / 1000000UL) * (us)))

#define IR_IN PIND_Bit0    //IR signal

char get_rc5_bit(void);
int GetRc5Data(void);

#endif


и он включен в обоих файлах ir.c и main.c
Xenia
Цитата(Jenya7 @ Mar 30 2012, 17:48) *
У меня есть хедер ir.h:
и он включен в обоих файлах ir.c и main.c

Странно. Тогда временно явно установите в единичку старшие биты в теле функции GetRc5Data():
Код
ir_bits.bits.bit10 = 1;
ir_bits.bits.bit9 = 1;
ir_bits.bits.bit8 = 1;
ir_bits.bits.bit7 = 1;

чтобы проверить, она в этом виновата или get_rc5_bit() выдает нули.
Jenya7
При этом я получаю ir_add = 3 что неверно.
Тот же код скомпилированный в AVR GCC дает абсолютно корректный результат ir_add = 21 , ir_com зависит от нажатой кнопки.
Jenya7
Извиняюсь. Это я что то напутал, подключил хедер с одной папки си-файл с другой, как то криво скомпилировалось наверно.
Код работает, все замечательно. Спасибо всем. sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.