Вы наверно будете смеяцца (i2c lcd и 1.8.7 IDE)
- Войдите на сайт для отправки комментариев
Чт, 25/10/2018 - 00:00
если раньше проблема заключалась в выведении одного символа и решалась добавлением return 1; в двух местах, то теперь екран висит вообще и пять симпробованных библиотек с имеющимися и добавленными ретурнами ничем не помогли.
может быть кто то уже победил это постоянное гавнищще.
вроде под 1,8,5 работало норм с ретурнами, но оно стоит на компе в 500 км и буду там через 3 недели... а на ихем сцайте старые версии не нашел.
Тут они все прячутся:
https://www.arduino.cc/en/Main/OldSoftwareReleases#previous
Спасибо, может все-таки есть у кого некривая библа для i2c lcd?
В том самом arhat.h на гитхабе есть полностью автономный код для I2C, работающий и не зависимый от остальной части. Можно выдрать и пользовать (что тут уже делали не раз). Настройки скорости вплоть до 880кГц, есть примеры применения. Буферизация - внешняя, что позволяет настраивать и экономить размер памяти. Режимы компиляции позволяют сократить код до требуемой части (без многомастерных режимов I2C), есть возможность компилировать с "логированием" передач (сколько принято, передано, кол-во ошибок и т.д.).
P.S. Сорри, возможность логирования передач тут отсутствует, есть в другой версии. Думаю не требуется.
Убрал инклуд arhat.h, он тут вроде бы не нужен. В общем, сам давно не пользовал - требует перепроверки, но должен быть рабочим. Указатели на буфера настраивать самостоятельно в сетапе на свою буферизацию, если вообще требуется. Мне понадобилось только однажды..
P.S. Пример применения и библиотека работы с LCD1602 через этот драйвер:
Скопипастил "как есть", давно не ковырял, не помню уже..
Пример работы с LCD1602 оттуда же. Насколько помню, остальные фичи arhat.h тут тоже не нужны.
P.S. Пересмотрел код. В twiSetup() надо доопределить 2 константы:
Воткнуть можно куда-нибудь в скетч или заголовочные файлы или использовать в twiSetup() те, что определены в Arduino.
Там же есть вызовы digitalWrite() - будут использованы ардуиновские, соответственно можно заменить на прямую запись в порты.
Спасибо за отклик, буду пробовать
По большому счету этот код не использует wiring практически никак, и работает самостоятельно. Если ничего не поменялось в правилах компиляции (замена версии компилятора) процедур прерываний - то должно работать "как есть".
Ещё: там есть "protected" функции для реализации своих "надстроек" над интерфейсом. И ещё, неплохо бы заменить delay() в файле работы с дисплеем в макросе lcdSend() или там можно использовать что-то типа yeld() для загрузки проца пока он отправляет байтики медленному устройству или работаете с низкой скоростью.
В целом, реально достигнутая скорость на этой библиотеке при работе с lcd1602 что-то около 95мсек на передачу. А вот "символа" или "строки" уже не помню .. спросите у andriano, он тоже экспериментировал в то время..
Драйвер самого I2C только в режиме "мастер-передатчик" там что-то около 200байт или даже меньше.
Ну и как, заработало?
Еще не пробовал, вернусь из командировки на следующие выхи попробую.
Ап, дабы не утонуло. Результат всё ещё интересен..
В общем, недождался, проверил сам - в версии 1.8.5 - "полет нормальный": скидал все файлы в одну кучку, дообъявил ноги I2C в начале и доставил из arhat.h макрос delayMicro16()
В тестовом скетче конечно же закомментировал оба #include.
Результат компиляции на моей меге:
"Скетч использует 2502 байт (0%) памяти устройства. Всего доступно 258048 байт.
Глобальные переменные используют 53 байт (0%) динамической памяти, оставляя 32203 байт для локальных переменных. Максимум: 32256 байт."
Фотки, уж как получилось:
экран:
Полез закачивать 1.8.7 .. думаю ничего особенно не изменится.
В общем, можно смеяться, но загрузка версии 1.8.7 сегодня не задалась. Три попытки скачать и все три - обрыв соединения в самом конце.
В общем, недождался, проверил сам - в версии 1.8.5 - "полет нормальный":
Вообще-то, компилятор честно предупредил о проблемах в строках 180-183
а именно он сказал, что не понимает для чего там volatile и просто выбрасывает это слово.
Но, великим прогерам, очевидно, пофиг на предупреждение компилятора, которого они не понимают. Как не понимают и того, что указатель на самом деле не волатильный, а значит, в случае изменения указателя в процессе работы (что явно предполагалось как фича), всё может слететь к чертям и полёт перестанет быть нормальным.
Ты тут жаловался и страдал от того, что никогда не видел моего кода – на, смотри и учись. Профессионалы пишут такие вещи вот так:
Тогда компилятор всё понимает, и указатель становится волатильным.
Надеюсь, на слова благодарности.
В данном месте компилятор поступил совершенно верно. Это глобалы для других режимов работы драйвера, которые тут НЕ используются. Некоторым просто "влом" разобраться с кодом, и тупо "покажи им палец" они оборжуться до икоты.
Как оно там планировалось (эти ветки драйвера - не тестировал вовсе за ненадобностью лично мне):
То, что там "возвращаемое значение функции по указателю" указано как volatile, а не volatile указатель на функцию - написано ВЕРНО. Функция, когда надо, пишется обыкновенным кодом, и настраивается как раз вот тут - указанием имени после знака присваивания этому указателю. Думаю, можно конечно и в ином месте, но планировалось так.
Надобности в "волатиль" указателе - в коде нет, а вот необходимость указать что выдаваемый функцией результат волатилен, ибо функция будет вызываться из под прерывания - мне показалось важным.
Зачем и что ты пытался править - мне осталось непонятным. Кода ты не смотрел (или не способен) - явно. А то - что показал - "несущественно". Это так, "вместо" спасибо. Дабы было понятней. :)
Вообще-то написанное слово volatile, игнорируется. Значит, либо его не нужно было писать, либо писать так, чтобы не игнорировалось, а работало. А потому, всё сказанное - просто отмазка, - "гранаты не той системы".
А теперь, болле интересное
Ошибаешься, родной, смотрел и очень внимательно. И обнаружил там гораздо более серьёзные ляпы, коих там хватает. У меня даже есть проверочный код, в котором звёзды сходятся так, что вместо ожидаемого "Hello, Arhat!" выводится нечто непотребное.
Сначала я хотел его показать, но потом решил подождать реакции на первую ошибку. Всё-таки теплилась надежда, что меня поблагодарят за то, что показал её. Но вместо благодарности, я получил хамство (что в целом, характерно для данного автора) и заявление. что она "несущественна".
Ну, а показывать человеку его ошибки и объяснять откуда они берутся, когда он в ответ
Это так, "вместо" спасибо.
... у меня есть и другие дела, чем разбирать говнокод хамоватого прогера.
Впрочем, если ты действительно хочешь избавиться от откровенных ляпов в этом говнокоде, просто попроси вежливо, и я тебе несколько штук покажу.
Сначала я хотел его показать, но потом решил подождать реакции на первую ошибку. Всё-таки теплилась надежда, что меня поблагодарят за то, что показал её. Но вместо благодарности, я получил хамство (что в целом, характерно для данного автора) и заявление. что она "несущественна".
Ворота! Бесполезно.
Это же сам Великий(!), который принес в мир автоматное програмирование, захват таймера и что-то-там еще! Как ты посмел, смерд, усомниться в величии его кода? Великие не ошибаются - они предвосхищают будущее!
(когда Андриано заинтересовался скоростью отрисовки и2с экрана, у меня с Архатом уже был "великий срач"... я уже много правил его говнокод и работу с lcd, а именно что было лишним в самой библиотеке, которую он переписал, назвав "своей" ;). Полное непонимание почему, при включенной -lto, компилятор выбрасывает его имена не помеченные "used" и т.д. НО!!! Тут нужно быть справедливым - в части мастер И2С, в неблокирующем варианте, - целиком его (Архата) код, и действительно быстрый.) Ссылку на эту поучительную дискуссию (мегасрач) я что-то не могу найти. Если попадется - кину ссылку.
Да, здесь-то дело даже не в скорости. Здесь ошибки детские, типа динамический буфер используется после освобождения и т.п. Как раз ошибки из тех, что "на простых примерах полёт нормальный". Когда человек не умеет программировать - это не беда. Тут на форуме немало ребят, которые за мою бытность здесь заметно прогрессировали. Беда, когда при этом у него космическое ЧСВ и "ксива на общагу в Мельбурне" - это уже полный аут, тут прогресса ждать не приходится.
Вот, кстати, Влад, о том заявлении про Мельбурн. Как ты думаешь, каким должен быть возраст автора, чтобы он мог предположить, что взрослые, знающие как оформляются приглашения, люди в этот бред поверят? Может он просто школьник, а нам тут мозги пудрит? Ителлект-то точно на уровне школьника.
Скока буков, цельный трактат, код он смотрел .. ляпы нашел .. и говнокод-то Дракула правил (только забыл, цитирую по памяти: "код твой очень даже хорош" как раз в той теме .. отмотать что-ли) ..
А допереть что volatile void как "возвращаемое значение" есть .. нонсенс и банальный троллинг "гураков" (заменить буковку на свое усмотрение) - .. не доперло!
Вы сделали мой выходной. Вот за это - искреннее спасибо. Давно так не ржал.
Успокойтесь ужо .. конечно же volatile там избыточен и не нужен. И точно также там нет "динамически освобождаемых буферов" .. их там ВООБЩЕ НИКАКИХ нет, ибо они - ВНЕШНИЕ и оперделяются .. пользователем (что и есть одно из достоинств - сколько надо, столько и выдели .. сам).
:) :) фейспалм. тройной. :) :) .. как дети, чесслово..
И для полноты картины: "там есть серьезные ляпы, коих там хватает" - ЕСТЬ НАГЛОЕ ВРАНЬЕ. Это чтобы всем было понятно. Там код самого драйвера даже на асме лучше - практически не написать. Это лучшее, что можно создать как "драйвер для I2C"
Кто не верит - может пгобовать. Получится или тоже самое или ХУЖЕ. :)
Архат,
вот каждый раз, когда ты подходишь к луже, я думаю - ну, нет, не в эту, должен он хоть в чём-то разбираться! И каждый раз тебя переоцениваю.
В общем, я тебе говорил, что у меня есть работающий пример, который показывает проблемы. И даже говорил, что готов его показать. Но, тебе он не нужен, ты предпочитаешь упиваться величием говнокода, который
лучше - практически не написать.
Упивайся дальше!
И не забудь переслать этот говнокод в Мельбурн, тебе дадут новую ксиву - на этот раз на пятизвёздочную общагу, брехуёк ты наш.
Вот, кстати, Влад, о том заявлении про Мельбурн. Как ты думаешь, каким должен быть возраст автора, чтобы он мог предположить, что взрослые, знающие как оформляются приглашения, люди в этот бред поверят? Может он просто школьник, а нам тут мозги пудрит? Ителлект-то точно на уровне школьника.
Нет, это тип личности такой. У меня папа еще жив, ему 78 лет. Он почти такую же пургу несет. Кстати, и про Австралию тоже... только ему "форма-2" помешала ;) ;) ;)!!!
Он в бОльшую часть своего бреда - верит. Что "вне концепции" - мозг игнорирует. Конечно, это психопатия, если строго, но для окружающих не сильно опасно... скорее забавно, если бы он Самоделкина с форума не выжил!
Если серьезно - это что-то из детства, я - не психолог, что именно судить не берусь, но проявляется как неспособность признать собственный косяк. Никогда, ни при каких обстоятельствах! Закомплексованность... Может били однокласники? ;) ;) ;)
В том сраче Архат возмущался не собой, а компилятором, который без __attribute__((used)) выкидывал имя, уж не помню какое. Мотивировал тем, что в ранних версиях ИДЕ у него "все компилировалось"... ну да, в ранних "-lto", не было. Его вывод: "-lto" страшный вред и заговор! (шучу, но сквозь слезы).
Показываю, как можно отправку в LCD ускорить, пишет, что на его экране "висло".
Недавние примеры с пресловутыми "скобками" в макросе (всем уже надоело!). Его ответ: "мой код, я сам знаю, как и где применять, скобки не нужны". Потом скобки появились, а часть ЕГО кода была расчитана на макрос БЕЗ скобок и, что очевидно, перекосилась - опять виноват не он, а "он же писал, что скобки не нужны!".
Еще в том сраче - пишу, что может ядро сделать под его Arhat.h и его подключать и ИДЕ отдельно? Архат отбрехался тем, что ему "не интересно"... годом позже, наконец-то, он разобрался в части конфигов ИДЕ... даже на форуме какую-то банальщину писал про свою позорную самоделку. Но до перенастройки среды для использования его Arhat.h - руки, вероятно, никогда не дойдут.
Ой! У Архата проснулась самокритика! А я пропустил!
А допереть что volatile void как "возвращаемое значение" есть .. нонсенс и банальный троллинг "гураков" (заменить буковку на свое усмотрение) - .. не доперло!
ну, наконец-то до тебя дошло, что этот говнокод писал "гурак" (заменить буковку на свое усмотрение).
Я рад, что в тебе самокритика проснулась!
http://arduino.ru/forum/apparatnye-voprosy/medlennaya-rabota-liquidcrystali2c это "та самая тема". И таки да. Дисплей я менял, после чего второй отрабатывал совсем иные задержки. Там писалось, пересмотрю, потерли или осталось.
Интересно, кого это тут ты назвал "самоделкиным"? Не того ли, кто САМ ничего и не делал, а только "забывал" указывать во вконтактниках (и не только) кто и что сделал в итого? Если ты решил за Клапу - то огорчу. Мое имхо - его таки "забрили" в ВСУ или Александр забанил окончательно по айпи. Самому жалко что его больше нет.
Ой! У Архата проснулась самокритика! А я пропустил!
А допереть что volatile void как "возвращаемое значение" есть .. нонсенс и банальный троллинг "гураков" (заменить буковку на свое усмотрение) - .. не доперло!
ну, наконец-то до тебя дошло, что этот говнокод писал "гурак" (заменить буковку на свое усмотрение).
Я рад, что в тебе самокритика проснулась!
В "прошлой жизни", моя кличка среди коллег - last byte, может слышал. Вирус stone (найди забавная и хорошо писанная вещица) мною ужат до 128 байт в то время без потери функциональности. Не перживай, "в жизнь" не выпущен. Я на нем хороший коньяк выиграл. На спор ужимали вчетвером.
У тебя есть шанс "переплюнуть" - сделай свой драйвер с такой же или большей функциональностью и МЕНЬШЕ размером .. зауважаю, реально. :)
Последний пример с пресловутыми скобками был конкретно этот:
ADMUX = ((src)|(16+(((neg-1)&1)<<3)+(poz)&7)|(adlar));
Был только за их "избыточность" .. ты тоже считаешь, что ИХ СЛИШКОМ МНОГО и ЭТО ФАТАЛЬНО? Точно фатально и копрокодерство? Или просто "тупой наезд"?
А эта часть сентенции относится к спору с ЕвгениемП про дефайн пересчета миллисекунд в тики таймера Т0 .. там да, был косяк но .. сам пересчет был НЕ НУЖЕН нигде .. но надо же "прицепиться", пгадва жеж? :) .. зато есть что запомнить! :)
Давно бы сделал .. кто-то мешает? А мне - и СЕЙЧАС не интересно ..
Позорны пока твои сентенции .. цитату разбил специально, чтобы яснее было всем видно как круто "всё смешалось в доме облонских" .. чё там насчет "что-то из психологии", ась? :)
И да, позорная она или нет - не тебе решать. Она рабочая, АЦП работает существенно лучше (проверено), имеет ВСЕ выходы мега2560, имеет рабочую память 512 килобайт и держит периферию до 5 ампер .. у тебя есть лучше, позорник? НЕТ. Вот и не звизди.
Давно бы сделал .. кто-то мешает?
Ты мне это предлагаешь???? У тебя все со здоровьем нормально? Попробуй в "Ищу исполнителя" обратиться.
Ты, все-таки, похоже, окончательно с крышей простился...
============================
по коду:
1. драйвер твой, мы же с тобой, в той теме, проверяли ТОЛЬКО в режиме мастера. В этом режиме все было очень хорошо. Не стоит хвастать впустую, пока ты не проверишь его в слейве, мультимастере, на зашумленной передаче с обрывами и т.п.
2. по интерфейсу он несовместим с TWI, то есть подходит только для кустарного применения (т.е. только автором), но не в среде Ардуино, в том числе об этом я и писал, когда предлагал тебе (в той теме) довести ядро, на основе Arhat.h, до "ума", то есть до максимально возможной совместимости с экосистемой Ардуино.
3. В ту же тему - пример с LCD - тоже исключительно для кустарщины! Драйвер не наследует класс Print, что лишает этот набор самоделок какой-либо пользы для всех, кроме автора.
И да, позорная она или нет - не тебе решать. Она рабочая
Как это "не мне"???? Ты же выложил на форум, на общий суд. И ты сам, никто за язык не тянул, рассказал, что память у тебя не заводится. Сам же, (тут могу врать - не помню) вроде как нашел причину. Не хочешь критики - так не выкладывай ничего... тебя давно уже отсюда "просят" ;) Ты ж сам тут остался, вот и слушай.
Ты выложил на суд общества свои ошибки, сам. На мой взгляд - это может и круто, но глупо. И ошибка в таймингах доступа к памяти - вполне позорная и ее можно было отловить при макетировании.
Такие платы делают, если ты не знаешь, в ДВА этапа. (я не про ЛУТ, я про нормальный заказ) - на первом делают свободное размещение корпусов и возможность модификации, и потом, после тестов, делают "боевой" гербер с плотным размещением. Но ты ж - гений, тебе тестировать ничего не надо было!
Давно бы сделал .. кто-то мешает?
Ты мне это предлагаешь???? У тебя все со здоровьем нормально? Попробуй в "Ищу исполнителя" обратиться.
Ты, все-таки, похоже, окончательно с крышей простился...
============================
по коду:
1. драйвер твой, мы же с тобой, в той теме, проверяли ТОЛЬКО в режиме мастера. В этом режиме все было очень хорошо. Не стоит хвастать впустую, пока ты не проверишь его в слейве, мультимастере, на зашумленной передаче с обрывами и т.п.
2. по интерфейсу он несовместим с TWI, то есть подходит только для кустарного применения (т.е. только автором), но не в среде Ардуино, в том числе об этом я и писал, когда предлагал тебе (в той теме) довести ядро, на основе Arhat.h, до "ума", то есть до максимально возможной совместимости с экосистемой Ардуино.
3. В ту же тему - пример с LCD - тоже исключительно для кустарщины! Драйвер не наследует класс Print, что лишает этот набор самоделок какой-либо пользы для всех, кроме автора.
1. Согласен. И в той теме и сам тоже проверял только режим мастера. Все остальные режимы - НЕ проверялись (о чем даже тут сказано выше!). Режим мастера - что-то около 190 байт, вылизывался именно он. Дерзай, улучшай хотя бы только его .. пусть будет так. Только фигушки .. ни у тебя ни у ворот нифига не выйдет. Там даже на асме мало что выйдет.
2. В чем конкретно он "несовместим с TWI" .. снова газируешь лужу? Как же Вы врать-то горазды! Протокол I2C(TWI) там выдержан полность (и в остальных режимах тоже, просто не тестировалось .. может чего и пропустил, но скорее всего заработает без изменений). Совместимость с "экосистемой" .. не смеши мои тапки. Оно вполне способно вызываться из этой "экосистемы" и работать нормально.
3. Драйвер и НЕ ДОЛЖЕН наследовать класс и тем более кривой Print, вместе со Stream, String и прочей дури из "экосистемы". Это "экосистема" может использовать драйвер, втянув его в свои классы. Тут придется "допиливать" - создавать оболочку (класс) под применение в Print. Не проблема - для этого есть "приватный" блок функций, базовая функция вывода заданного количества байт в интерфейс. Дело "левой-задней ноги" в общем-то. Но, и ещё раз:
мне - не интересна "совместимость" с эко системой Ардуино .. ни разу, ни в одном глазу. Ты - предлагал (зачем-то) - тебе и делать (если способен конечно). Ибо "инициатива - наказуема" и "эко-система" - явление ОТКРЫТОЕ. Кому надо - тот и делает, мне - не надо. Предлагал - ты. В "чем пгоблема"? :)
4. Насчет платы: ПОКАЖИ ЛУЧШЕ прежде чем звиздеть. Зависть - плохой советчик.
Уже не просто "заводится" а давно работает и сын с ней тоже .. проснись или почитай последние комменты в той теме. :)
Несколько "постоянных" флудерастов форума, типа тебя? http://arduino.ru/forum/apparatnye-voprosy/problema-s-otobrazheniem-info... - последний "образчик" таких просьб .. сколько людей вы уже ТАК ВЫГНАЛИ с форума, считал? Могу помочь..
[quote=wdrakula]Ты выложил на суд общества свои ошибки, сам. На мой взгляд - это может и круто, но глупо. И ошибка в таймингах доступа к памяти - вполне позорная и ее можно было отловить при макетировании.
Такие платы делают, если ты не знаешь, в ДВА этапа. (я не про ЛУТ, я про нормальный заказ) - на первом делают свободное размещение корпусов и возможность модификации, и потом, после тестов, делают "боевой" гербер с плотным размещением. Но ты ж - гений, тебе тестировать ничего не надо было![quote]
Позорно то - что ты тут пишешь. Оценщик позорности чужих ошибок .. тоже мне "судия", блин. :)
Такие платы делают много как ПО-РАЗНОМУ, в т.ч. и так и этак. И с чего ты решил что "макетирования не было"? Только потому что не изложено и вопросов не задавалось? Задавались кстати .. только они чутка "выше" вашего уровня понимания, как показала практика. В т.ч. и твои посты, что тут, что в теме за драйвер у andriano..
А плата - получилась просто замечательная, чему рад несусветно, ибо да - "не специалист-электронщик" .. так "проба пера" .. но, сейчас, по-тихоньку, таки решается вопрос её серийного производства. Ибо - ПОЛУЧИЛОСЬ. И не тебе - бездарю, решать "позорная она или нет". Есть спецы, и их мнение мне уже известно.
И в дополнение, а то в магаз нужно ехать:
Не получаю удовольствие от разрушения иллюзий, но если ты, Архат, наберешь в Гугле "non blocking arduino TWI", то увидишь то, чего и следовало ожидать: много разных людей тоже решали эту задачу. Не каждый из них "придумал Битлз и объявил дефолт"(с), но драйверов TWI написано реально много.
Кто не верит - может пгобовать.
Попробовал.
Загружаю в Nano
Получаю время - 80300
Теперь беру самую обыкновенную LiquidCrystalI2C, загружаю
Получаю время 23288
Ну, а теперь расскажи мне, что блокирующий код гораздо лучше неблокирующего и что если моя программа будет 57 миллисекунд сидеть в твоём говнокоде, то это значительно лучше, чем если бы она занималась чем-то своим.
2. В чем конкретно он "несовместим с TWI" .. снова газируешь лужу? Как же Вы врать-то горазды! Протокол I2C(TWI) там выдержан полность (и в остальных режимах тоже, просто не тестировалось .. может чего и пропустил, но скорее всего заработает без изменений). Совместимость с "экосистемой" .. не смеши мои тапки. Оно вполне способно вызываться из этой "экосистемы" и работать нормально.
Блин! Ты "дурака включил" или правда не понимаешь понятия "интерфейс"?
Все эти методы из TWI: beginTransmission(), requestFrom() и прочее. Чтобы темплейтами можно было выбирать библиотку, НЕ ПЕРЕДЕЛЫВАЯ иной код, верхнего уровня.
Иногда меня удивляет, ты что-то про программирование, кроме своего сомнитетельного опыта в хакерстве 20 летней давности, слышал? Что-то про ООП, про С++?
Чтобы твой драйвер БЫЛ ВОСТРЕБОВАН, он должен быть совместим с экосистемой Ардуино по интерфейсам (хотя бы). Не кто-то должен применять твои функции, делая на их основе методы, а ты сам, ну если претендуешь на звание программиста и выкладываешь что-то для всех. Или не выкладывай... тебе уже сказали. Или не пиши, что это кому-то нужно и полезно, кроме тебя.
Кто не верит - может пгобовать.
Попробовал.
Загружаю в Nano
Получаю время - 80300
Теперь беру самую обыкновенную LiquidCrystalI2C, загружаю
Получаю время 23288
Ну, а теперь расскажи мне, что блокирующий код гораздо лучше неблокирующего и что если моя программа будет 57 миллисекунд сидеть в твоём говнокоде, то это значительно лучше, чем если бы она занималась чем-то своим.
Я так и думал .. маладец. Там специально тебе дана ссылка на прошлое обсуждение, замеры и пр. .. знакомься.
2. В чем конкретно он "несовместим с TWI" .. снова газируешь лужу? Как же Вы врать-то горазды! Протокол I2C(TWI) там выдержан полность (и в остальных режимах тоже, просто не тестировалось .. может чего и пропустил, но скорее всего заработает без изменений). Совместимость с "экосистемой" .. не смеши мои тапки. Оно вполне способно вызываться из этой "экосистемы" и работать нормально.
Блин! Ты "дурака включил" или правда не понимаешь понятия "интерфейс"?
Все эти методы из TWI: beginTransmission(), requestFrom() и прочее. Чтобы темплейтами можно было выбирать библиотку, НЕ ПЕРЕДЕЛЫВАЯ иной код, верхнего уровня.
Иногда меня удивляет, ты что-то про программирование, кроме своего сомнитетельного опыта в хакерстве 20 летней давности, слышал? Что-то про ООП, про С++?
Чтобы твой драйвер БЫЛ ВОСТРЕБОВАН, он должен быть совместим с экосистемой Ардуино по интерфейсам (хотя бы). Не кто-то должен применять твои функции, делая на их основе методы, а ты сам, ну если претендуешь на звание программиста и выкладываешь что-то для всех. Или не выкладывай... тебе уже сказали. Или не пиши, что это кому-то нужно и полезно, кроме тебя.
Звиздец.. не читатель? Несколько раз специально повторил "эко система" (читай: прямое включение в код библиотек Ардуино и писанных поверх неё) - МЕНЯ НЕ ИНТЕРЕСУЕТ. совместимость с TWI - это ИСКЛЮЧИТЕЛЬНО совместимость с ПРОТОКОЛОМ TWI и его аппаратурой. Ибо TWI - это НЕ ардуино-вийринг гумно.
То есть прогазировал лужу на предмет использования в виринг-поделках, но уточнить про это "забыл" .. "случайно" ли? :) Вот так вот ваше вранье и всплывает на форуме регулярно.
И ещё раз: меня мало волнует "востребованность" ардуинщиками моих поделок. Ардуино - ОТКРЫТАЯ среда. Кому надо "причесать" - тот причесывает.
И на предыдущее: да, после сделанного драйвера нашел много иных вариантов .. и чё? Что-то хуже, что-то "почти такое же" .. есть даже ассемблерные варианты и? Вы же тут пыжитесь ДОКАЗАТЬ что эта поделка - гумно! Только сами написать лучше .. а от слова НИКАК. :)
Даже не знаю, где "там" и что за ссылка. Только замер я сам сделал и получил, что твоя суперлиба в 3,4 раза медленне самого простого, распространённого решения для чайников. Есть что добавить?
http://arduino.ru/forum/apparatnye-voprosy/medlennaya-rabota-liquidcrystali2c мне не трудно повторить ссыль. Осваивай.
P.S. И ещё, Дракуле: ваще-то мой драйвер "востребован". Его пользуют и даже в разделе "Ищу Исполнителя" (делал контрольную закупку у одного перца, знаю достоверно, но "сдавать" - не стану, не ворота же!) Чел, просто написал то, про что ты тут ратуешь и спокойно юзает и "на заказ" тоже. :)
Посмотрел по ссылке. Про твоё "пиздобольство" и верчение ужом на сковородке, чтобы ошибку не признать, нашёл, а вот про прямое сравнение времени (как у меня) там нет.
Цифры, что я привёл - просто с монитора порта, воспроизвести их может любой. И результат там такой, какой получился.
Я так понимаю, что ничего по этим цифрам не будет? Правильно? Код архата лучше уже потому, что это код архата - критерий лучшести такой.
За сим из темы выпиливаюсь, если возникнут вопросы по делу - пишите, постараюсь ответить. Отвечать флудерастам больше желания нет, повеселились и хватит. пора делами заняться. :)
Ворота! Ты загляни в ту тему, там было соревнование между моим и2с "ногодрыгом" для Тиньки13 и Архатовской поделкой. После сильного "причесывания" библиотека Архата выиграла с показателем около 10 мкс на символ или даже меньше. Но там было много изменений в части LCD, про которые Архат сейчас забыл, вот ты и получил плохой результат.
Влад, я получил то, что получил. Что там было в других местах, я не знаю, но человек заявил, что его код "лучше не напишешь",я сравнил и попросил прокомментировать полученный объективный результат. Кроме хамства - никаких комментариев. Как всегда.
За сим из темы выпиливаюсь, если возникнут вопросы по делу - пишите, постараюсь ответить.
Мои цифры (сравнение скорости) были А) объективны и Б) совершенно по делу.
Но ответа, как я понял, не будет.
И да, кстати,
допереть что volatile void как "возвращаемое значение" есть .. нонсенс
Это у прогеров нонсенс. А вот в стандарте языка,которого ты не знаешь, есть обсуждения и volatile void, и const void и даже const volatile void. Но тебя, как я понимаю, это не волнует.
Твой тест у меня показал 2000мксек на строку в 16 символов .. что я сделал не так? Эх-ты .. код он читал .. :)
Всё, не интересен больше. Аут.
Твой тест* у меня показал 2000мксек на строку в 16 символов .. что я сделал не так? Эх-ты .. код он читал .. :)
Всё, не интересен больше. Аут.
при условии что * =
Теперь беру самую обыкновенную LiquidCrystalI2C, загружаю
Получаю время 23288
Ну, а теперь расскажи мне, что блокирующий код гораздо лучше неблокирующего и что если моя программа будет 57 миллисекунд сидеть в твоём говнокоде, то это значительно лучше, чем если бы она занималась чем-то своим.
Попробовал.
Загружаю в Nano
Получаю время - 80300
ээм ... 2000мкс тоже < 80300мкс. . или это тоже троллинг для понимающих ?
что я сделал не так?
А х тебя знает, что ты сделал не так. Я свой код показал - любой может повторить. Ты свой скрыл. Думаю, правды в твоих словах - как в брехне про Мельбурн.
В общем, пойди постирай штанишки и тявкай на взрослых дядей. До свиданья!
Твой тест* у меня показал 2000мксек на строку в 16 символов .. что я сделал не так? Эх-ты .. код он читал .. :)
Всё, не интересен больше. Аут.
при условии что * =
Теперь беру самую обыкновенную LiquidCrystalI2C, загружаю
Получаю время 23288
Ну, а теперь расскажи мне, что блокирующий код гораздо лучше неблокирующего и что если моя программа будет 57 миллисекунд сидеть в твоём говнокоде, то это значительно лучше, чем если бы она занималась чем-то своим.
Попробовал.
Загружаю в Nano
Получаю время - 80300
ээм ... 2000мкс тоже < 80300мкс. . или это тоже троллинг для понимающих ?
Конечно меньше и это тоже да - троллинг. В части "я смотрел твой код" .. нифига он НЕ смотрел, а если смотрел - то ничего не понял. :)
Ладно, раз уж тут есть ещё читатели, которые могут быть и просто Ардуинщиками (не только преподами, сдающими студентов ректорам), поясню (все равно Вы - не в теме, да и ТС-у похоже уже "все равно"):
Основных идей этой реализации несколько.
1. Минимизировать код драйвера прерывания I2C, в т.ч. устранив на этапе компиляции код "ненужных частей". В частоности, если речь только за вывод на дисплей (как тут), то незачем компилировать и вставлять куски из режимов "slave" и др. Реализовано набором #define констант компиляции;
2. Разрешить устанавливать ЛЮБУЮ доступную скорость драйверу для "мег". Добавлена спец. функция расчитывающая требуемые настройки twiSpeed() .. доступны скорости от единиц герц до 880Мгц включительно (см. комменты). Низкая скорость позволяет отлаживать интерфейс ваще примитивными методами, вплоть до "светодиодами". I2C такое в общем-то позволяет;
3. Не потерять функциональность типового I2C. Кроме режима masterTX остальные в общем-то не тестировались, но делались с тщательной оглядкой на даташит и известные на тот момент реализации. Вроде "должно взлететь сразу". Просто проверять было (да и сейчас) не на чем. В общем-то есть всё, в т.ч. и "мультимастер";
4. Уйти от "фиксированного" буфера приема/передачи. Здесь все буфера задаются извне - из программы, использующей интерфейс. Сколько надо (как в блоке lcd) столько и заказали. Мелкая экономия памяти;
Реализация работы с LCD-экраном делалась из-за того, что ВСЕ имеющиеся у Ардуино библиотек - кривы "безбожно", как раз потому .. что используют традиционный пакет классов, ещё от Stream. Желание "объять необъятное" приводит просто к чудовищной потере производительности интерфейсов. А для LCD ещё и включен Wire, который ни разу не учитывает "особенности" этих дисплеев.
Недостаток этих дисплеев (точнее переходников на базе PCF8574 и, как следствие режима "4-бита") в том, что они никак не сигнализируют в Ардуино что "запись завершена", но при этом работают (с т.з. микроконтроллера) офигительно медленно. По даташиту цикл записи в дисплей "от" 37 микосекунд, а в реальности больше 41 и мне попался экземпляр .. около 5 миллисекунд. Тот, что есть сейчас устойчиво рисует только с 50 микросекундной задержкой. Предыдущий держал 41.
То есть, для отправки каждого полубайтика на дисплей надо сделать 3 передачи по шине I2C: установить строб записи, выдать "значение" и снять строб записи. И так 2 раза на символ. Типовые реализации "стека Ардуино" силами wire.h КАЖДЫЙ РАЗ каждую из 6-и отправок сопровождают: а) инициализацией шины, отправкой адреса, отправкой данных, ожиданием. Итого имеем 3*6 = 18 действий на каждый рисуемый символ. Плюс "ожидания" (дисплей - молчит как партизан, принял он или ещё нет).. вот этот "гемморой" и устранен тут.
Что смотрел-смотрел, да не высмотрел "наш Херой"? :)
В блоке из lcd есть функция lcdSend() которая отдает заданное количество байт ОДНОЙ посылкой TWI. Именно она и отправляет одной посылкой все требуемые 6 байт в дисплей на каждый символ (2 полубайта по три отправки). Делает она это ОДНОЙ настройкой шины и отправляя адрес устройства тоже только 1 раз.
Так вот в ней и стоит "задержка" для компенсации партизанства дисплея .. банальный delay(). И стоит он там в МИЛЛИсекундах. И константа там указана в 5 мсек. Собственно это единственное место, требующее "донастройки" пользователем. Надо заменить на задержку в МИКРОСЕКУНДАХ и проверить тянет ли дисплей даташитовские 37 микосекунд. Всё.
В коде оставлено так - СПЕЦИАЛЬНО, чтобы они высрали тут всю свою безмозглость. Как раз для тестирования таких вот "преподов".
(кому надо было из ардуинщиков, до сих пор писал приватно на мыло)
В общем - пользуйтесь. Это реально лучшее что есть в Сети. Или одно из. Уж точно не ЛиквидКристалл. :)
Нууу тс-у совсем не все равно . Просто тс тихо фигеет от нечаянно спровоцированного срача:)
Arhat я попробовал твое предложение. Заработало. Спасибо.
мне очень жаль, что безобидный вобщем-то вопрос вызвал такую бурю.
Кстати выпилил с ноутбука который был в другом городе 1.8.3 с рабочей библиотекой .
Пока работают оба варианта. Буду дальше тестить.
Еще раз спасибо.
А чего тихо фигеть, надо активно участвоват в дискусии ;)
2. Разрешить устанавливать ЛЮБУЮ доступную скорость драйверу для "мег". Добавлена спец. функция расчитывающая требуемые настройки twiSpeed() .. доступны скорости от единиц герц до 880Мгц включительно
Архат, ты ошибся или опечатался ?
А отмазки про настройик не принимаются. Тот код, что выложен в этом топике ВТРОЕ медленнее ликвид кристала. А то, что у тебя он показал сильно меньше - брехня. Или, код был другой. Один и тот же код так не делает.
Ну и облажамс с волатайл никто не отменял. Я, конечно,понимаю, что ты его вставил исключительно. чтобы меня потроллить, только брехня это. А обосрамс - совершенно объективен - не омажешься. Так-то, брехуёк наш обкакавшийся.
Архат, ты ошибся или опечатался ?
Это у него суперлиба такая. Щас чуток настройки подкрутит - до гигагерца дойдёт.
Для Вас конкретно: в этом коде есть несколько интересных моментов или особенностей (кому как больше нравится) см. пост №4:
1. Установка скоростей - функция twiSetRate(), все допустимые скорости и диапазоны там перечеслены в комментариях. В разных диапазонах - разный "шаг" изменения скорости I2C. Тут только установка в регистры. Вычисление значений в регистрах и их запись можно делать функцией twiSpeed(). Устанавливает ближайший диапазон и в нем ближайшую возможную скорость.
2. Макросы управления автоматом I2C собственно Вам, как пользователю - не нужны. На них написан автомат - обработчик прерываний, в общем-то исключительно для удобства чтения его кода и только.
3. Целевой адрес приема/передачи хранится в глобале twiSLARW при необходимости, этим можно пользоваться "ручками", но осторожно. Для мультимастерных и slave режимов, собственный адрес меги устанавливается макросом twiSetAddress(), а twiSetMaskAddress() устанавливает маску адреса (см. описание в даташите). При собственном развитии далее, макросы twiStart() и twiStop() и др. принимают в качестве параметра признак надо ли свистеть ACK в шину или "обойдется". В ряде случаев - НЕ НАДО.. но тут только пример (lcd) что завершаем передачу штатно, освобождая шину.
4. Функции (режимы кроме "мастер-передатчик") вызываются через указатели, что позволяет "динамически" менять поведение интерфейса, скажем при "перекрестном" обслуживании нескольких устройств. При их написании надо помнить, что все они вызываются из под прерывания автомата TWI и соответственно не должны делать ничего "сложного" .. заполнился буфер приема - куда его? Что тут можно "быстро" сделать? Да просто закрыть работу с этим(!) буфером и свистнуть в главный цикл "принял". Или установить признак "принял" и взять следующий буфер, если он есть. Аналогично со всеми остальными.
5. строки 171-180 arhat_twi.h - остаток (отсюда выпилил) блока статистики автомата TWI. Можно воткнуть в обработчик учет статистики принятого/переданного а также всех возможных ошибок линии и автомата.
6. twiSetup() только настраивает автомат, но не запускает его!
7. twiSendStop() -- о .. с этим местом пришлось поизголяться .. это исключительно для оптимизации обработчика прерывания TWI. Там "хитрость" в том, что если компилирован только 1 режим (всё равно какой) то лучше иметь "макрос", а если хотя бы 2 режима используются одновременно, то правильнее (меньше места) при вызове как функции. Это лучше не трогать и не пользовать. Исключительно "внутренняя оптимизация" обработчика. (именно этим он и отличается от остальных неплохих релизов)
8. Выделены "protected" методы. Исключительно для развития и встраивания "куда-нибудь". Всё необходимое для написания своих функций "верхнего уровня" тут есть.
9. "public" раздел представлен тремя базовыми функциями. Всё остальное дополняется по аналогии, проблем нет.
Файл arhat_lcd.h (второй):
1. В комментах тайминги из даташита "как есть". Работают, но с особенностями. В частности I2C версии не используют бит готовности дисплея из-за чего невозможно узнать, что дисплей обработал принятый символ. Только подбором тайминга, о чем писал выше через задержку в lcdSend(). Они мне уже всречались разные.
2. Этот хидер, инклудит в себя предыдущий (twi) и при вызове twiSetup() "метит" в его константе TWI_SETUP "себя", что позволяет в дальнейшем "знать" в программе "кто" первый активировал интерфейс (по результату компиляции!) при наличии нескольких "работников" с ним. Может оказаться полезным, мне такое решение показалось интересным и теперь применяю его везде в своих разработках. строки 193-195. То есть, эта константа будет иметь значение того "работника", который первым был скомпилирован компилятором. Мелочь, но приятно. :)
3. В этом файле скорость работы I2C установлена на 800кГц. Это предел, который тянет интерфейс PCF8574 и собственно приемный буфер дисплея. То, что оно ПОТОМ обрабатывает символ долго .. иная проблема. Но, закидать 6-и байтовую посылку в дисплей вполне можно на этой скорости. Если не тянет - можно понизить, там есть константа.
4. lcdSetup() в своем конце исполняет паузу в 0.5сек. Это специально для "увидеть" глазками инициализацию дисплея. Можно убрать, если критично. Для штатной очистки экрана есть lcdInit().
5. lcdSetCursor() опирается на "знание" длины строки дисплея в 40 символов. Если это не так - надо править тут. Опять же, если строк больше (тут только 2) - то сюда же с правкой.
6. lcdSend() -- бутылочное горлышко через которое идет весь обмен с дисплеем. Вот как раз тут и стоит "та самая" задержка для преодоления "партизанства" контроллера I2C дисплеев. Сам протокол I2C и его автомат - корректны. Они будут нормально ждать признака готовности .. но передача пачки .. увы не имеет способа синхронизации с контроллером самого дисплея.
Вариантов тут несколько:
а) устанавливать минимально возможную задержку по своему прибору. У меня один терпел 41мксек, а вот второй только 50мксек. Но .. и был очень большой тормоз .. :)
б) устанавливать большую(!) задержку и переключать исполнение кода на что-то ещё. Использованный публично delay() - как пример. Он имеет внутри себя функцию yeld(), в которой можно назначать некое исполнение фоном. Вывод на дисплей имеющий всего 16 символов в строке (да даже и все 40 - скроллирование) не имеет смысла быстрей 5мсек на символ. Вот для этого там и стоит такой delay() - подключаем что нужно в yeld() и не паримся. :)
в) реорганизация кода этой функции под RTOS и/или "конченные автоматы" так, чтобы она работала не блокирующе, если нет передачи или не завершена отправка предыдущей пачки. Тут можно поизголяться на предмет "динамического приоритета исполнения" - величины паузы.
.. остальное там сильно примитивно и не вижу смысла расписывать как-то. Как пример, содержащий много полезных трюков, а также дающий минимальный код как по программной так и по оперативной памяти и имеющий максимально возможную скорость работы .. считаю очень полезным для пополнения опыта. (моего конечно, в первую очередь)
А отмазки про настройик не принимаются. Тот код, что выложен в этом топике ВТРОЕ медленнее ликвид кристала. А то, что у тебя он показал сильно меньше - брехня. Или, код был другой. Один и тот же код так не делает.
Ну и облажамс с волатайл никто не отменял. Я, конечно,понимаю, что ты его вставил исключительно. чтобы меня потроллить, только брехня это. А обосрамс - совершенно объективен - не омажешься. Так-то, брехуёк наш обкакавшийся.
Тут осталось только вспомнить терминологию своего дружка из "ветеринарного техникума" .. :) Кто и КАК тут обделался, в общем-то видно и ясно уже всем, а не только лишь каждому.