Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
17.07.2009, 03:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Си, IAR AVR & Hi Tech PICC
//Непонятка с UNION в HiTech PICC 9.60PL3
//имеем 4 переменых типа char и одну типа long требуется обьединить их союзом.
//обьявляю в IAR AVR 5.20:
Код:
|
union {
struct {
unsigned long BCD0:8,
BCD1:8,
BCD2:8;
BCD3:8;
};
unsigned long BCDL;
}; |
получаю переменную BCDL типа unsigned long и переменные BCD0,BCD1,BCD2,BCD3
типа unsigned char, ко всем переменным можно обращаться по именам, писать и читать, то есть переменные BCD0-3 по адресам совпадают с переменной BCDL что и требовалось получить
//если присвоить
Код:
|
BCDL=0x765453210
//то в переменых получаем:
BCD0=0x10
BCD1=0x32
BCD2=0x54
BCD2=0x76 |
//обьявляю в Hitech PICC 9.60pl3:
Код:
|
union{
struct{
unsigned long bcdl0;
unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
}bcdl0;
}bcdl1; |
в окне переменных (Watch) - вижу переменные bcd0,bcd1,bcd2,bcd3 обьединены союзом bcdl1 ;
но переменные bcd0,bcd1,bcd2,bcd3 не доступны для чтения и записи, как и переменная bcdl0 или bcdl1
//Если сначала обьявляю переменные а потом их обьединяю,
Код:
|
unsigned long bcdl0;
unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
union{
struct{
unsigned long bcdl0;
unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
}bcdl0;
}bcdl1; |
то переменные bcd0,bcd1,bcd2,bcd3 и bcdl видны и доступны для записи чтения, но не совпадают по адресам с переменными (с такими же именами но обьединёными в союз ) bcd0,bcd1,bcd2,bcd3 и bcdl0
которые как и в первом примере не доступны для чтения и записи. То есть просто получаю переменные не оьединёные союзом....
Кто пихнёт в нужном направлении? чего я не так записываю в Hitech, что бы работало как в IAR, то есть правильно.
-- Прилагается рисунок: --
|
|
|
|
17.07.2009, 12:02
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Re: Си, IAR AVR & Hi Tech PICC
Сообщение от picavr
|
//Непонятка с UNION в HiTech PICC 9.60PL3
//имеем 4 переменых типа char и одну типа long требуется обьединить их союзом.
//обьявляю в Hitech PICC 9.60pl3:
Код:
|
union{
struct{
unsigned long bcdl0;
unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
}bcdl0;
}bcdl1; |
в окне переменных (Watch) - вижу переменные bcd0,bcd1,bcd2,bcd3 обьединены союзом bcdl1 ;
но переменные bcd0,bcd1,bcd2,bcd3 не доступны для чтения и записи, как и переменная bcdl0 или bcdl1
|
Так к структурам надо обращатся так наверно: например к переменой bcd3-bcdl1.bcdl0.bcd3,на счет чтоб обращатся ко всей структуре за раз bcdl0 ни разу не встречал.
Сообщение от picavr
|
//Если сначала обьявляю переменные а потом их обьединяю,
Код:
|
unsigned long bcdl0;
unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
union{
struct{
unsigned long bcdl0;
unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
}bcdl0;
}bcdl1; |
то переменные bcd0,bcd1,bcd2,bcd3 и bcdl видны и доступны для записи чтения, но не совпадают по адресам с переменными (с такими же именами но обьединёными в союз ) bcd0,bcd1,bcd2,bcd3 и bcdl0
которые как и в первом примере не доступны для чтения и записи. То есть просто получаю переменные не оьединёные союзом....
|
Так это и правельно,ведь ты объявляеш переменые отдельные,структуры отдельно.
-- Прилагается рисунок: --
|
|
|
|
17.07.2009, 15:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Сообщение от CERGEI1982
|
Так к структурам надо обращатся так наверно: например к переменой bcd3-bcdl1.bcdl0.bcd3,на счет чтоб обращатся ко всей структуре за раз bcdl0 ни разу не встречал.
|
bcdl0 - здесь я хочу обратится не к структуре, а к переменной LONG, которая обьединена союзом со структурой...
Сообщение от CERGEI1982
|
Так это и правельно,ведь ты объявляеш переменые отдельные,структуры отдельно.
|
Ну это я типа догадался.. что отдельно... но как их обьединить... я подумал может нужно сначала их обьявить а потом обьеденинить?... если через обьявление UNION не работает... имена показывает а доступа нет...
Код:
|
union{
struct{
unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
}bcdl0;
}; |
в IAR AVR всё работает.. может Hitech не уммеет обьединять структуры?
Или как правильно записать?
обьединение структуры из 4-х unsigned char переменных и unsigned long переменной...
|
|
|
|
17.07.2009, 15:16
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.06.2005
Сообщений: 1,389
Сказал спасибо: 19
Сказали Спасибо 210 раз(а) в 156 сообщении(ях)
|
Код:
|
union
{ unsigned long bcdl0;
struct
{ unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
} bcdl0;
} bcdl1; |
или даже если компилятор понимает безымянные структуры
Код:
|
union
{ unsigned long bcdl0;
struct
{ unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
};
} bcdl1; |
|
|
|
|
17.07.2009, 15:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
спасибо ТЕНЬ... но на эти записи компилятор ругается...
я уже по всякому перепробовал записывать...
Код:
|
union
{ unsigned long bcdl0;
struct
{ unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
}bcdl0;
} bcdl1; |
Error [261] W:NutStarmain.c; 85.7 struct/union member "bcdl0" redefined
Код:
|
union
{ unsigned long bcdl0;
struct
{ unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
};
} bcdl1; |
Error [285] W:NutStarmain.c; 85.2 no identifier in declaration
Код:
|
union
{
struct
{ unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
}bcdl0;
} bcdl1; |
не ругается.. переменные bcd0-bcd3, структура bcdl0 и союз bcdl1 видны в окне WATCH... но доступа к ним нет из программы:
Код:
|
void main(void){
while(1){
bcd0=0x10;
}
} |
Error [192] W:NutStarmain.c; 94.1 undefined identifier "bcd0"
|
|
|
|
17.07.2009, 15:32
|
|
Почётный гражданин KAZUS.RU
Регистрация: 03.01.2007
Адрес: Россия,Иркутская обл.
Сообщений: 2,579
Сказал спасибо: 351
Сказали Спасибо 315 раз(а) в 193 сообщении(ях)
|
Видел как массивы под один указатель собирают http://www.microchip.su/showthread.php?t=6122
может этот ход получится и со структурами
|
|
|
|
17.07.2009, 15:36
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.06.2005
Сообщений: 1,389
Сказал спасибо: 19
Сказали Спасибо 210 раз(а) в 156 сообщении(ях)
|
Код:
|
union
{ unsigned long bcd_long;
struct
{ unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
} bcd_bytes;
} bcdl1; |
ну конечно. у union были одинаковые имена полей. Попробуй так - должно пройти.
|
|
|
|
17.07.2009, 19:52
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Сообщение от TEHb
|
Код:
|
union
{ unsigned long bcd_long;
struct
{ unsigned char bcd0;
unsigned char bcd1;
unsigned char bcd2;
unsigned char bcd3;
} bcd_bytes;
} bcdl1; |
ну конечно. у union были одинаковые имена полей. Попробуй так - должно пройти.
|
Спасибо, но я подставлял разные имена в имена полей. Результат один.. обьявление союза - компилируется без ошибок.. и появляется в окошке переменных WATCH в MPLABе, но когда добавяешь чтение или запись в bcd_long или bcd0-3
Код:
|
bcd_long=0x123456;
bcd0=0x12;
bcd1=0x34;
bcd2=0x56;
bcd3=0x78; |
компилятор ругается ))))хотя вроде бы всё правильно..
undefined identifier "bcd_long"
undefined identifier "bcd0"
undefined identifier "bcd1"
undefined identifier "bcd2
undefined identifier "bcd3"
Перепробовал компиляторы
9.50PL2
9.60PL1
9.60PL3
это заговор компиляторов издеваются ))))
имена видны а обратиться низя...
-- Прилагается рисунок: --
|
|
|
|
17.07.2009, 19:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.06.2005
Сообщений: 1,389
Сказал спасибо: 19
Сказали Спасибо 210 раз(а) в 156 сообщении(ях)
|
А если так:
Код:
|
longchar.bcd_long = 0x12345678; |
|
|
|
|
17.07.2009, 20:17
|
|
Почётный гражданин KAZUS.RU
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
|
Сообщение от TEHb
|
А если так:
Код:
|
longchar.bcd_long = 0x12345678; |
|
Пипец просто... так сработало )) а тогда обращаться к структуре так ...
Код:
|
longchar.bcd_bytes.bcd0 = 0x23; |
А где указана такая форма записи для обращения к элементу союза?...
Ужас с этим Си.. у каждого компилятора свои тараканы...
А к примеру в IAR AVR обращение было бы обычное как к переменным обьявленым обычноым образом...
Код:
|
bcd_long = 0x01234567; |
А ведь это ещё не расширения для МК... это по моему чистый СИ... И по идее форма записи союзов - должна быть одинакова у всех компиляторов... ПИПЕЦ ПРОСТО!!! отбивает охоту изучать СИ с такими выкрутасами ...
Спасибо.. ТЕНЬ
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
HI-TECH PICC™ Enterprise Edition (new!!!)???
|
shihaidong |
Микроконтроллеры, АЦП, память и т.д |
14 |
30.12.2011 15:45 |
Библиотеки LCD 44780 на С CCS или HI-TECH PICC для PIC16
|
vsvetlov |
Микроконтроллеры, АЦП, память и т.д |
15 |
27.10.2009 08:03 |
IAR for AVR & Assembler
|
GLVlad |
Микроконтроллеры, АЦП, память и т.д |
3 |
04.06.2008 16:46 |
Вопрос новичка. IAR C, AVR & interrupt
|
sns13 |
Микроконтроллеры, АЦП, память и т.д |
5 |
18.03.2008 18:08 |
PIC18F.., HI-TECH PICC-18 и MPLAB
|
avartemiy |
Микроконтроллеры, АЦП, память и т.д |
11 |
20.08.2007 02:35 |
Часовой пояс GMT +4, время: 09:41.
|
|