45(16) = 4*16+5 = 69(10)masmax писал(а):Ладно видимо это задача не имеет простого решения.
Вопросы по С/С++ (СИ)
- Gudd-Head
- Друг Кота
- Сообщения: 20092
- Зарегистрирован: Чт сен 18, 2008 12:27:21
- Откуда: Столица Мира Санкт-Петербург
Re: Вопросы по С/С++ (СИ)
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
- Реклама
-
Tolmi
- Говорящий с текстолитом
- Сообщения: 1658
- Зарегистрирован: Вс дек 11, 2011 05:25:04
- Откуда: Киев, Украина
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Если не жаль 256 байт во флеше, можно сделать перекодировку событий RS232 -> кнопки или наоборот через статический предопределенный массив, и потом работать везде только с одним стандартизованным кодом. Это если таких кодов достаточно много. Если не много, то лучше написать функцию приведения из одного кода в другой, с поиском в массиве из пары значений. Что-то типа такого, но это не с МК, это с Электроники-60masmax писал(а):Ну 45 я привел для примера. Есть и другие коды клавиш
Ладно видимо это задача не имеет простого решения. Тогда проще вешать гирлянды из условий, как сейчас и сделано. Всё работает, только код не очень красивый.
Код: Выделить всё
#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: Вопросы по С/С++ (СИ)
Например, так (исходное число N):masmax писал(а):Имеется десятичное число, например 45. Как его перевести в 16-тиричное 0x45?
Код: Выделить всё
((N % 100) / 10) * 16 + (N % 10)45 / 10 = 4
4 * 16 = 64
45 % 10 = 5
64 + 5 = 69 = 0x45
На процессоре, не имеющего аппаратной поддержки деления, дешевле будет привести аналогичным образом шестнадатеричное число к десятичному, если Вам все равно, к какому представлению унифицировать. Там придется делить на 16 и умножать на 10; и то, и другое эффективно реализуется сдвигами.
Ну а какие же тогда имеют?masmax писал(а):Ладно видимо это задача не имеет простого решения.
Любой дурак может писать код. Настоящий профессионал - это тот, кто способен постоянно создавать продукт высокого качества, укладываясь при этом в бюджет.
J. Ganssle
J. Ganssle
Re: Вопросы по С/С++ (СИ)
Да на самом деле человеку не надо никаких преобразований чисел. Ему нужно для события, закодированного одним кодом в посылке в UART, получить другой код, для клавиатуры. Ну, или наоборот.
Коды в общем случае могут быть не по порядку, или без видимой закономерности.
Он просто весьма туманно описал ТЗ
PS но может быть, это я неправильно понял задачу.
Коды в общем случае могут быть не по порядку, или без видимой закономерности.
Он просто весьма туманно описал ТЗ
PS но может быть, это я неправильно понял задачу.
Re: Вопросы по С/С++ (СИ)
у меня вопрос довольно пикантный! как сделать так, что б спад напряжения на ножке, запускал таймер, который в свою очередь при совпадении запустит прерывание! нужно реализовать это как нибудь без постоянного опроса процессором какой то ножки....
- Реклама
- ibiza11
- Поставщик валерьянки для Кота
- Сообщения: 1900
- Зарегистрирован: Сб фев 21, 2009 13:11:40
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
Используйте внешнее прерывание по спаду. в обработчике прерывания просто включаете таймер.
тут следует иметь в виду, что запуск таймера произойдет не сразу, а через несколько тактов, необходимых для входа в прерывание и настройку таймера.
тут следует иметь в виду, что запуск таймера произойдет не сразу, а через несколько тактов, необходимых для входа в прерывание и настройку таймера.
Ставим плюсы: )
- DrGandalf
- Встал на лапы
- Сообщения: 110
- Зарегистрирован: Пн дек 03, 2012 19:31:53
- Откуда: Санкт-Петербург
Re: Вопросы по С/С++ (СИ)
У вас не пикантный вопрос, у вас вопрос не по темеSceam73 писал(а):у меня вопрос довольно пикантный! как сделать так, что б спад напряжения на ножке, запускал таймер, который в свою очередь при совпадении запустит прерывание! нужно реализовать это как нибудь без постоянного опроса процессором какой то ножки....
Как ваш вопрос относится к C/C++? Пишите в ветку где обсуждается соответствующий микропроцессор/контроллер.
Re: Вопросы по С/С++ (СИ)
Извеняюсь, действительно не по теме....
- Redrik Shuhart
- Друг Кота
- Сообщения: 3641
- Зарегистрирован: Пт апр 03, 2009 22:12:58
- Откуда: Из Украины, Кировоградская облась,
Re: Вопросы по С/С++ (СИ)
Розв’язок задачі торгового агента (число міст не більше 7) за алгебраїчним методом Йоу, Даніельсона, Дхавана.
Объясните пожалуйста что от меня хотят( всм что должен сделать), подскажите как, и что такое представляют из себя эти методы...
Объясните пожалуйста что от меня хотят( всм что должен сделать), подскажите как, и что такое представляют из себя эти методы...
Мотание тороидов- вышивание по мужски.
- vitalik_1984
- Поставщик валерьянки для Кота
- Сообщения: 2482
- Зарегистрирован: Пт авг 27, 2010 05:57:06
- Откуда: Тюмень
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Redrik Shuhart эта тема разве посвящена переводу?
А для той ситуации, что вы описали есть уже готовые функции.Нужно перевести гекс в десятичный код и потом работать?
Отнимаете от первого символа тетрады 0x30
сдвигаете на 4 влево, потом от второго символа отнимаете 0x30
и прибавляете к этому числу предыдущий результат.
если буквы, то отнимать больше, чтобы A получилась 10ткой.
для начала бы точно определились что вам нужно конкретно, 0x45 не равно 0x69.masmax писал(а):Протокол стандартный и зашит во многие устройства, поэтому изменять команду 0x45 на команду 0x69 очень геморно.
А для той ситуации, что вы описали есть уже готовые функции.Нужно перевести гекс в десятичный код и потом работать?
Отнимаете от первого символа тетрады 0x30
сдвигаете на 4 влево, потом от второго символа отнимаете 0x30
и прибавляете к этому числу предыдущий результат.
если буквы, то отнимать больше, чтобы A получилась 10ткой.
В поисках истины человек развивается.
Re: Вопросы по С/С++ (СИ)
Redrik Shuhart глянь в Вики : "Задача коммивояжёра", может проблеск понимания появится, а дальше Гуголем, как все. А в этой теме этот вопрос - как о разведении пчел в Антарктиде.
- Redrik Shuhart
- Друг Кота
- Сообщения: 3641
- Зарегистрирован: Пт апр 03, 2009 22:12:58
- Откуда: Из Украины, Кировоградская облась,
Re: Вопросы по С/С++ (СИ)
Гендальф, спасибо.
Ну почему же? мы пишем на сях, а собсно написал туда. Не начинать же левую тему.
Ну почему же? мы пишем на сях, а собсно написал туда. Не начинать же левую тему.
Мотание тороидов- вышивание по мужски.
Re: Вопросы по С/С++ (СИ)
Здесь Си в основном для микроконтроллеров ( встраиваемые системы ) . Для чисто программных вопросов, решаемых на ПК, есть хороший сайт delphi.int.ru . Там не только Дельфи, Си тоже присутствует. Считаю его хорошим, т.к. за непродолжительное время вырос на нем от почти чайника до эксперта 4-го класса, пару недель даже возглавлявшего рейтинг экспертов
Не хвастовства ради ( меня уже в топе нет ) , а констатация фактов : сайт хороший, респект В.Еремину, и ребята там доброжелательные. Впрочем, как большинство и здеся 
Re: Вопросы по С/С++ (СИ)
Хочу спросить совета у гуру. проблема всё таже самая - пишу обработку энкодера. хочу в переменную enc_state разместить биты так, чтобы в 0 и 1 битах было предыдущее состояние контактов энкодера, а во 2-м и 3-ем текущее. Пока эти контакты были подключены к соседним разрядам порта всё было просто: прочитать порт сделать маску и сдвинуть. А тут взбрело в голову поменять немного местами и получилось, что контакты подключены к 4-му и 7-му разрядам порта. Как бы написать это изящно? полагаю запись типасейчас назовут быдлокодерством из-за двойного чтения порта? А еще одну переменную вводить ой как не хочется. И так уже почти на пределе: 222 байта из 256.
Код: Выделить всё
#define ENCA P1IN_bit.P4
#define ENCB P1IN_bit.P7
enc_state = ENCA << 3 | ENCB <<2 | ((enc_state & (1<<3 | 1<<2))>>2); А люди посмотрят и скажут: "Собаки летят. Вот и осень."
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Вопросы по С/С++ (СИ)
Ну почему-же ? Нормальный код. Только маска (&0x0C), ИМХО, не нужна. На место 2-ого и 3-его битов потом встанут значения портов. А остальные биты всегда будут очищены.сейчас назовут быдлокодерством из-за двойного чтения порта?
Код: Выделить всё
enc_state=(enc_state>>2) | (ENCA<<3) | (ENCB<<2);Re: Вопросы по С/С++ (СИ)
хм. надо посмотреть что компилятор накомпилит. Пока сделал юнион с другой переменной, которая в тот момент не используется и из неё беру биты.
Ха! не получается.
Так что только через промежуточную переменную. Пусть будет так.
Ха! не получается.
Код: Выделить всё
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Re: Вопросы по С/С++ (СИ)
С чего это вдруг???Аlex писал(а):А порт,в любом случае, будет читаться дважды, т.к. битов нужно прочитать 2.
А если подумать???
"Я не даю готовых решений, я заставляю думать!"(С)
Re: Вопросы по С/С++ (СИ)
Ладно, ладно, не ругайтесь. Вот так написал:
Сейчас переделаю схему и проверю уже на живом.
Код: Выделить всё
#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: Вопросы по С/С++ (СИ)
А что тут думать ? Если биты висят на разных портах, думай-не думай, а читать придётся дваждыHHIMERA писал(а):С чего это вдруг???Аlex писал(а):А порт,в любом случае, будет читаться дважды, т.к. битов нужно прочитать 2.![]()
А если подумать???


