Вопросы по С/С++ (СИ)

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение Gudd-Head »

masmax писал(а):Ладно видимо это задача не имеет простого решения.
45(16) = 4*16+5 = 69(10)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Tolmi
Говорящий с текстолитом
Сообщения: 1658
Зарегистрирован: Вс дек 11, 2011 05:25:04
Откуда: Киев, Украина
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Tolmi »

masmax писал(а):Ну 45 я привел для примера. Есть и другие коды клавиш :)

Ладно видимо это задача не имеет простого решения. Тогда проще вешать гирлянды из условий, как сейчас и сделано. Всё работает, только код не очень красивый.
Если не жаль 256 байт во флеше, можно сделать перекодировку событий RS232 -> кнопки или наоборот через статический предопределенный массив, и потом работать везде только с одним стандартизованным кодом. Это если таких кодов достаточно много. Если не много, то лучше написать функцию приведения из одного кода в другой, с поиском в массиве из пары значений. Что-то типа такого, но это не с МК, это с Электроники-60 :)))

Код: Выделить всё

#define RC_TABLE_LEN 27 /* max length */
static const _UCHAR recode_table[RC_TABLE_LEN][2]={{27,33},{3,37},{5,38},{7,39},{8,32},{12,40},{15,64},{32,96}};
_UCHAR key_recoder(_UCHAR inchar)
{
 _UCHAR i;
 for (i=0; i<RC_TABLE_LEN-1; i++)
  if(recode_table[i][0]==inchar) return recode_table[i][1];
 return 255;
}
/* .... */

new_event_code=key_recoder(event_code);


In theory, theory and practice are the same. In practice, they're not.
Реклама
Аватара пользователя
Goldsmith
Опытный кот
Сообщения: 736
Зарегистрирован: Пн янв 10, 2011 03:06:36
Откуда: Ростов-на-Дону
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Goldsmith »

masmax писал(а):Имеется десятичное число, например 45. Как его перевести в 16-тиричное 0x45?
Например, так (исходное число N):

Код: Выделить всё

((N % 100) / 10) * 16 + (N % 10)
Проверяем:

45 / 10 = 4
4 * 16 = 64
45 % 10 = 5
64 + 5 = 69 = 0x45

На процессоре, не имеющего аппаратной поддержки деления, дешевле будет привести аналогичным образом шестнадатеричное число к десятичному, если Вам все равно, к какому представлению унифицировать. Там придется делить на 16 и умножать на 10; и то, и другое эффективно реализуется сдвигами.
masmax писал(а):Ладно видимо это задача не имеет простого решения.
Ну а какие же тогда имеют?
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
Cheba
Мучитель микросхем
Сообщения: 447
Зарегистрирован: Ср сен 26, 2012 14:12:47
Откуда: Київ

Re: Вопросы по С/С++ (СИ)

Сообщение Cheba »

Да на самом деле человеку не надо никаких преобразований чисел. Ему нужно для события, закодированного одним кодом в посылке в UART, получить другой код, для клавиатуры. Ну, или наоборот.
Коды в общем случае могут быть не по порядку, или без видимой закономерности.

Он просто весьма туманно описал ТЗ :)

PS но может быть, это я неправильно понял задачу. ;)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

Re: Вопросы по С/С++ (СИ)

Сообщение Sceam73 »

у меня вопрос довольно пикантный! как сделать так, что б спад напряжения на ножке, запускал таймер, который в свою очередь при совпадении запустит прерывание! нужно реализовать это как нибудь без постоянного опроса процессором какой то ножки....
Реклама
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Вопросы по С/С++ (СИ)

Сообщение ibiza11 »

Используйте внешнее прерывание по спаду. в обработчике прерывания просто включаете таймер.
тут следует иметь в виду, что запуск таймера произойдет не сразу, а через несколько тактов, необходимых для входа в прерывание и настройку таймера.
Ставим плюсы: )
Реклама
Аватара пользователя
DrGandalf
Встал на лапы
Сообщения: 110
Зарегистрирован: Пн дек 03, 2012 19:31:53
Откуда: Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение DrGandalf »

