Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Изпращане на 12 бита по UART на dsPIC
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=6295
Страница 1 от 1

Автор:  dan [ Пет Ное 21, 2008 12:09 pm ]
Заглавие:  Изпращане на 12 бита по UART на dsPIC

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

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

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

Автор:  setoy [ Пет Ное 21, 2008 12:28 pm ]
Заглавие: 

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

Автор:  bateAz [ Пет Ное 21, 2008 12:55 pm ]
Заглавие: 

Това е типичен случай, в който е добре да се работи с поинтери. Ако не си го правил досега, по-добре се научи, ще ти трябва. А иначе може и по-простичко.
Да допуснем, че ти трябва да предаваш 12-битови числа. Това да се събира в един байт, то е ясно. можеш да ги предаваш с два байта по 6 бита в байт, като за това ползваш битовете b0 - b5. Остават ти 2 свободни бита, които можеш да ползваш за други цели, например да маркираш кога предаваш старшите 6 бита. Примерният код би бил така:

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

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

Автор:  dan [ Пет Ное 21, 2008 2:44 pm ]
Заглавие: 

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

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

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

Автор:  setoy [ Пет Ное 21, 2008 3:16 pm ]
Заглавие: 

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.

Автор:  dan [ Сря Ное 26, 2008 10:22 pm ]
Заглавие: 

Това с юнион-а ми харесва като решение, точно това исках да постигна и със структурата, но не съобразих, че при структурата има запазаено място за всеки един член, а при обединението всички елементи ползват обща памет, размера на която е ограничена от най-големия от тях.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/