Перейти к содержанию

Вопросы от начинающих по МК


Рекомендуемые сообщения

Конвертация исходных байтов в hex, каждые 8 значений вставлять для терминала коды 10 и 13. Отображение в терминале указать в ANSII.

Ну я не зря прошу человека :

DmitryS, напишите тут, прямо в сообщении, что хотите видеть в терминале.

Исходя из этого, выберем ему подходящее.

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

Согласен, только надо не только результат показать, но и в каком виде исходные данные.

Т.е. есть ...то-то.. нужно чтоб в терминале было ...то-то...

Потому как мне именно это непонятно. Что за данные? Скольки байтные? То ли они уже в хексах, толи просто числа. Константы указываемые при компиляции или мож массив, набор переменных? Сколькибайтных? и т.п.

Нет никакой заслуги тому, кто даёт золото, думая, что даёт камень (Будда)

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Есть продвинутые терминалы, которые могут данные в нужной форме отобразить. Например, если перед передачей пакеты данных передать коды 0xFFFF и на этот код поставить условие синхронизации в терминале, он стройненько выведет нужные данные по колоночкам. Этим должен заниматься кастомный софт, а стандартный терминал так не умеет.

Название такого терминала не припомню уже, но у него еще много всяких фишек есть в т.ч. разворачивать сырые данные в числа 1-байтные, двухбайтные и т.д.

Но иногда, для целей отладки проще написать свой терминал, на джаве например который бы интерпретировал получаемые данные ровно как тебе нужно.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

В принципе я получил то что хотел , по большому счету я не надеялся , что моя кодописанина собранная из разных кусков заработает с первого раза , однако заработало да и значения вывела , немного неудобо читаемые , но в принципе пойдет .

Сделать конвертацию hex в строку на примере кода mali_robot #5118 я вряд ли смогу , я просто не понимаю как это работает. sprintf и printf , пытался я несколько раз с ними разобраться , но бестолково ... каких то понятий нехватает , по этому и не сростается .

Приемник радиосигналов у меня подключен к второму пину порта Д , пин настроен на вход , без подтягивающего внутреннего резистора , может надо сделать подтяжку , а то что то чувствительность почти ни какая , брелок надо в плотную к антене подносить , только тогда принимает пакеты , да и принимает только с маленького брелка , большой как не подноси не ловит совсем , тут по всей видимости дело в том , что китайский приемник ловит только АМ модуляцию и маленький брелок ратает на АМ модуляции а большой на ЧМ . Сейчас буду искать , у меня где то валялся лобовой трансивер от сигналки . он принимает и то и другое

post-187724-0-18505900-1457960259_thumb.jpg

Ссылка на комментарий
Поделиться на другие сайты

пытался я несколько раз с ними разобраться , но бестолково ...

звучит как то печально

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

печально что такие элементарные вещи вызывают затруднения. Это же стандартная библиотека, бро

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

мне будет стыдно, если не объясню

итак - функция предназначена для преобразования любого числа в строку. Возвращаемое значение (строка с ноликом на конце) заносится в массив символов

sprintf(&EchoBuffer[i*5], "0x%02X", mp3_recv_buf);

&EchoBuffer[i*5] - то место куда будет возвращено значение начиная с символа указанного в скобках. Этэншон - переполнение и выход за границы не проверяется. Результат всегда имеет завершающий символ \000

"0x%02X" - маска формата. Показывает в каком формате вернуть и что к строке прибавить. Тут надо подробнее (по порядку)

0x - просто строка константа. Будет приписываться к любому числу спереди

% - после этого символа sprintf подставит число в формате следующем за %

02Х - означает что всегда будет 2 знакоместа, даже если число состоит из одного знака (F например или 0А). Пустые места заполнятся ноликом (ноль перед двойкой). Х - число отобразится в 16-ричном формате. Иначе если придет 0хF то в строку попадет 2 символа "16", а так будет "F".

mp3_recv_buf - собсна само число, которое должно быть преобразовано. Тут может быть несколько чисел подряд через запятую, но в строке формата обязательно должно быть столько же символов %, иначе будет ошибка

к примеру в mp3_recv_buf сейчас число D. После работы функции в массив &EchoBuffer[i*5] начиная с номера i*5 будет записано следующее "0х0D" точнее "0х0D\000"

самое сложное - понять принцип построения строк формата. Но примеров в гугле масса на эту тему с комментариями. Главное усвоить суть. Очень нужная функция. адеюсь в жизни пригодится