Sceam73 писал(а):у меня вопрос довольно пикантный! как сделать так, что б спад напряжения на ножке, запускал таймер, который в свою очередь при совпадении запустит прерывание! нужно реализовать это как нибудь без постоянного опроса процессором какой то ножки....
У вас не пикантный вопрос, у вас вопрос не по теме :)
Как ваш вопрос относится к C/C++? Пишите в ветку где обсуждается соответствующий микропроцессор/контроллер.
Аватара пользователя
Sceam73
Встал на лапы
Сообщения: 86
Зарегистрирован: Вт авг 28, 2012 21:07:09

Re: Вопросы по С/С++ (СИ)

Сообщение Sceam73 »

Извеняюсь, действительно не по теме....
Аватара пользователя
Redrik Shuhart
Друг Кота
Сообщения: 3641
Зарегистрирован: Пт апр 03, 2009 22:12:58
Откуда: Из Украины, Кировоградская облась,

Re: Вопросы по С/С++ (СИ)

Сообщение Redrik Shuhart »

Розв’язок задачі торгового агента (число міст не більше 7) за алгебраїчним методом Йоу, Даніельсона, Дхавана.

Объясните пожалуйста что от меня хотят( всм что должен сделать), подскажите как, и что такое представляют из себя эти методы...
Мотание тороидов- вышивание по мужски.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение vitalik_1984 »

Redrik Shuhart эта тема разве посвящена переводу?
masmax писал(а):Протокол стандартный и зашит во многие устройства, поэтому изменять команду 0x45 на команду 0x69 очень геморно.
для начала бы точно определились что вам нужно конкретно, 0x45 не равно 0x69.
А для той ситуации, что вы описали есть уже готовые функции.Нужно перевести гекс в десятичный код и потом работать?
Отнимаете от первого символа тетрады 0x30
сдвигаете на 4 влево, потом от второго символа отнимаете 0x30
и прибавляете к этому числу предыдущий результат.
если буквы, то отнимать больше, чтобы A получилась 10ткой.
В поисках истины человек развивается.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6319
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Вопросы по С/С++ (СИ)

Сообщение Jack_A »

Redrik Shuhart глянь в Вики : "Задача коммивояжёра", может проблеск понимания появится, а дальше Гуголем, как все. А в этой теме этот вопрос - как о разведении пчел в Антарктиде.
Аватара пользователя
DrGandalf
Встал на лапы
Сообщения: 110
Зарегистрирован: Пн дек 03, 2012 19:31:53
Откуда: Санкт-Петербург

Re: Вопросы по С/С++ (СИ)

Сообщение DrGandalf »

Redrik Shuhart,
по ссылке есть про алгоритм, думаю может помочь.
описание алгоритма.
Аватара пользователя
Redrik Shuhart
Друг Кота
Сообщения: 3641
Зарегистрирован: Пт апр 03, 2009 22:12:58
Откуда: Из Украины, Кировоградская облась,

Re: Вопросы по С/С++ (СИ)

Сообщение Redrik Shuhart »

Гендальф, спасибо.
Ну почему же? мы пишем на сях, а собсно написал туда. Не начинать же левую тему.
Мотание тороидов- вышивание по мужски.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6319
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Re: Вопросы по С/С++ (СИ)

Сообщение Jack_A »

Здесь Си в основном для микроконтроллеров ( встраиваемые системы ) . Для чисто программных вопросов, решаемых на ПК, есть хороший сайт delphi.int.ru . Там не только Дельфи, Си тоже присутствует. Считаю его хорошим, т.к. за непродолжительное время вырос на нем от почти чайника до эксперта 4-го класса, пару недель даже возглавлявшего рейтинг экспертов :-) Не хвастовства ради ( меня уже в топе нет ) , а констатация фактов : сайт хороший, респект В.Еремину, и ребята там доброжелательные. Впрочем, как большинство и здеся :)
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Вопросы по С/С++ (СИ)

