| Микроконтролери и електроника http://mcu-bg.com/mcu_site/ |
|
| Трансформиране на unsigned в char MikroC http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=8678 |
Страница 1 от 2 |
| Автор: | E1 [ Нед Мар 06, 2011 11:48 pm ] |
| Заглавие: | Трансформиране на unsigned в char MikroC |
Налага ми се да използвам външен EEPROM 24c64 в МикроC, но не мога да се сетя за начин как да превърна адреса(двубайтово число) в две числа по един байт (например: unsigned EEADDR_Full +> char EEADDR_LO и EEADDR_HI). Имах някакви подобни примери, но вече трети ден безуспешно търся из файловете с кодове. По смътни спомени, ставаше с цикъл и превъртане наляво на битовете, но... засега - блокаж. |
|
| Автор: | amdatlon [ Пон Мар 07, 2011 12:00 am ] | |||||||||
| Заглавие: | ||||||||||
Имам един пример на CCS , дървен е , но дано добиеш представа. Но тук си викам 2 пъти функцията( така ми е удобно за целите ) със едно и също data , за да получа две числа
|
||||||||||
| Автор: | Nikola Kirov [ Пон Мар 07, 2011 12:01 am ] | |||||||||
| Заглавие: | ||||||||||
и в кода си дефинираш addr_t my_addr; my_addr.part.low = xxxx; // променяш младшия байт my_addr.part.hi = xxxx; // променяш старшия байт my_addr.address = xxxxx; // задаваш целия адрес |
||||||||||
| Автор: | Nikola Kirov [ Пон Мар 07, 2011 12:04 am ] |
| Заглавие: | |
да не забравиш да си дефинираш u8 и u16 преди да пробваш да компилираш примера |
|
| Автор: | E1 [ Пон Мар 07, 2011 12:12 am ] |
| Заглавие: | |
Благодаря много! Като попа от вица, след като зададох въпроса и се сетих къде съм го забравил(примера). Това съм го търсил и преди. И се събраха няколко подхода. Сега трябва да се появят тези, които ми помогнаха преди година за същото и да ме овикат(с пълно право, разбира се). |
|
| Автор: | marcuka68 [ Пон Мар 07, 2011 1:14 pm ] |
| Заглавие: | |
Така написано за мен е най-разбираемо: byte1 = intVariable >> 8; byte2 = intVariable; |
|
| Автор: | E1 [ Пон Мар 07, 2011 1:55 pm ] | |||||||||
| Заглавие: | ||||||||||
Точно това употребих и аз. Използва се в примера за ADC на MikroC. Миналата година някой ми беше пуснал един много интересен подход, който също работи: записва се intVariable в на предварително известен адрес от паметта и след това се вземат по отделно стойностите на тази и съседната клетка(където се разполага вторият байт). Единственото ми притеснение беше, че съм срещал известни резерви специално към MikroC, че понякога може да се случи да използва за друго същите клетки и да омаже нещата. |
||||||||||
| Автор: | Nikola Kirov [ Пон Мар 07, 2011 2:06 pm ] |
| Заглавие: | |
Май изобщо не си схванал как се работи с union и предимствата от това. Жалко |
|
| Автор: | bateAz [ Пон Мар 07, 2011 2:18 pm ] |
| Заглавие: | |
Такива union-и са опасно нещо ... Процесорите са различни индианци - някои са големи, други са малки ... проблеми с преносимостта. |
|
| Автор: | Nikola Kirov [ Пон Мар 07, 2011 2:30 pm ] |
| Заглавие: | |
При 8 битовите няма проблем с подравняването. Единствено трябва да се отчита дали е big или litle endian процесора. Ама тия хубостници друго освен PIC не отбират така или иначе. Иначе компилаторите добре се справят с union - ите и не товарят кода с излишни глупости. Hi-Tech точно с PIC често твореше много глупости като не се изразиш достатъчно точно. MicroC то като имаме пред вид че е един клас надолу от него ... мани мани. |
|
| Автор: | ps66 [ Пон Мар 07, 2011 2:36 pm ] | |||||||||
| Заглавие: | ||||||||||
от union - по ефективно решение няма ! колкото до преносимостта - за всяко нещо си има решение (#if ... )! ... само дето автора на темата е "далече" от програмирането (на каквото и да е) ! |
||||||||||
| Автор: | E1 [ Пон Мар 07, 2011 3:03 pm ] | |||||||||
| Заглавие: | ||||||||||
Само тръгнах по линията на най-малкото съпротивление. Ще изпробвам как работи, разбира се, но ще е в първия свободен момент. За даденото приложение ми се струва по-удачно да добавя два реда. Благодаря за помощта! ps66, вероятно си прав. Все пак се придържам към едно много изгодно правило: че когато "нещото", от чието програмиране съм "далеч" тръгне, няма нужда да се доказвам. За онова, за което мисля, че наистина съществува риск при изпълнението, просто плащам, за да ми се направи. Даденото устройство, което разширявам, ми носи добри доходи вече две години и до момента няма нито една рекламация. |
||||||||||
| Автор: | ps66 [ Пон Мар 07, 2011 5:19 pm ] | |||||||||
| Заглавие: | ||||||||||
Не мога да повярвам. че "програмист" не може (И НЕ ИСКА) да разбере нещо толкова елементарно като union ! Всичко останало което съм написал ... произтича от това (няма да коментирам у-вото ти - освен ако ти нямаш желание за това |
||||||||||
| Автор: | miro_atc [ Пон Мар 07, 2011 5:47 pm ] |
| Заглавие: | |
По възможност избягвайте union! Елегантно е, но създава много главоболия с преносимостта. Различните компилатори третират по различен начин подравняването, пакетирането и/или размера на union. Освен това има разлика между С и С++, където union e клас и не може да е POD. Макар че в последните ревизии на стандарта уж го оправиха, но ще мине известно време докато стане достъпно... |
|
| Автор: | Nikola Kirov [ Пон Мар 07, 2011 5:54 pm ] |
| Заглавие: | |
Сега вече ме изненада с този uinion - клас в C++. Винаги съм си задавал подравняването явно с съответната pragma и не съм имал ядове. Но е наситина интересно. Да имаш идея къде има написано по въпроса? |
|
| Страница 1 от 2 | Часовете са според зоната UTC + 2 часа [ DST ] |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|