Странные глюки с энкодером в моём коде + странности с nRF24L01+
- Войдите на сайт для отправки комментариев
Чт, 16/05/2019 - 21:10
Использую библиотеку (GyverEncoder 3.1) в своём проекте, в примерах библиотеки мой самодельный энкодер (сам энкодер взят со старой автомагнитолы и к нему была сделана плата с подтягивающими резисторами) работает нормально, но вот в коде проекта энкодер срабатывает поворота наверно со 100500-го. Не могу понять в чём проблема.
И нашел ещё проблему, при передачи в запись массива transmit_data[6] (TX_response.ino) данных (значение 100), на приёмнике (RX_response.ino) в той же записи массива received_data[6] творится какая-то дичь, значения скачут от 10 до 7000+, значения остальных принимаемых данных массива в норме. При обратной передаче тоже какая-то дичь, значение Bat (transmit_data[1] в RX_response.ino) нормальное (к примеру 89), но на передатчик (recieved_data[1] в TX_response.ino) приходит значение 316!
Менять каналы пробовал, зашумлённость проверял. Не помогает.
Файлы проекта и библиотеки прикрепляю в архиве (ссылка на GDisk, ссылка на YaDisk).
P.S. Если код Вам покажется убогим и т.д., не кидайте тапками, я привык к написанию программ (для Windows) на Delphi (язык Object Pascal) и переучиваться на C-подобный язык мне сложно.
Сперва выкиньте Гивера с его библиотекой, потом вставьте сюда код по нормальному, не многие хотят таскать к себе зипы х.з. откуда.
Не используйте и проблем не будет.
А если уж невмоготу, то за консультациями ходите не сюда, а на специализированный форум: https://community.alexgyver.ru/
Ладно, фиг с ним с энкодером, может быть КОГДА-НИБУДЬ мне на форуме AlexGyver'а и ответят на этот вопрос.
Что не так с передачей/приёмом у nRF'ок? Привожу код ниже.
Код TX_response.ino:
Код RX_response.ino:
nmm4evr - если у вас проблемы с передачей - самое правильное отладить прием-передачу отдельно от остального. Почистите код от всего лишнего. Код приемника и код передатчика NRF - это максимум 20 строк каждый, а не по 400 строк, не имющих ровно никакого отношения к радио
Что не так с передачей/приёмом у nRF'ок? Привожу код ниже.
Парень, ты только здесь так тупишь, или по жизни альтернативно одарённый?
Поясняю, медленно и громко: Вероятность того, что здесь кто-то прочитает код, начинающийся с
дальше первой строки, практически неотличима от нуля.
Так понятно?
Тебе уже сказали, куда с этим кодом обратиться. Так зачем добиваться, чтобы в другие места посылать начали?
Вот! Убрал ВСЁ что не связано с nRF. Библиотеки AlexGyver'а к nRF ВООБЩЕ ни какого отношения не имеют, я их использовал только для кнопки и энкодера. ТАК ЛУЧШЕ?! И чем Вам AlexGyver не угодил? Удобные же у него библиотеки, не нужно писать километр кода (в котором я не слишком хорошо разбираюсь) в обвязку к кнопке или энкодеру чтобы всё работало нормально Б........
Вот очищеный код, который работает криво, а именно как, описано в первом посте темы.
И чем Вам AlexGyver не угодил? Удобные же у него библиотеки, не нужно писать километр кода (в котором я не слишком хорошо разбираюсь) в обвязку к кнопке или энкодеру чтобы всё работало нормально Б........
Они может и удобные, только сильно глючные, а приводить их в порядок он не собирается.
Вот! Убрал ВСЁ что не связано с nRF.
Вранье!
из оставшихся 250 (или сколько там) строк - 200 это вывод на экран известной своими заморочками либы U8glib, которая легко может имитировать неработоспособность NRF
вы плохо понимаете? - 20 строк оставьте! а не 200
А кто тебе сказал, что с его библиотеками всё работает нормально? Вот у тебя не работает, и таких как ты тут знаешь сколько ходит? Вот, и на других форумах пострадавшие имеются.
Я лично не видел ни одной его библиотеки, в которой не было бы откровенных ляпов. Ни одной!
Он тут как-то выложил кучу своих библиотек. Ему показали явные и скрытые ошибки. Например: #3, #26, #29, #31, #52, #67.
А вот теперь, полезь и посмотри, сколько из них он поправил, а сколько так и остались ляпами.
Нет
Тоже нет
Вы сами признались, что в программировании не очень, но упорно спорите с людьми, знающими о нем на порядок или даже на пару больше
каким образом библиотека для передачи изображения на дисплей может влиять на библиотеку для передачи данных через nRF'ки?
В условиях ограниченности ресурсов - а для программирования МК это норма - легко может влиять. Нехватка памяти, работа двух библиотек с одним и тем же таймеров, конфликт прерываний, некорректное обращение к периферии...
Ваша задача при отладке - максимально отделить влияние одной библиотеки от другой. Впрочем, если вы уверены, что знаете более простой и легкий путь найти ошибки - ищите сами.
Избавился от библиотек от AlexGyver.
С nRF24L01+ более-менее разобрался просто добавив в массив ещё одно значение и записав туда ноль, может оно и считывается/передается с глюками, но зато все остальные значения массива теперь передаются нормально и то хорошо.
Но вот с энкодером все равно ни чего не получается, ну вот не работает он и ВСЁ тут, кнопки работают и кнопка энкодера тоже, я уже даже конденсаторы на 100 нФ припаял чтобы дребезги на энкодере убрать, вот в примере того что я щас использую вместо GyverEncoder всё работает, в моём коде не работает ни в какую.
Прикладываю код примера и код TX_response.
TX_response:
Пример для энкодера:
Здесь, на форуме, тема есть: "Работаем с энкодером", на последних страницах примеры работы от Dimax, на прерываниях. Попробуйте переделать, у меня после попыток запустить на библиотеках взлетело сразу. ИМХО.
transmit_data[7] - это восьмой элемент массива, а у вас объявлена размерность в семь элементов - int transmit_data[7]. Измените что-то одно, иначе словите баг с зависанием или порчей значений переменных и будете долго искать его.
Если имеется ввиду код от Dimax, приведенный ниже,я вставил нужные части в свой код, но он выдает только нули в мониторе порта. Порты энкодера поменять на свои я не забыл если что.
Код:
"int transmit_data[7]"
А разве он не с 0 считает? 0, 1, ...., 7 итого 8 значений?
А теперь поменяй правильно. (везде, где надо менять)
Глядишь, и заработает.
Если имеется ввиду код от Dimax, приведенный ниже,я вставил нужные части в свой код, но он выдает только нули в мониторе порта. Порты энкодера поменять на свои я не забыл если что.
Я вот с этим работал. На 4 и 5 пинах, выдает две единицы на щелчок, с библиотекой глючило страшно. Пример из живого проекта:
А теперь поменяй правильно. (везде, где надо менять)
Глядишь, и заработает.
Разве не только здесь??? Больше вроде там ни где нет выбора портов...
bwn
Сначала в мониторе порта писал 1, но стоит повернуть энкодер в любую сторону, сразу 0 и как энкодер не крути все время 0.
Вот приведенный Вами код, который я использовал сейчас для теста:
bwn
Сначала в мониторе порта писал 1, но стоит повернуть энкодер в любую сторону, сразу 0 и как энкодер не крути все время 0.
>>4 & >>5 - ?????
>>4 & >>5 - ?????
[/quote]
Поменял я их, просто старую версию скинул, когда в самом IDE правил всё, то заметил, а вот в текстовом файле забыл поменять. Но всё равно результат 0 куда бы я не крутил энкодер и как бы я не менял местами порты (программно естевственно). Хотя в библиотеках всё работает нормально, а вот в моём коде не работает совсем.
Всё. Понял почему 0 все время, у меня энкодер походу сдох, если убрать if (encoderValue < 0) { encoderValue = 0; }, то в минус он крутиться! Щас попробую в свой код внести Ваш код, посмотрим что получится.
Разве не только здесь??? Больше вроде там ни где нет выбора портов...
Конечно, нет.
Ты вообще понимаешь, что там написано? Если да, то ответь себе (мне не обязательно), какое отношение имеют к "PCINT18" и "PCINT19" в шестой строке к "PCIE1" в пятой?
Если надо, читай даташит пока не поймёшь, что там должно быть.
Скажу сразу, чтобы не было потом вопросов. Я не знаю что это за строчки (кроме тех где порты указаны так как там есть коммент //выбрать входы), могу только предположить, что они как-то связаны с управлением аппаратными функциями контроллера и не связаны с языком C, C# или CPP на котором пишут программы для Windows, Linux и даже MacOS. И как я уже писал ранее, я привык к Object Pascal (Delphi) и пишу на С так как писал бы на Delphi, так как изучал последний более 10 лет, C для меня сейчас слишком сложен в освоении, да и возраст уже не тот чтобы с нуля другой язык программирования изучать. Поэтому изпользую примеры и Google чтобы разбираться хотя бы в C, а про аппаратные коды контроллера я уже молчу, для меня они ещё более тёмный лес чем C, C# и CPP вместе взятые.
Откуда я знаю про то что порты это порты (PCINT18 - цифровой 2, PCINT19 - цифровой 3, куда у меня и подключен энкодер), так вот отсюда:
И кстати заработал код из этого сообщения, после того как я между вызовоми чтения с энкодера поставил задержку:
Так тебе и дали пример. Ты его "поменял" и тут же заявил, что "пример от dimax не работает". Это пример от тебя не работает, а не от dimax, родной.
Я тебе задал вопрос
какое отношение имеют к "PCINT18" и "PCINT19" в шестой строке к "PCIE1" в пятой?
Неужели сама постановка вопроса не навела ни на какие мысли? Ладно, скажу проще, для "PCINT18" и "PCINT19" там нужно не "PCIE1", а что-то другое. Что именно? Ссылку на даташит я тебе дал, там это чёрным по белому написано - поработай хоть немного сам.
Я понял, что код из другого сообщения у тебя типа заработал, так что на этот ты можешь и забить (хотя он лучше и правильнее), но это уж тебе решать, ты хочешь научиться чему-то или взять чужой код и радоваться, что случайно заработало.
И так. Всё таки использовал я библиотеку GyverEncoder, только использовал в качестве основы пример под названием timer_isr, и теперь всё работает нормально.
Все файлы (включая библиотеки) можно скачать здесь, так же там есть фото того, ради чего я всё это разрабатывал.
И так. Всё таки использовал я библиотеку GyverEncoder..................
У каждого свой вкус, сказал Кот, вылизывая себе экстерьер.))))