стоит так же помнить, что функция эта довольно тормознутая и сама по себе принимает только аргументы, а потом еще штуки 3 подфункции вызывает. Поэтому я себе сделал вырезку кода из библиотеки и собрал в одну функцию inline void u_sprintf(). Работает намного шустрее

Изменено пользователем mail_robot

Нужно делать то, что нужно. А то, что не нужно, делать не нужно. (С) Винни Пух

Ссылка на комментарий
Поделиться на другие сайты

если придет 0хF то в строку попадет 2 символа "16", а так будет "F".
Исправьте перевод систем счисления что ли.
Тут может быть несколько чисел подряд через запятую, но в строке формата обязательно должно быть столько же символов %, иначе будет ошибка
Стоит уточнить, что не ошибка компиляции, а ошибка при работе программы, то есть при сборке компилятор проглотит и скажет что так и надо, а вот когда запустите получится фигня.
я себе сделал вырезку кода из библиотеки и собрал в одну функцию inline void u_sprintf(). Работает намного шустрее
Зачастую явное, неформатное использовать преобразование числа в строку еще лучше.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Функции sprintf и printf универсальные, но очень тормозные и отбирают много памяти. Проще и наглядней сделать свою функцию преобразования числа типа CHAR/BYTE в 16-ричное представление и использовать её для отправки двоичного значения в терминал в 16-ричном виде. Делов то - разделить байт на две половинки, и по таблице взять один из 16 символов для каждой из половинок. .

Но обычно этого на этом этапе и не нужно - достаточно использовать самописный софт на стороне терминала.

китайский приемник ловит только АМ модуляцию и маленький брелок ратает на АМ модуляции а большой на ЧМ . Сейчас буду искать , у меня где то валялся лобовой трансивер от сигналки . он принимает и то и другое

Он у тебя походу вообще ничего не ловит, а то что он "ловит" это тупо наводка прямо на вход контроллера.

Или ты неправильно используешь приёмник, у которого выход с ОК и ему НЕОБХОДИМА подтяжка.

Изменено пользователем Alexeyslav

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Он у тебя походу вообще ничего не ловит, а то что он "ловит" это тупо наводка прямо на вход контроллера.

Или ты неправильно используешь приёмник, у которого выход с ОК и ему НЕОБХОДИМА подтяжка.

Пробовал я и с подтяжкой и без - ни какой разницы . Выход у него это выход операционника LM358 первая нога , надо достать осциллограф , посмотреть че у него там на выходе
Ссылка на комментарий
Поделиться на другие сайты

С терминалом вроде наладилось , один хороший человек подсказал , как преобразовать

