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

Андрей Гараж

Members
  • Постов

    39
  • Зарегистрирован

  • Посещение

Весь контент Андрей Гараж

  1. Спасибо за ответ. Оказалось так глубоко копать не надо. Внес изменения в библиотеку "micromenu-v2" как на скринах. Удалил все, что связано с PROGMEM, и связанными с ней командами ("pgm_read_blablabla"). После этого сделал двухуровневое меню за полчаса. Видимо для ESP32 это работает только так, несмотря на то, что она понимает команды PROGMEM. Может проблема в разрядности "word"? Для AVR и ESP32 они 1 и 4 байта соответственно. Правда #include "MicroMenu.h" в теле скетча не работает, ошибки: undefined reference to `Menu_SetGenericWriteCallback(void (*)(char const*))' Если сделать так, extern "C" { #include "MicroMenu.h" } то все норм. Я не знаю почему так, но надеюсь кому-то пригодится.
  2. Здравствуйте! Есть такой макет (на фото), есть библиотека "micromenu-v2": https://github.com/abcminiuser/micromenu-v2 есть другая версия этой же библиотеки с описанием на русском http://easyelectronics.ru/organizaciya-drevovidnogo-menyu.html есть мой код: https://github.com/Andrew-Garage/menu Одна задача опрашивает кнопки, другая работает с дисплеем. При нажатии кнопки посылается соответствующее сообщение в задачу управления экраном. Объясните мне как работает эта библиотека, чтобы я смог сделать меню по образцу как на фото. У меня проблема с пониманием дефайна, с помощью которого создаются все пункты меню ("micromenu-v2/MicroMenu.h" строки 21-29 и 41-46). строки 21-29: typedef const struct Menu_Item { const struct Menu_Item *Next; /**< Pointer to the next menu item of this menu item */ const struct Menu_Item *Previous; /**< Pointer to the previous menu item of this menu item */ const struct Menu_Item *Parent; /**< Pointer to the parent menu item of this menu item */ const struct Menu_Item *Child; /**< Pointer to the child menu item of this menu item */ void (*SelectCallback)(void); /**< Pointer to the optional menu-specific select callback of this menu item */ void (*EnterCallback)(void); /**< Pointer to the optional menu-specific enter callback of this menu item */ const char Text[]; /**< Menu item text to pass to the menu display callback function */ } Menu_Item_t; строки 41-46: #define MENU_ITEM(Name, Next, Previous, Parent, Child, SelectFunc, EnterFunc, Text) \ extern Menu_Item_t MENU_ITEM_STORAGE Next; \ extern Menu_Item_t MENU_ITEM_STORAGE Previous; \ extern Menu_Item_t MENU_ITEM_STORAGE Parent; \ extern Menu_Item_t MENU_ITEM_STORAGE Child; \ Menu_Item_t MENU_ITEM_STORAGE Name = {&Next, &Previous, &Parent, &Child, SelectFunc, EnterFunc, Text} Да, я не очень в программировании, только учусь, чур не бросаться учебником. А если можно переведите на "пальцы" что тут написано?) Про первый блок: 1) Это определен тип данных структура Menu_Item... из структур этой же структуры Menu_Item? 2) void (*SelectCallback) (void) а это как понять? 3) Menu_Item_t зачем нужен? Почему нельзя обращаться через .Next или .Parent? Про второй блок: 1) Почему нельзя обращаться через .Next или .Parent? 2) Как слово "Name" (последняя строка) может объединять все предыдущие определения? По ссылкам? 3) И что вообще за значения передаются в MENU_ITEM? Где я должен их определить? MENU_ITEM_STORAGE это задефайненый PROGMEM. extern означает, что переменная определена где-то еще (что бы это не значило).
  3. По теме: кривая осциллограмма датчика походу была из-за плохого контакта в проводе щупа осциллографа. пересобрал тестовую схемку заново, все перевоткнул и сигнал стал норм - красный и зеленый именно такой как я писал в самом начале. 3их левых пакетов не обнаружено. А вот с цифрой фигня, если снимать со светодиодного пина то, что считала ардуина, происходит вот что: Считывается не то, и к тому же часть данных теряется. А ложные срабатывания ушли, когда на вторую ногу компаратора кинул 3.3 В, что видимо стоило сделать сразу. Но я следовал схеме платы и собрал как на ней. Набрел на ардуиновскую либу https://alexgyver.ru/directadc/ На ней можно завести программное прерывание, без него видимо никак. Не знаю как ардуиновский freeRTOS будет работать с программными прерываниями (и будет ли), я хотел обойтись без них. Завтра буду пробовать что-нибудь.
  4. На такие вопросы тут отвечают те, кто их и задает. Разве это еще не понятно? Или вы не уловили? Меня терзают сомнения...
  5. Если синий соленоид поднят, то его шрифт как бы продолжает магнитное поле оранжево-зеленого контура и перехватывает поводок. Если опущен, то зелёный контур его подхватит снова, пару сантиметров машинка может проехать прямо. Иногда правда это не срабатывает) На фотке под трассой, где контура, его даже видно. Он прямо под светофором- серый цилиндр в круглом отверстии. Тоже ещё не влезал туда, да и смысл? Там все намертво врезано и залито термоклеем.
  6. не) они как бы на "бампере" вроде того. может быть он не столько магнитится, сколько держит свое магнитное поле по полю контура. тк другие металлические предметы к дороге не притягиваются
  7. Это как-то завязано на адрес, который в исходнике в самом начале закомментирован. Такой-то адрес - такой-то маршрут. Но у зрителя создается впечатление что машинки ездят рандомно. На передней оси машинки латунный поводок - направляющая, на нем магнитик, и он примагничивается к контуру под дорогой. Так поворачиваются колеса. На перекрестке что-то типо железнодорожной стрелки, только переводит магнитный поток по которому следует машинка. Я еще не дошел до этого момента) Так что это дорога перестраивается, а машинка тут просто как ведомый элемент. // номер - минСкор - махСкор - маршрут + Kstart = // // // СПб - 214 - 174 - 101 // 0047 - СПб - едит через мост - 174 адр // 0089 - СПб - НЕ едит через мост - 214 адр // // 0093 - автоб зеленый - 90-180-197(был) - стал 60-137-174 СПб // 1078 - Груз - 60-160-113 - Псков // 1022 - ПАЗ - 80-180-182 // 0002 - автоб-МСК - 95-180-101 - // 157 адрес // 0097 - автоб МСК - 75-180-197 - короткий - малый круг
  8. Я ж скинул исходник, и уже говорили что там частота задефайнена на 1МГц. исходников светофоров нет. Я хотел исходя из пакетов передаваемых светофором отследить логику программы машинок по их исходнику. Сигнал такой какой на последних фотках, и по нему не понятно с какой частотой но задается.
  9. частотой чего? как по этому сигналу понять хоть что-либо, кроме того что он существует?) Весьма польщен)
  10. Собрал такую схемку на ардуине нано. С таким кодом: digitalWrite(13, ACSR&0b00100000); if(ACSR&0b00100000) Serial.println("1"); else Serial.println("0"); Осциллограмма на 13пине вышла такая: Откуда-то берутся ложные срабатывания. Ок, подключился к самому датчику: Все вроде четко, никаких лишних сигналов. Увеличил:
  11. эта штука подает питание на мотор, на нее идет шим. по маркировке не бьется, подключение перепроверил, да все именно так и работает
  12. Ну в данном случае, почти ничего) Ее я тоже в самом начале попробовал сделать, отладка по светодиодам - наше всё)
  13. Не, моргалка не дает ничего. Пакеты шлются каждые 500 мс, сегодня осциллографом мерил. А сами сигналы не различишь, весь пакет 40-50 мсек это 21 бит (пока у меня так получается). Видно просто как один мырг)
  14. Это первое с чего я начал, перерисовал обвязку avr-ки 328р. Помогает эта схема только в определенной степени, естественно. Надо ж всё в совокупности смотреть. Тоже уже склоняюсь к такому варианту, сделать отдельно из датчика и ардуины что-то, что писало бы в лог ком-порта пойманные байты. Сейчас вот пробовал прошить машинку, чтоб зацепиться за зеленый/красный сигнал светофора. Исходя из осциллограммы написал код, чтоб понимать 101 или 010. А машинка чтоб отмыргивала стопарями и поворотниками то, что получает. Тк вот оказалось там еще 3й вид пакетов периодически приходит. Это регистр внутреннего компаратора, он определяется этим битов в регистре. Потому он всегда и один и тот же. Вот эта точка: Тоже верно. На кварце платы машинки написано 4 ORG8 7J (может ORC8, все в говнище, не понятно). Не бьется в инете.
  15. Кажется начинаю вникать в этот сизIFов код... Открыл нотпадом++, получается то, что подсвечено красным слева (продублировал красными стрелками), это есть входной if. А на выходе мы должны получить только то, что я выделил желтым? А именно 10101010, adress, 10010110 или 255 (т.е. 1111 1111). Больше всего похоже на сигнал красного светофора. Еще посетители снимают на телефон постоянно)
  16. Как говорили коллеги, да и по коду так похоже, что задний ИК просто светит или не светит. (строки 698 - 707) И еще в паре мест он включается, но там тоже тупо на on/off. // STOP RED SIGNALS ***************************************************************************** if ((clcstopsignals==0)&&(stopsignalson==0)) { PORTD&=0b11111101; // Stop RED led OFF } if ((clcstopsignals>=stopsignals)||(stopsignalson==1)) { PORTD|=0b00000010; // Stop RED led ON clcstopsignals=stopsignals; } Отличная мысль! Прочитал сейчас статью на вики, и да, очень похоже на то, что вы написали в разделе "Кодирование". Только этих кодировок сейчас на одной вики, вон, штук 15 написано. Но все равно спасибо, надо глянуть. И да. Светофор посылает пакеты с частотой примерно 3 Гц. Конечно логично иметь какой-то байт синхронизации, т.к. если машинка выезжает из за поворота, то может поймать только кусок пакета. Но я в упор не нахожу по коду место, где он определяется как "стартовый" или как-либо еще. Тут очень здорово, что код написан чисто на регистрах, безо всяких кастомных библиотек, исходники которых ушли вместе с челом который это придумывал) По коду я вижу вот что (строки 226 - 259): while (1) { // НАЧИНАЕМ БЕСКОНЕЧНЫЙ ЦИКЛ y=ACSR&0b00100000; // IR start Read FrontIR ******************************************************** // ПОДСКАЗКА ЧТО НАЧИНАЕМ ЧИТАТЬ ПЕРЕДНИЙ ПРИЕМНИК НА ТАЧКЕ if (y==0) { // НАЧИНАЕМ ЗДОРОВЕННЫЙ if (НА 300 СТРОК, НО ЭТО НЕ ВАЖНО) adr=0; // ОБНУЛЯЕМ ПЕРЕМЕННУЮ adr В КОТОРУЮ БУДЕМ СОХРАНЯТЬ ПОЛУЧЕННЫЕ БИТЫ x1=0; // х1 и х2 ПОТОМ СКЛЕЯТСЯ В ОДИН (х1 - СТАРШИЙ БИТ HIGH, х2 - МЛАДШИЙ LOW) x2=0; _delay_us(19775); // ЗАДЕРЖКА 20 мс КРАТНА 2мс, Т.Е. МЫ ПРОПУСКАЕМ "СТАРТОВЫЕ" 10 БИТ? ТАК ЧТО ЛИ? y=ACSR&0b00100000; // bit 0 // ВООБЩЕ НА СКОЛЬКО Я ПОНЯЛ ASCR ЭТО РЕГИСТР ВНУТРЕННЕГО КОМПАРАТОРА, МЫ ЕГО ЧИТАЕМ... if (y==0) adr|=0b00000001; // И ЕСЛИ ОН РАВЕН НУЛЮ, ТО ЗАПИСЫВАЕМ 1 В НУЛЕВОЙ БИТ БАЙТА adr? А ЕСЛИ НЕ РАВЕН, ТО ЧТО? НЕ ПОЙМУ _delay_us(7910); // ТУПО ЖДЕМ 8 мс (ПРИ ДЛИТЕЛЬНОСТИ 1 БИТА В 2 мс ЭТО КАК-ТО МНОГОВАТО). ТОЖЕ НЕ ПОНЯТНО. y=ACSR&0b00100000; // bit 1 // НУ И ТАК ЕЩЕ 7 РАЗ if (y==0) adr|=0b00000010; _delay_us(7910); y=ACSR&0b00100000; // bit 2 if (y==0) adr|=0b00000100; _delay_us(7910); y=ACSR&0b00100000; // bit 3 if (y==0) adr|=0b00001000; _delay_us(7910); y=ACSR&0b00100000; // bit 4 if (y==0) adr|=0b00010000; _delay_us(7910); y=ACSR&0b00100000; // bit 5 if (y==0) adr|=0b00100000; _delay_us(7910); y=ACSR&0b00100000; // bit 6 if (y==0) adr|=0b01000000; _delay_us(7910); y=ACSR&0b00100000; // bit 7 if (y==0) adr|=0b10000000; Я курсорами осциллографа прополз всю осциллограмму, четко шаг по 2 мс получается по дельта-Т
  17. Пока делал заметил, что при зеленом светофоре 7 пиков, а при красном 6. Анализатора сигналов нет. В один пик действительно могут "залезть" две единицы, если по развертке посмотреть. Я пытаюсь хоть как-то сопоставить то, что я вижу с программой. Написано (строки 236 - 238): y=ACSR&0b00100000; // bit 0 if (y==0) adr|=0b00000001; _delay_us(7910); Т.е. как я понимаю считывание бита, потом задержка 7910 мкс. А тут первая 1 и 0 (поставил курсоры), длительностью 6 мс. И все остальное считывание байта тоже в задержках 7910 мкс. К концу считывания сигнал уже "убежит". Так? И сама запись не очень понятна. Если с регистра ACSR считали 0, то записали 1 в нулевой бит байта adr. И в следующие биты тоже записываем всегда 1, если у=0. Как так? Считывание получается срабатывает не по прерыванию, а определяется только задержкой _delay_us?
  18. Неужели в глаза бросается?) Исходников светофора нет, увы( Есть плата управления светофором. Самое умное что мне пришло в голову, это снять сигнал с самого датчика передатчика светофора. Ибо от дороги жуткие наводки на приемнике - частота контура дороги 30 кГц. Как машинка различает там сигнал вообще.
  19. Здравствуйте! Помогите решить загадку. Есть маленькая модель машинки, она гоняет по дороге, под которой проложен провод (колебательный контур). Под брюхом у машинки другой колебательный контур, так она заряжается. В машинке стоит плата с одной аттини13 и одной 328р. По дороге установлены светофоры и рядом с ними ИК-приемники и ИК-передатчики (на машинке соответственно тоже). Общаясь с ними машинка демонстрирует некоторое поведение: стоит или проезжает светофоры, поворачивает включая соответствующий поворотник, старается не въехать в зад другой машинке (у них сзади тоже ИК-передатчик). Машинок много и они постоянно глючат: устраивают "пробки", сталкиваются друг с другом, неправильно ведут себя на светофорах, разряжаются. Моя задача исправить это) Я хочу переписать код с использованием freeRTOS и arduinoIDE так, чтобы решить эти проблемы и чтобы другому новичку, вроде меня, была понятна логика работы. Есть исходный код обоих чипов, монтажная схема, тестовая машинка и тестовый полигон (на фото). Пока удалось заставить ее ехать и моргать освещением, проблемы с зарядкой ушли. Осталось научить ее общаться со светофорами, и вот тут у меня неуспех. Не пойму. Со светофора приходит 6 бит, а по коду считываться должно 8. Осциллограмму снимал и с ИК-передатчика светофора. decoder(328p).cpp encoder(ATiny).cpp
  20. у меня почему-то тоже... но не пойму почему) сделал так: - создал новый проект, появилась папка middlewares (1) - вручную добавил папки (2) сюда (3) и сюда (4) - получилась такая штука. а эта (1) папка почему-то сама то подключается, то нет. на этот раз добавил сам. в ней лежит FreeRTOSConfig.h - после сборки начинает ругаться на multiple definition of `SystemCoreClockUpdate', multiple definition of `SystemInit' - удаляю этот файлик и все собирается вот такая лапша. RTOS работает. почему так - мне не понятно)
  21. тоже думал про версии, но пробовал экспортировать ваш проект и в том виде как есть и с пересборкой под мою 6ю версию. все равно виснет на coping library files. попробовал сейчас собрать другой проект, новый и без FreeRTOS, сборка завершается нормально. может конечно я усложняю, но вдруг mx что то пытается подскачать? у "парней с ютуба" это происходит неявно, потому они об этом и не говорят. но сам куб ide и мх я скачивал через браузерный vpn, тк st-шники заблокировали российские ip в связи с "событиями" (выводится сообщение что файлы не доступны). а на самом компе vpn-а нет, вот mx и ide не могут достучаться куда надо.
×
×
  • Создать...