Отговори на тема  [ 29 мнения ]  Отиди на страница 1, 2  Следваща
Трансформиране на unsigned в char MikroC 
Автор Съобщение
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Нед Юли 22, 2007 8:57 pm
Мнения: 607
Местоположение: Белград
Мнение Трансформиране на unsigned в char MikroC
Налага ми се да използвам външен EEPROM 24c64 в МикроC, но не мога да се сетя за начин как да превърна адреса(двубайтово число) в две числа по един байт (например: unsigned EEADDR_Full +> char EEADDR_LO и EEADDR_HI). Имах някакви подобни примери, но вече трети ден безуспешно търся из файловете с кодове. По смътни спомени, ставаше с цикъл и превъртане наляво на битовете, но... засега - блокаж.

_________________
http://www.szrefekt.com


Нед Мар 06, 2011 11:48 pm
Профил WWW
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Чет Мар 19, 2009 8:33 pm
Мнения: 804
Мнение 
Имам един пример на CCS , дървен е , но дано добиеш представа.

Но тук си викам 2 пъти функцията( така ми е удобно за целите ) със едно и също data , за да получа две числа

Код:
int8 Cut16BitTo8Bit(int16 data)
{
int8 Cutdata;

   If( BytePos==Low)  //    XX 00
   
                           {
                              Cutdata=data >> 8; //-> XX
                                BytePos=High;
                           }
                               else     //   00 XX
                                {
                                  Cutdata=data;  //-> 00
                                  BytePos=Low;
                                }

            RETURN Cutdata;


Пон Мар 07, 2011 12:00 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Код:
typedef union
{
u16 address;
struct
{
u8 low;
u8 hi;
}part;
}addr_t;


и в кода си дефинираш

addr_t my_addr;

my_addr.part.low = xxxx; // променяш младшия байт
my_addr.part.hi = xxxx; // променяш старшия байт
my_addr.address = xxxxx; // задаваш целия адрес


Пон Мар 07, 2011 12:01 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
да не забравиш да си дефинираш u8 и u16 преди да пробваш да компилираш примера ;)


Пон Мар 07, 2011 12:04 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Нед Юли 22, 2007 8:57 pm
Мнения: 607
Местоположение: Белград
Мнение 
Благодаря много!
Като попа от вица, след като зададох въпроса и се сетих къде съм го забравил(примера). Това съм го търсил и преди. И се събраха няколко подхода. Сега трябва да се появят тези, които ми помогнаха преди година за същото и да ме овикат(с пълно право, разбира се).

_________________
http://www.szrefekt.com


Пон Мар 07, 2011 12:12 am
Профил WWW
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Пет Авг 07, 2009 4:58 pm
Мнения: 273
Мнение 
Така написано за мен е най-разбираемо:

byte1 = intVariable >> 8;
byte2 = intVariable;


Пон Мар 07, 2011 1:14 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Нед Юли 22, 2007 8:57 pm
Мнения: 607
Местоположение: Белград
Мнение 
marcuka68 написа:
Така написано за мен е най-разбираемо:

byte1 = intVariable >> 8;
byte2 = intVariable;


Точно това употребих и аз. Използва се в примера за ADC на MikroC.
Миналата година някой ми беше пуснал един много интересен подход, който също работи: записва се intVariable в на предварително известен адрес от паметта и след това се вземат по отделно стойностите на тази и съседната клетка(където се разполага вторият байт). Единственото ми притеснение беше, че съм срещал известни резерви специално към MikroC, че понякога може да се случи да използва за друго същите клетки и да омаже нещата.

_________________
http://www.szrefekt.com


Пон Мар 07, 2011 1:55 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Май изобщо не си схванал как се работи с union и предимствата от това. Жалко


Пон Мар 07, 2011 2:06 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Такива union-и са опасно нещо ... :oops:
Процесорите са различни индианци - някои са големи, други са малки ... проблеми с преносимостта.


Пон Мар 07, 2011 2:18 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
При 8 битовите няма проблем с подравняването. Единствено трябва да се отчита дали е big или litle endian процесора. Ама тия хубостници друго освен PIC не отбират така или иначе.

Иначе компилаторите добре се справят с union - ите и не товарят кода с излишни глупости. Hi-Tech точно с PIC често твореше много глупости като не се изразиш достатъчно точно. MicroC то като имаме пред вид че е един клас надолу от него ... мани мани.


Пон Мар 07, 2011 2:30 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
bateAz написа:
Такива union-и са опасно нещо ... :oops:
Процесорите са различни индианци - някои са големи, други са малки ... проблеми с преносимостта.


от union - по ефективно решение няма !
колкото до преносимостта - за всяко нещо си има решение (#if ... )!

... само дето автора на темата е "далече" от програмирането (на каквото и да е) !


Пон Мар 07, 2011 2:36 pm
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Нед Юли 22, 2007 8:57 pm
Мнения: 607
Местоположение: Белград
Мнение 
Nikola Kirov написа:
Май изобщо не си схванал как се работи с union и предимствата от това. Жалко

Само тръгнах по линията на най-малкото съпротивление. Ще изпробвам как работи, разбира се, но ще е в първия свободен момент. За даденото приложение ми се струва по-удачно да добавя два реда. Благодаря за помощта!

ps66, вероятно си прав. Все пак се придържам към едно много изгодно правило: че когато "нещото", от чието програмиране съм "далеч" тръгне, няма нужда да се доказвам. За онова, за което мисля, че наистина съществува риск при изпълнението, просто плащам, за да ми се направи. Даденото устройство, което разширявам, ми носи добри доходи вече две години и до момента няма нито една рекламация.

_________________
http://www.szrefekt.com


Пон Мар 07, 2011 3:03 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Яну 19, 2007 9:16 am
Мнения: 1063
Местоположение: путинофили: "иди н***й"
Мнение 
E1 написа:
...
ps66, вероятно си прав. Все пак се придържам към едно много изгодно правило: че когато "нещото", от чието програмиране съм "далеч" тръгне, няма нужда да се доказвам. За онова, за което мисля, че наистина съществува риск при изпълнението, просто плащам, за да ми се направи. Даденото устройство, което разширявам, ми носи добри доходи вече две години и до момента няма нито една рекламация.


Не мога да повярвам. че "програмист" не може (И НЕ ИСКА) да разбере нещо толкова елементарно като union !

Всичко останало което съм написал ... произтича от това (няма да коментирам у-вото ти - освен ако ти нямаш желание за това :) )!


Пон Мар 07, 2011 5:19 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
По възможност избягвайте union!

Елегантно е, но създава много главоболия с преносимостта. Различните компилатори третират по различен начин подравняването, пакетирането и/или размера на union. Освен това има разлика между С и С++, където union e клас и не може да е POD. Макар че в последните ревизии на стандарта уж го оправиха, но ще мине известно време докато стане достъпно...


Пон Мар 07, 2011 5:47 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Окт 31, 2004 9:19 pm
Мнения: 4464
Местоположение: Stara Zagora
Мнение 
Сега вече ме изненада с този uinion - клас в C++. Винаги съм си задавал подравняването явно с съответната pragma и не съм имал ядове. Но е наситина интересно. Да имаш идея къде има написано по въпроса?


Пон Мар 07, 2011 5:54 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 29 мнения ]  Отиди на страница 1, 2  Следваща

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 2 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни