| Микроконтролери и електроника 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 бита и както и да пробвам да изпратя двата байта по отделно, то просто не се получава. Предполагам, че трябва по някакъв начин със структура от вида:
Но операции от вида:
и други такива не се компилират. Някой може ли да даде съвет ка се прави това( изпращането на 12-те бита по УАРТ) и евентуално да ми обясни къде бъркам, pls |
|||||||||||||||||||
| Автор: | setoy [ Пет Ное 21, 2008 12:28 pm ] |
| Заглавие: | |
Е, естествено че по УАРТ можеш да пращаш по 8 бита - къде е проблема? Пращаш първо единия байт, после другия. Ако не можеш да пращаш нищо, значи УАРТ не ти е конфигуриран правилно или бъркаш някъде. И освен това какво значи "не се компилира" ? Какви грешки изкарва и тн. Въобще - задай си въпроса малко по конкретно, дай малко код ако трябва... Не карай хората да гадаят |
|
| Автор: | 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 значещи бита и най-старшия- показва, че това е старшата част.:
А младшия- всичките си 8 бита:
Мисля, че от второто е леко ненужно, но поне не пречи Още веднъж благодаря за помощта. |
|||||||||||||||||||
| Автор: | 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/ |
|