void Send_hex(char a) {
char b;
b=a>>4; if (b<10) b+='0'; else b+='7'; Send_UART(;
b=a&0x0F; if (b<10) b+='0'; else b+='7'; Send_UART(;
} 

Изменено пользователем DmitryS
Ссылка на комментарий
Поделиться на другие сайты

Как это шаманство работает?

Я бы делал проще

if(b<10)b+='0'; else b+=('A'-0x0A);

по крайней мере, понятно, какие символы будут выведены.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

подскажите, кто применял микросхему pl2303hx

подключил для проверки, RX-TX замкнул, шлю данные- возвращается какая то ересь: 1- 127: 55- 100

может у этой микросхемы есть какая то настройка?

Ссылка на комментарий
Поделиться на другие сайты

Как работает я полностью не понимаю , но работает точно . Как понять вот эти записи b+='0'; не понятен 0 в кавычках или 'А'

b+='0' это b = b + '0' - Сложение, совмещённое с присваиванием.

if(b<10)b+='0';else b+=('A'-0x0A);

COKPOWEHEU, видимо имеет ввиду что по предоставленной им строчке сразу видно что по ветке "истино" идет смещение от нуля (цифры), а по ветке "ложно" идут буквы смещение от первой буквы "А".

А так это суть одно и тоже.

Идет сравнение по условию меньше ли десяти. если мень ше надо отобразить цифру, но цыфра начинается с кода 48 = '0'.

Если более 10-ти значит надо отображать буквы (в шестнадцатиричной системе счисления на счет 10 - A, 11 - B, 12 - C, 13 - D, 14 - E. 15 - F).

Но букввы начинаются с кода 65 = 'A'. Т.е. На счет 10 нужна цифра 65, на счет 11 - 66. (65- 10 = 55 это код '7', как в вашем коде. Только у вас 10 + '7' (10 + 55) - согласитесь малопонятно хоть и верно. А у COKPOWEHEU сразу видно в коде символ 'A', т.е. что пошли от буквы 'A' + смещения.

-0x0A

Т.е. минус 10 (кстати этот циферь лучше бы в десятичной оставить). Отнимание необходимо чтобы откинуть цифры от 0 до 9. 'A' - "десятая".

Например пусть b = 12 Нам нужно вывести в терминалку символ 'С' (согласно шестнадцатиричной системе счисления).

А букве 'C' соответствует по таблице ANSII цифра 67. Т.е. наша мегафункция должна вернуть в ответ на цифру 12 цифру 67.

Ну ка проверим.

Условие b<10 (12 <? 10) !! не выполняется идем во ветке else b+=('A'-10); считаем b = b + ('A' - 10) = 12 + (65 - 10) = 67. Что и соответствует символу 'C' по таблице ANSII.

Хотя запись b+=('A'-10) при раскрытии логичнее выглядит в виде b = (b -10) + 'A' а не b = b + ('A' - 10), т.е. (b -10) это конкретно смещение от буквы 'A', впрочем с точки зрения математики разницы нет.

Надеюсь просто объяснил.

Изменено пользователем Microchip

Нет никакой заслуги тому, кто даёт золото, думая, что даёт камень (Будда)

Ссылка на комментарий
Поделиться на другие сайты

Вот за что я не люблю С, когда можно простые функции сократить так что непонятно с первого взгляда как они работают.

И эта фиговая способность языка считать символы 8-битными целыми числами, это тоже путает будь здоров.

B+=5 лучше ВСЕГДА записывать как B = B + 5. Сокращённая форма записи нужна совсем для других случаев, когда одним выражением не обойтись. Но и те случая в принципе тоже могут быть развёрнуты в более понятную форму.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Первые шаги, прошу снисходительно отнестись. Есть устройство, с 4-ями светодиодами, при поступлении сигнал один из -4х или все вместе загораются. Задача увеличить время свечения этих светодиодов. Решил дополнить еще одним МК, Но мыкаюсь ничего не выходит. Не тухнет диод после задержки, и не могу разобрать, как сделать условие для всех входов и выходов. Срабатывает по одному порту, входа, и выхода. Код сокращен, не стал указывать, как пытался сделать функцию для всех портов, чтоб не смешить людей.

Chip type : ATtiny2313

AVR Core Clock frequency: 8,000000 MHz

Memory model : Tiny

External RAM size : 0

Data Stack size : 32

*******************************************************/

#include <io.h>

#include <delay.h>

// Declare your global variables here

void main(void)

{

DDRB=0x00; // порт работает на вход

PORTB=0x00; // установка 0 на выводах

DDRD=0xFF; // порт работает на выход

PORTD=0x00; // установка 0 на выводах.

while (1)

{

if(PINB.0==1)

PORTD.0=1;

delay_ms(300);

PORTD.0=0;

}

}

post-182921-0-86486800-1458495314_thumb.jpg

Изменено пользователем Тарапунька
Ссылка на комментарий
Поделиться на другие сайты

Что непонятного может быть в операторе += (увеличить число) или -= (уменьшить число) чтобы стараться ограничить его использование? Сокращенную запись для того и придумали, чтобы ей пользоваться. Например, не переписывать длинное имя переменной несколько раз, или совершать меньше ошибок при изменении имени переменной.

В чем проблема считать 8-битные коды символов 8-битными числами тоже непонятно. Наоборот, это гораздо удобнее при преобразовании цифры в символ. Проще и понятнее написать x += '0', чем, как в паскале, x := chr( ord(x) + ord('0') );

Вот использовать вместо символа его десятичный или еще какой цифровой код - дикость, потому что сильно снижает понятность кода. Как в том же примере, операция b += '7' гораздо менее очевидна, чем b += ('A'-0x0A), хотя делают они ровно одно и то же. Но символ '7' не привязан ни к чему, он случайно оказался равен разности символа 'A' и числа 10. Вопрос, записывать ли 10 или 0x0A спорный, мне больше нравится второй вариант, поскольку переводим-то в шестнадцатеричную систему, выводимому символу соответствует шестнадцатеричная цифра. По аналогии, первую часть можно было записать как b += ('0' - 0x00);

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

Это как раз то зло которого не должно быть в программировании. Еще скажи что помогает программу быстрее набирать на клавиатуре...

В чем проблема считать 8-битные коды символов 8-битными числами тоже непонятно.

В 90-х годах может это и было нормальным, но уже на дворе 2016-й год, давно уже НИКТО не считает символ байтом и кроме того форматов этих символов появилось как грязи.

Попробуй ту же фишку провернуть с UNICODE-символами.

Это самый что ни на есть космически хмасштабов костыль, который оставили лишь для совместимости со старыми программами, поскольку в 90-х годах это было чересчур распространённым явлением, а почему ЭТО используют сейчас - я не понимаю.

Причём эта фигня генерирует просто поражающие воображение поля из граблей.

Не тухнет диод после задержки, и не могу разобрать, как сделать

while (1)

{

if(PINB.0==1)

PORTD.0=1;

delay_ms(300);

PORTD.0=0;

}

Присмотритесь к коду повнимательней. Ещё внимательней, пока не снизойдёт озарение.

На самом деле он тухнет, но... на считанные МИКРОСЕКУНДЫ, потом загорается вновь на 300 милисекунд.

Разница в 5 порядков, ясное дело что глазом не успеваете заметить.

Изменено пользователем Alexeyslav

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Не вижу ничего плохого в быстроте набора программы и легкости ее чтения.

А разве UNICODE уже кодируется одним 8-битным char'ом? Вроде для этого wchar_t придумали, который с char'ом несовместим. И из-за этого с ним гораздо сложнее работать. Тем более контроллеру: ворочать 4 байтами там, где достаточно 1. ASCII все еще остается стандартом с вполне пригодна для вывода английского текста без спецсимволов. Для многих применений этого достаточно, и тот же вывод 16-ричных чисел к ним относится. Возможно, представление 8-битного ASCII-кода символа числом это костыль, но вряд ли его прекратят поддерживать в ближайшем будущем, так зачем жертвовать читабельностью кода?

Кстати, было бы интересно взглянуть на ваш способ решения той же задачи. С UNICODE и прочими правильными вещами и технологиями, не использующими костыли.

Тарапунька, что является "сигналом" импульс или только фронт? Точно ли для этой задачи нужен контроллер или достаточно одновибратора? Если все же хотите на контроллере, стоит освоить таймеры. Например, при появлении "сигнала" устанавливаем для нужного канала переменную-счетчик и включаем диод. Потом по таймеру уменьшаем переменную и, когда она достигнет нуля, гасим диод. Например, если считать "сигналом" фронт (нарастающий) импульса, код может выглядеть так

#define TIME_MAX 10000 //время горения, в периодах срабатывания таймера
//настройку и запуск таймера, а также выбор из доступных опускаю, в данной задаче это не важно
ISR(TIMER???_vect){ //прерывание оформлено в стиле avr-gcc, а не cvavr. Если надо, измените на свое
 static unsigned int time[4] = {0,0,0,0}; //рекомендую посмотреть, что означает модификатор static и почему без него работать не будет
 char signal = PINB;
 static char old_signal = keys;
//запись получается громоздкой, но от битовой магии я отказался в угоду наглядности
 if( (signal & (1<<0)) && (!(old_signal & (1<<0))) ){ //первая скобка - "равен ли текущий уровень лог.1" ; вторая - "равен ли предыдущий уровень лог.0" ; объединяем лог.AND и получаем детектор фронта - "изменился ли уровень с лог.0 на лог.1"
   time[0] = TIME_MAX; //запускаем таймер
   PORTD |= (1<<0); //включаем диод. Кстати, конструкция подобная "+=". Писать PORTD = PORTD | (1<<0); мне лень, к тому же такая запись короче и легче воспринимается
 }
//здесь обработка остальных каналов
 if(time[0] > 0){
   time[0]--; //учите Си, это стандартная конструкция, как бы их не ненавидел Alexeyslav
   if( time[0] == 0 ) PORTD &=~(1<<0); //гасим диод
 }
//обработка остальных каналов
 old_signal = signal; //для следующего цикла наше "текущее" значение будет уже "предыдущим"
}

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

UTF-8 кодируются. Верней может кодироваться.

Конечно, попридумывали всяких разных чаров несовместимых друг с другом и всё из-за этого злополучного чара-байта, чтобы не сломать совместимость. Одна проблема создаёт кучу других.

Это вообще идеологически неправильно оперировать символом как числом, то что они на каком-то этапе стали тождественными не означает что так и должно быть. Из-за этого много проблем возникает в программах.

Учение - изучение правил. Опыт - изучение исключений.

Ссылка на комментарий
Поделиться на другие сайты

Это как раз то зло которого не должно быть в программировании. Еще скажи что помогает программу быстрее набирать на клавиатуре...

[

За замечание спасибо. Мне не нужна цикличность функции. Мне надо, чтоб происходил постоянный опрос пинов 0-3 порта Д. И при появлении на одном из них 1, установить 1 на аналогичном пине порта Д. После установки 0 на пине порта Б, выдержать, допустим 20 сек. и установить 0 и на порте Д, отключив светодиод.

Изменено пользователем Тарапунька
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...