| Автор |
Съобщение |
|
E1
Ранг: Почетен член
Регистриран на: Нед Юли 22, 2007 8:57 pm Мнения: 607 Местоположение: Белград
|
 Трансформиране на unsigned в char MikroC
Налага ми се да използвам външен EEPROM 24c64 в МикроC, но не мога да се сетя за начин как да превърна адреса(двубайтово число) в две числа по един байт (например: unsigned EEADDR_Full +> char EEADDR_LO и EEADDR_HI). Имах някакви подобни примери, но вече трети ден безуспешно търся из файловете с кодове. По смътни спомени, ставаше с цикъл и превъртане наляво на битовете, но... засега - блокаж.
|
| Нед Мар 06, 2011 11:48 pm |
|
 |
|
amdatlon
Ранг: Почетен член
Регистриран на: Чет Мар 19, 2009 8:33 pm Мнения: 804
|
Имам един пример на CCS , дървен е , но дано добиеш представа.
Но тук си викам 2 пъти функцията( така ми е удобно за целите ) със едно и също data , за да получа две числа
|
| Пон Мар 07, 2011 12:00 am |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
и в кода си дефинираш
addr_t my_addr;
my_addr.part.low = xxxx; // променяш младшия байт
my_addr.part.hi = xxxx; // променяш старшия байт
my_addr.address = xxxxx; // задаваш целия адрес
|
| Пон Мар 07, 2011 12:01 am |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
да не забравиш да си дефинираш u8 и u16 преди да пробваш да компилираш примера 
|
| Пон Мар 07, 2011 12:04 am |
|
 |
|
E1
Ранг: Почетен член
Регистриран на: Нед Юли 22, 2007 8:57 pm Мнения: 607 Местоположение: Белград
|
Благодаря много!
Като попа от вица, след като зададох въпроса и се сетих къде съм го забравил(примера). Това съм го търсил и преди. И се събраха няколко подхода. Сега трябва да се появят тези, които ми помогнаха преди година за същото и да ме овикат(с пълно право, разбира се).
|
| Пон Мар 07, 2011 12:12 am |
|
 |
|
marcuka68
Ранг: Ориентиран
Регистриран на: Пет Авг 07, 2009 4:58 pm Мнения: 273
|
Така написано за мен е най-разбираемо:
byte1 = intVariable >> 8;
byte2 = intVariable;
|
| Пон Мар 07, 2011 1:14 pm |
|
 |
|
E1
Ранг: Почетен член
Регистриран на: Нед Юли 22, 2007 8:57 pm Мнения: 607 Местоположение: Белград
|
Точно това употребих и аз. Използва се в примера за ADC на MikroC.
Миналата година някой ми беше пуснал един много интересен подход, който също работи: записва се intVariable в на предварително известен адрес от паметта и след това се вземат по отделно стойностите на тази и съседната клетка(където се разполага вторият байт). Единственото ми притеснение беше, че съм срещал известни резерви специално към MikroC, че понякога може да се случи да използва за друго същите клетки и да омаже нещата.
|
| Пон Мар 07, 2011 1:55 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Май изобщо не си схванал как се работи с union и предимствата от това. Жалко
|
| Пон Мар 07, 2011 2:06 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Такива union-и са опасно нещо ...
Процесорите са различни индианци - някои са големи, други са малки ... проблеми с преносимостта.
|
| Пон Мар 07, 2011 2:18 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
При 8 битовите няма проблем с подравняването. Единствено трябва да се отчита дали е big или litle endian процесора. Ама тия хубостници друго освен PIC не отбират така или иначе.
Иначе компилаторите добре се справят с union - ите и не товарят кода с излишни глупости. Hi-Tech точно с PIC често твореше много глупости като не се изразиш достатъчно точно. MicroC то като имаме пред вид че е един клас надолу от него ... мани мани.
|
| Пон Мар 07, 2011 2:30 pm |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
от union - по ефективно решение няма !
колкото до преносимостта - за всяко нещо си има решение (#if ... )!
... само дето автора на темата е "далече" от програмирането (на каквото и да е) !
|
| Пон Мар 07, 2011 2:36 pm |
|
 |
|
E1
Ранг: Почетен член
Регистриран на: Нед Юли 22, 2007 8:57 pm Мнения: 607 Местоположение: Белград
|
Само тръгнах по линията на най-малкото съпротивление. Ще изпробвам как работи, разбира се, но ще е в първия свободен момент. За даденото приложение ми се струва по-удачно да добавя два реда. Благодаря за помощта!
ps66, вероятно си прав. Все пак се придържам към едно много изгодно правило: че когато "нещото", от чието програмиране съм "далеч" тръгне, няма нужда да се доказвам. За онова, за което мисля, че наистина съществува риск при изпълнението, просто плащам, за да ми се направи. Даденото устройство, което разширявам, ми носи добри доходи вече две години и до момента няма нито една рекламация.
|
| Пон Мар 07, 2011 3:03 pm |
|
 |
|
ps66
Ранг: Форумен бог
Регистриран на: Пет Яну 19, 2007 9:16 am Мнения: 1063 Местоположение: путинофили: "иди н***й"
|
Не мога да повярвам. че "програмист" не може (И НЕ ИСКА) да разбере нещо толкова елементарно като union !
Всичко останало което съм написал ... произтича от това (няма да коментирам у-вото ти - освен ако ти нямаш желание за това  )!
|
| Пон Мар 07, 2011 5:19 pm |
|
 |
|
miro_atc
Ранг: Форумен бог
Регистриран на: Нед Фев 26, 2006 6:52 pm Мнения: 11266 Местоположение: Добрич
|
По възможност избягвайте union!
Елегантно е, но създава много главоболия с преносимостта. Различните компилатори третират по различен начин подравняването, пакетирането и/или размера на union. Освен това има разлика между С и С++, където union e клас и не може да е POD. Макар че в последните ревизии на стандарта уж го оправиха, но ще мине известно време докато стане достъпно...
|
| Пон Мар 07, 2011 5:47 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Сега вече ме изненада с този uinion - клас в C++. Винаги съм си задавал подравняването явно с съответната pragma и не съм имал ядове. Но е наситина интересно. Да имаш идея къде има написано по въпроса?
|
| Пон Мар 07, 2011 5:54 pm |
|
|