Отговори на тема  [ 6 мнения ] 
Изпращане на 12 бита по UART на dsPIC 
Автор Съобщение
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Май 29, 2007 2:23 pm
Мнения: 3714
Местоположение: Високо в планината
Мнение Изпращане на 12 бита по UART на dsPIC
Здравейте!
Пробвам се да изпратя резултата от АЦП на dsPIC30f3014 по сериен интерфейс към компютър.
Проблемът е там, че резултата от АЦП е 12 бита и се представя като 16 бита, а регистъра за данни на УАРТ-а е 8 бита и както и да пробвам да изпратя двата байта по отделно, то просто не се получава.
Предполагам, че трябва по някакъв начин със структура от вида:
Код:
struct adc{
   char   byte1;
   char   byte2;
}ADC_result,*ADC_result1;

Но операции от вида:
Код:
ADC_result1=&ADC_result;

и други такива не се компилират.
Някой може ли да даде съвет ка се прави това( изпращането на 12-те бита по УАРТ) и евентуално да ми обясни къде бъркам, pls :(


Пет Ное 21, 2008 12:09 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
Е, естествено че по УАРТ можеш да пращаш по 8 бита - къде е проблема? Пращаш първо единия байт, после другия. Ако не можеш да пращаш нищо, значи УАРТ не ти е конфигуриран правилно или бъркаш някъде. И освен това какво значи "не се компилира" ? Какви грешки изкарва и тн.
Въобще - задай си въпроса малко по конкретно, дай малко код ако трябва... Не карай хората да гадаят :idea:


Пет Ное 21, 2008 12:28 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Сеп 26, 2004 4:11 pm
Мнения: 3750
Местоположение: София
Мнение 
Това е типичен случай, в който е добре да се работи с поинтери. Ако не си го правил досега, по-добре се научи, ще ти трябва. А иначе може и по-простичко.
Да допуснем, че ти трябва да предаваш 12-битови числа. Това да се събира в един байт, то е ясно. можеш да ги предаваш с два байта по 6 бита в байт, като за това ползваш битовете b0 - b5. Остават ти 2 свободни бита, които можеш да ползваш за други цели, например да маркираш кога предаваш старшите 6 бита. Примерният код би бил така:

RS232_Tx_byte( ( (adc_result >> 6) & 0x3F ) | 0x80 ); // Старши байт - първи
RS232_Tx_byte( adc_result & 0x3F ); // Младщи байт

Как ще си подредиш резултата в приемната страна е втори въпрос. Опитай се да го направиш за домашно и прати кода да го видим.
Успех!


Пет Ное 21, 2008 12:55 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Май 29, 2007 2:23 pm
Мнения: 3714
Местоположение: Високо в планината
Мнение 
Много благодаря за отговора. :)
Как не се сетих, че и в С мога да премествам побитово... Мислех си да го напиша на асемблер и да го вмъкна в кода :)
Направих го така:
Разделих думата на старша част от 4 значещи бита и най-старшия- показва, че това е старшата част.:
Код:
result1=(((adc_result >> 8) & 0x0F ) | 0x80 );
WriteUART1(result1);

А младшия- всичките си 8 бита:
Код:
result2=(adc_result & 0xFF );
WriteUART1(result2);

Мисля, че от второто е леко ненужно, но поне не пречи :)
Още веднъж благодаря за помощта.


Пет Ное 21, 2008 2:44 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Фев 17, 2006 9:17 am
Мнения: 765
Местоположение: Стара Загора
Мнение 
dan, явно не съм доразбрал въпроса :)
Ето вариант с указатели

send(*(( char *) &int16_var));
send(*((( char *) &int16_var)+1));

И още един.

union {
int16 a;
int8 ar[2];
} xx;

xx.a=getADC();
send(xx.ar[0]);
send(xx.ar[1]);

Но трябва да имаш предвид litle/big endian.


Пет Ное 21, 2008 3:16 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Май 29, 2007 2:23 pm
Мнения: 3714
Местоположение: Високо в планината
Мнение 
Това с юнион-а ми харесва като решение, точно това исках да постигна и със структурата, но не съобразих, че при структурата има запазаено място за всеки един член, а при обединението всички елементи ползват обща памет, размера на която е ограничена от най-големия от тях.


Сря Ное 26, 2008 10:22 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 6 мнения ] 

Кой е на линия

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


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

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