Сообщение uldemir »

Хочу спросить совета у гуру. проблема всё таже самая - пишу обработку энкодера. хочу в переменную enc_state разместить биты так, чтобы в 0 и 1 битах было предыдущее состояние контактов энкодера, а во 2-м и 3-ем текущее. Пока эти контакты были подключены к соседним разрядам порта всё было просто: прочитать порт сделать маску и сдвинуть. А тут взбрело в голову поменять немного местами и получилось, что контакты подключены к 4-му и 7-му разрядам порта. Как бы написать это изящно? полагаю запись типа

Код: Выделить всё

#define ENCA P1IN_bit.P4
#define ENCB P1IN_bit.P7

enc_state = ENCA << 3 | ENCB <<2 | ((enc_state & (1<<3 | 1<<2))>>2); 
сейчас назовут быдлокодерством из-за двойного чтения порта? А еще одну переменную вводить ой как не хочется. И так уже почти на пределе: 222 байта из 256.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

сейчас назовут быдлокодерством из-за двойного чтения порта?
Ну почему-же ? Нормальный код. Только маска (&0x0C), ИМХО, не нужна. На место 2-ого и 3-его битов потом встанут значения портов. А остальные биты всегда будут очищены.

Код: Выделить всё

enc_state=(enc_state>>2) | (ENCA<<3) | (ENCB<<2);
А порт,в любом случае, будет читаться дважды, т.к. битов нужно прочитать 2.
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Вопросы по С/С++ (СИ)

Сообщение uldemir »

хм. надо посмотреть что компилятор накомпилит. Пока сделал юнион с другой переменной, которая в тот момент не используется и из неё беру биты.
Ха! не получается.

Код: Выделить всё

Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement 
Так что только через промежуточную переменную. Пусть будет так.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
HHIMERA
Друг Кота
Сообщения: 4583
Зарегистрирован: Вс дек 05, 2010 06:10:34
Откуда: ЮВ

Re: Вопросы по С/С++ (СИ)

Сообщение HHIMERA »

Аlex писал(а):А порт,в любом случае, будет читаться дважды, т.к. битов нужно прочитать 2.
С чего это вдруг??? :))
А если подумать??? :wink:
"Я не даю готовых решений, я заставляю думать!"(С)
Аватара пользователя
uldemir
Друг Кота
Сообщения: 7360
Зарегистрирован: Пт авг 28, 2009 21:34:30
Откуда: 845-й км.

Re: Вопросы по С/С++ (СИ)

Сообщение uldemir »

Ладно, ладно, не ругайтесь. Вот так написал:

Код: Выделить всё

#define ENCA    temp_bit.B4
#define ENCB    temp_bit.B7

union{
  unsigned char i;
  struct {
    unsigned char B0 : 1 ;
    unsigned char B1 : 1 ;
    unsigned char B2 : 1 ;
    unsigned char B3 : 1 ;
    unsigned char B4 : 1 ;
    unsigned char B5 : 1 ;
    unsigned char B6 : 1 ;
    unsigned char B7 : 1 ;
  } temp_bit;
};

....
  // чтение энкодера
  i = P1IN;
  enc_state = ENCA << 3 | ENCB << 2 | (enc_state >> 2);
  switch (enc_state) {
  // Шаг вперед 1011 -> 0010 -> 0100 -> 1101
Сейчас переделаю схему и проверю уже на живом.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: Вопросы по С/С++ (СИ)

Сообщение Аlex »

HHIMERA писал(а):
Аlex писал(а):А порт,в любом случае, будет читаться дважды, т.к. битов нужно прочитать 2.
С чего это вдруг??? :))
А если подумать??? :wink:
А что тут думать ? Если биты висят на разных портах, думай-не думай, а читать придётся дважды :))
Ответить

Вернуться в «Разные вопросы по МК»