реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Как побитно послать число на порт МК?, Как побитно послать число на порт МК?
renni
сообщение Dec 10 2007, 15:38
Сообщение #1





Группа: Новичок
Сообщений: 11
Регистрация: 16-02-07
Из: г.Киев, Украина
Пользователь №: 25 417



Такой вопрос.
Есть комманда (16 битная) которую нужно отправлять на один вывод порта. Я реализовал это следующим образом, но мне не нравится. Может кто то делал это иначе и более компактно.

void tx_data(char command)
{
unsigned int i=0, a = 0x01H;
for (i=0; i<15;i++)
{
P1_1= command&(a>>i);
}
}

Если не сложно предложите более рациональный вариант.
Спасибо.
Go to the top of the page
 
+Quote Post
rezident
сообщение Dec 10 2007, 16:04
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Не будет работать ваша программа правильно smile.gif
Во-первых, если команда 16-и битная, то почему вы передаете в программу char? У вас тип char как 16-и битный определен?
Во-вторых, зачем вы сдвигаете маску на i бит в каждом цикле? Сдвигать нужно только на один бит за каждый проход цикла.
В-третьих, что такое P1_1? Битовая переменная или адрес порта? Если адрес порта, то у вас будет вывод на всем пинам этого порта, а не в один требуемый.
В-четвертых, а после вывода каждого бита разве не нужно временной интервал выдерживать? "Молотите" с максимальной частотой?
В общем вот вариант. Макросы SET_BITCMD, RESET_BITCMD, CMD_DELAY сами определите. Ну и функцию задержки delay тоже.

Код
#define SET_BITCMD
#define RESET_BITCMD
#define CMD_DELAY

void tx_data(unsigned int command)
{ unsigned int i, mask = 0x01;
  for (i=0; i<16; i++)
  {  if  ((command&mask)==0) RESET_BITCMD;
     else SET_BITCMD;
     mask<<=1;
    delay(CMD_DELAY);
  }
}
Go to the top of the page
 
+Quote Post
renni
сообщение Dec 11 2007, 08:31
Сообщение #3





Группа: Новичок
Сообщений: 11
Регистрация: 16-02-07
Из: г.Киев, Украина
Пользователь №: 25 417



В кратце использую Кеил и МК АТ89С2051. Данные отпраляю на один пин порта.
В приведенном выше "коде" опустил всю оставшуюся часть чтобы передать исключительно суть.
Пост писал на работе по памяти по этому не соблюдал "хороший тон", за что прошу прощения.
P1_1 это адрес пина порта.
При написании кода стараюсь его максимально минимизировать.(Очень редко находится время для написания и когда написанно коротко легко вспомнить и понять что делал).
Написанное мною (при исправлении некоторых моментов) работает правильно.
Меня интересует есть ли другой более короткий вариант написания онного.

Благодарю за замечания.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 11 2007, 09:21
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Код
#include   <stdint.h>
void tx_data(uint8_t command)
{
     uint_fast8_t i;
      for (i = 0; i < sizeof(command) * __CHAR_BITS__; i++)
     {
       P1_1 = command & (1 << 0);
       command >>= 1;
     }
}


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение Dec 29 2007, 20:22
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Лично я делаю так:

Код
/******************************************************
*   Преобразует в строку length младших битов         *
*   слова word. Строка dest должна иметь размер       *
*   по меньшей мере length + 1                        *
******************************************************/
char* bitwise(uint32_t word, char* dest, uint8_t length)
{
    register uint8_t i;
    for (i = 0; i < length; i++)
        dest[length - i - 1] = word & (1UL << i) ? '1' : '0';          
    dest[length] = '\0';
    return dest;
}


Потом уже полученную строку пишу в терминал с необходимыми пояснениниями:
Код
char s[17];
uint16_t word = 0xAB;

printf_P(PSTR("Bitwise output of word: %s\n"), bitwise(word, s, 16));
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 06:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01423 секунд с 7
ELECTRONIX ©2004-2016