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

Несколько Алгоритмических Вопросов


-=gga=-

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

Здравствуйте! Я тут собрался сделать сигнализацию на МК (точнее на двух) но возникли несколько алгоритмическив вопросов, даже не связанных между собой, собственно по этому и темя назвал так :)

Сиганлизацию планирую делать с клавиатурой и ЛСД, клавиатура и ЛСД будут в отдельной коробке около двери. В этом модуле планирую применить АТМЕГА8. В основном блоке будет применён АТМЕГА64, т.к. у него два усарта, один на управление телефоном (модемом) второй, скорее всего, на связь с модулем клавиатуры и ЛСД.

На атмега8 я оставляю контроль за клавиатурой, и ЛСД. А так же распознование пароля, и при верности пароля отключение системы, путём отправления соотв. сообщения в центральный модуль. Так же через клавиатуру нужно производить настройку всех параметров системы. Вот возникает вопрос, как реальзовать настройку этих параметров, и как выводить на лсд сообщения, точнее откуда их брать. Есть 2 варианта: 1 это отправлять сообщения из основного модуля в панель, потом сохранить сообщение в панели, и выводить его в виде бегушей строки, т.к. строка может быть длинной, например 20 символов, а дисплей на 16. Второй варинат это хранить все сообщения в атмега8 (их многовато будет), и отправляя какую то команду выводить нужное сообщение. Тоггда возникает проблема с системой команд. ИХМО первый вариант лучше, т.к. вся работа будет на атмега64, а вторй му должен лишь выводить и передавать данные в основной модуль.

Ещё я немного не допонимаю как например приняв команду TTT1 и TTT2 отличить их друг от друга, что мне в прерывании усарта сидеть и пасать кучу иф-ов для сравнения полученной команды ? Для двух команд ещё можно, а если команд 100, что тогда ?

Вот как реализован механизм АТ команд в телефонах, там что этажами иф-ы пишут ? :unsure:

Я был механик, я есть механик, я буду механик

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

Реклама: ООО ТД Промэлектроника, ИНН: 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

...Ещё я немного не допонимаю как например приняв команду TTT1 и TTT2 отличить их друг от друга, что мне в прерывании усарта сидеть и пасать кучу иф-ов для сравнения полученной команды ? Для двух команд ещё можно, а если команд 100, что тогда ?

Вот как реализован механизм АТ команд в телефонах, там что этажами иф-ы пишут ? :unsure:

Массив указателей на функции может помочь:

typedef void (*ptr_fun)(void); //создаем свой тип указателя на функцию (все функции однотипные), можно и c параметрами

ptr_fun fun_array[100]; //объявляем массив указателей fun_array на функции типа void fun(void);

//пишем функции:

void fun0(void) {bla-bla1}

void fun1(void) {bla-bla2}

//...

void fun99(void) {bla-bla99}

//инициализируем массив указателей на функции (можно сделать сразу при объявлении, если функции ранее описаны или есть прототипы):

// fun_array[100]={fun0,fun1,/*...*/fun99}; - это если сразу, иначе:

fun_array[0]=fun0;

fun_array[1]=fun1;

//...

fun_array[99]=fun99;

//затем, при приеме символа (число будет соответствовать номеру функции в массиве)

symbol=UDR; //читаем символ

//и где надо (хоть через флаг приема, но лучше не в обработчике) выполняем:

fun_array[symbol]; //если пришло 24 например, то выполнится fun24();

//можно и с параметрами, тогда меняем тип:

//typedef void (*ptr_fun)(char);

//и вызов выглядит так

//fun_array[symbol](x); //где x - переменная типа char (или другого типа). Можно принимать и параметры тоже а потом их подставлять.

Только функции должны быть однотипными (по числу, количеству и типу принимаемых/возвращаемых значений)....

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

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

В принципе понятно.

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

Я был механик, я есть механик, я буду механик

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

Это понятно что нету. Но парсер команд можно существенно упростить, например есть команды, которые начинаются на букву А. Есть на Т. Разбив массив на зоны функций, скажем от 0 до 9 идут функции для команд, начинающихся с А, а для 10-20 например с Т... Завести переменную, и в зависимости от того, какие символы (и на каком месте) встречаются при последовательной обработке строки, модифицировать переменную так, чтобы к концу строки она указывала на нужную функцию. Число if-в можно заметно уменьшить...

Любой, заслуживающий внимания, опыт приобретается себе в убыток...

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

Делить массив на зоны хорошая мысль :) Можно ещё не делить один масив на зоны, а иметь два массива. Получив какойто символ (или А или Т) проверить ифом, какой за символ, и в зависимости от символа выбирать тот массив, который присвоен этому символу. Это удобно будет когда нужно иметь функции с разными параметрами. А лучше выбирать нужжный массив не одинм символом (А, или Т) и последовательность символов, например ААТ, что бы при передаче данных не выполнить какую либо функцию.

Можно сказать проблема с командами исчеркана.

Остался неясным вопрос, как лучше организовать общение с модулем клавиатуры ? Тупо передавать ему то, что он должен вывести, и принимать то, что он считывает с клавиатуры, или управлять им определёнными командами ?

А может два и сразу ? :)

Я был механик, я есть механик, я буду механик

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

Остался неясным вопрос, как лучше организовать общение с модулем клавиатуры ? Тупо передавать ему то, что он должен вывести, и принимать то, что он считывает с клавиатуры, или управлять им определёнными командами ?

А может два и сразу ?

вот именно это и есть та сложность. (у меня модулей всяких больше 7) Тут надо придумать какой то несложный протокол с контролем целосности пакета, так как это все таки сигнализация. например: на основе анси таблицы: SK[data][crc] S-старт К-команда данные и контрольная сумма

чем шире кругозор, тем тупее угол обозрения

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

А через какой интерфейс собираешься связывть эти модули ?

И в этот пакет SK[data][crc] лучше добавить адрес устройства, которому этот пакет предназначен.

Я был механик, я есть механик, я буду механик

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

через юарт у меня все, точней RS-485- а этот интерфейс полудуплексный, в чем еще одна трабла, ну у меня то ясно что адрес устройства нужен, а тебе, рас только один удаленный модуль то не нужен впринципе.. а еще не известна длинна пакета данных (у меня), а значит еще какой то байт отвести на длинну посылки... вобщем есть над чем думать...

чем шире кругозор, тем тупее угол обозрения

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

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

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

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

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

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

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

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

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

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

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