Вы будете последним, у кого я что-то спрошу при разработке очередного изделия. ------ Если хотите продолжить срач - дайте ссылку на новую тему.
Срач разводите вы, не сумев принять новую для вас информацию.
А я вам и не собираюсь ничем помогать. Прочтите даташит самостоятельно и изучите вопрос самостоятельно. Цитату из даташита я привёл, но вы уперлись и не верите даже даташиту вашего хваленого мэлта. Минус вам пока что устный. За то же самое. Научитесь адекватно воспринимать новую для вас информацию.
_________________ Подпись убрал вместе с автором. aen
Последний раз редактировалось Мурато Мяуконни Вт янв 17, 2017 06:59:15, всего редактировалось 1 раз.
Лично вам я ничего не советую, не обольщайтесь. Создайте новую тему и обсуждайте там, с чем вы работаете. Вы не способны принять новую для вас информацию, даже если она исходит от самого производителя. Вы просто устарели со своими старыми методами и в силу устаревания вы и понятия не имеете о других возможностях - вам они просто недоступны с вашим ассемлерным подходом. Так что хотябы не вводите в заблуждение других людей.
_________________ Подпись убрал вместе с автором. aen
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
с моей т.з. существует общий, максимально общий, охватывающий абсолютно все случаи жизни, подход в выборе решений: если есть один способ, дающий 100% результат в любых условиях, именно он и является наиболее предпочтительным. почему? да потому, что полностью избавляет от необходимости задумываться об отклонениях.
если при переходе через улицу наиболее безопасным является движение под прямым углом к проезжей части - именно так и следует переходить дорогу, а не перебегать под острым углом, не пятиться задом наперед и т.п. - теоретически некоторые способы перехода в некоторых условиях могут дать существенно лучший результат, но применение первого способа всегда в любых случаях дает оптимальный результат (речь о безопасности).
трамвай над обходить спереди, автобус сзади и т.п. - эти правила в любом случае дают максимально качественный результат, и их и следует придерживаться. все "нюансы" и отступления от правил - допустимы, но не рекомендованы в качестве оптимальнейших.
так и с ЖКИ. есть метод, который с любым дисплеем, в любых услвиях, гарантированно дает положительный результат - это работа с контролем занятости контроллера ЖКИ. т.е. разработав соответствующую "библиотеку" можно вообще не беспокоиться о том, какой дисплей какие задержки обеспечивает, достаточно удостовериться, что он придерживается принятого протокола обмена. и абсолютно не стоит переживать, 40 мкС у него цикл или 43 или 37 или 98 вдруг. понимаете? раз - и навсегда.
если у вас в программе задержки (независимо от способа их формирования - циклы, таймеры или еще что), то при любых отступлениях от типа ЖКИ, для которого код проверен, вы обязаны удостовериться, что ваши задержки гарантированно более предельных для конкретного типа, без этого вы не можете быть уверены, что код сработает. и даже если вы закладываете 1 мс паузу там, где по даташиту ожидается 40 мкс, это ни от чего вас не спасает - все равно надо проверять даташит, иначе вы не разработчик, а шаляй-валяйщик.
и кому оно надо - лишние телодвижения? ради чего? ради утешения "я крут, потому что делаю не так, как проще"? можно делать по разному, но, имхо, лучше делать именно так, как я описал. не потому, что я описал, а потому что так правда лучше.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Albert_V, Если у вас ума хватит - прочтите наконец то даташит. Что за упорный чел то. Воистину - глупость не искоренить. Бред вы пишете сами. И вы уже готовы признать это, только ущемленное чсв этого не даёт сделать. Считаете ардуинщиками тех, кто пишет на Си? Ну-ну. А я вот считаю устаревшим динозавра тех, кто пыжится писать исключительно только на ассемблере и только на каких-нибудь древних 8-16-битках.
AVR, все случаи в жизни не предусмотрите. А пока будете предусматривать, технологии уйдут далеко вперёд и ваши наработки потеряют актуальность. Придётся заново переписывать. Универсальность - не есть оптимальность. Особенно на ассемблере вы не напишете универсального кода. Все равно придётся переделывать под другой контроллер. И даже на Си универсальность не полная. Где-то нужны одни ресурсы, один метод вывода, а где-то уже другой метод. Хорошие знания современной базы и быстрое ориентирование в ресурсах контроллера позволят не мучиться в создании сверхуниверсального метода.
Да и повторяю в который раз - "вдруг" в два-три раза параметры не изменятся. Это лажа дисплей иначе. К тому же, никто не мешает скорректировать ваш код под лажовый дисплей. А я вам толкую о другом методе, при котором можно после инита вообще забыть, что дисплей существует в системе. Но такой метод недоступен для устаревших динозавров, застрявших на этапе написания универсальной библиотеки
_________________ Подпись убрал вместе с автором. aen
Заголовок сообщения: Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Добавлено: Вт янв 17, 2017 08:09:25
Сверлит текстолит когтями
Карма: 15
Рейтинг сообщений: 210
Зарегистрирован: Вт мар 31, 2015 22:56:07 Сообщений: 1272 Откуда: Мы люди простые, живем в лесу, на пенек молимся
Рейтинг сообщения:0
Верно сказано: Спойлерлюбой спор в Интернете это битва за ЧСВ
для чтения этого самого битика, как нужно выставить ножку RS? BF -это команда, данные или не имеет значение. кстати какие команды можно считать с LCD?
RS = 0. На выводах, помимо BF в последнем разряде, будет выведен и текущий адрес курсора. При RS = 1 читается содержимое (код символа) по текущему адресу курсора. Это и всё, что можно почесть.
Это касалось предыдущих версий. Сейчас код выглядит получше, хотя и здесь есть вопросы: 1 Зачем дергаете DDRD в процедурах отправки? Постоянно спрашиваю, но вы так и держите интригу... Порты ведь настраиваются однократно. 2 Зачем спамите дисплей стробом, проверяя его занятость? И зачем вообще с busy_flag() заморочились, если проверяете ее однократно? 3 Функции write_nibbleCommand(int DATA) и write_nibbleData(int DATA) различаются лишь одним битом (RS_data). Этот бит можно менять в write_command(int DATA) и write_data(int DATA), как менее "пушистых", а предыдущие процедуры свести в одну.
if(SIZE_BUS==4) - для чего так? Если хотите сделать универсальный код под 4 и 8 бит ширины, применяйте условную компиляцию, не резервируя переменные. Сейчас у вас этот участок кода выглядит вот так: #define SIZE_BUS 4. То есть текст SIZE_BUS равнозначен тексту 4. И далее "если 4 равно 4 (а это истина всегда!) то сделать то-то ". Условная компиляция выглядит вот так:
#define SIZE_BUS_4bit /* выбрана 4 бит ширина */
/* --- секция кода */
#ifdef SIZE_BUS_4bit // если определено 4 бита, /* ------ код работы с 4 битной шириной */
#else // иначе, /* ------ код работы с 8 битной по умолчанию */
#endif
Для тех, кто вдруг опять сфигали начнет спорить на пустом месте - объясняю: во время работы ширина шины не меняется, дорожки физически не добавляются и не убираются. Как нарисовали их, так они и остаются. 4/8 бит на ходу не переключаются - это бессмысленно. Потому условная компиляция выбирает во время компиляции кода либо один, либо другой блок, в зависимости от написанного в #define. Во время работы кода бессмысленно выполнять проверку "если константа 4 равна 4" или "если константа 8 равна 4".
_________________ Подпись убрал вместе с автором. aen
По большому счёту, никаких проверок и не будет. При включенной оптимизиации и эта константа, и if() будет выброшен компилятором как абсолютно лишний. А оптимизация обычно всегда включена.
Собственно, такое поведение компилятора - это ещё одно подтверждение того, что так писать смысла нет.
А смысл? Переменных разных, как таковых - нет. Шина в коде "участвует" в 2-х местах: инсталляция и посылка байта/полубайта. В вашем варианте этот функционал придется дублировать, по видимому? WiseLord, смысл - есть. Мне такой вариант потребовался, когда я переходил с 8 на 4 бита. Очень удобно контролировать код и девайс, меняя всего одну константу.
Последний раз редактировалось MOHCTEP Вт янв 17, 2017 22:35:14, всего редактировалось 1 раз.
Не вдаваясь в подробности конкретного ногодергания, абстрактно можно представить вот так (абстрактно - это значит без привязки к конкретному контроллеру, то есть в общих чертах):
Код:
//==================== /* -- функция записи в дисплей символа (данных) */ void Write_Data (char data) { RS = 1; Send_Byte(data); } //.................................. /* -- функция записи в дисплей команды*/ void Write_Command (char data) { RS = 0; Send_Byte(data); } //==================== /* -- функция передачи байта по интерфейсу */ void Send_Byte(char byte) { #ifdef SIZE_BUS_4bit // если 4 бита ширина шины
while(CheckBSY){} // ожидание освобождения E = 1; // E _/- PORT = (byte>>4) & 0x0F // на выход старший полубайт E = 0; // E -\_
while(CheckBSY){} // ожидание освобождения (насколько помню, нужно тут ждать?) E = 1; // E _/- PORT = byte & 0x0F // на выход младший полубайт E = 0; // E -\_
#else //............ иначе по умолчанию 8 бит ширина шины ............
while(CheckBSY){} // ожидание освобождения E = 1; // E _/- PORT = byte; // на выход старший полубайт E = 0; // E -\_
#endif }
// ---------- /* --- функция проверки бита занятости */ int CheckBSY(void) { if (PORT & P7) return 1; // читается бит занятости, если есть, то возвращается 1 else return 0; // если нет, возвращается 0 }
_________________ Подпись убрал вместе с автором. aen
Последний раз редактировалось Мурато Мяуконни Вт янв 17, 2017 21:36:41, всего редактировалось 2 раз(а).
По большому счёту, никаких проверок и не будет. При включенной оптимизиации и эта константа, и if() будет выброшен компилятором как абсолютно лишний. А оптимизация обычно всегда включена.
Оптимизация обычно включена на AVR, там отладчика почти ни у кого нет, а на STM32, например, он почти у всех есть, потому приходится задумываться над тем, что в дебаге размер может легко вырасти в несколько раз. Вчера как раз решал оставить два класса или совместить в одном, через if... Второй вариант вышел почти на пол Кб больше, оставил пока два класса, жду gcc 7, там есть constexpr if
. При включенной оптимизиации и эта константа, и if() будет выброшен компилятором как абсолютно лишний..
А может все же лучше сразу писать правильно, не держа в уме то, что потом будет, возможно, выброшено. Тем более, нормальные средства разработки имеют весьма удобные интерфейсы и условную прекомпиляцию делают на лету во время написания кода, затеняя не определенные блоки кода.
_________________ Подпись убрал вместе с автором. aen
с какой целью сделана рекурсия в busy_flag()? потенциально - это источник больших проблем!
С целью прослушки PIN7 до тех пор пока условие станет ложью.
Добавлено after 19 minutes 24 seconds:
MOHCTEP писал(а):
1 Зачем дергаете DDRD в процедурах отправки? Постоянно спрашиваю, но вы так и держите интригу... Порты ведь настраиваются однократно. 2 Зачем спамите дисплей стробом, проверяя его занятость? И зачем вообще с busy_flag() заморочились, если проверяете ее однократно? 3 Функции write_nibbleCommand(int DATA) и write_nibbleData(int DATA) различаются лишь одним битом (RS_data). Этот бит можно менять в write_command(int DATA) и write_data(int DATA), как менее "пушистых", а предыдущие процедуры свести в одну.
1. К коде есть функции чтения,в частности при проверке BF, то есть порт переопределяю на вход, при записи на выход. 2.Первую часть вопроса не понял byus_flag проверяю после каждого процесса записи/чтения о чем свидетельствует наличие вызова функции byus_flag() в конце функции записи/чтения. 3. согласен, но пока кабы не запутаться и не пропустить ошибку, решил написать громадно,но подробно.это же не является фатальной ошибкой?
Добавлено after 10 minutes 31 second:
Мурато Мяуконни писал(а):
if(SIZE_BUS==4) - для чего так? Если хотите сделать универсальный код под 4 и 8 бит ширины, применяйте условную компиляцию, не резервируя переменные. Сейчас у вас этот участок кода выглядит вот так: #define SIZE_BUS 4. То есть текст SIZE_BUS равнозначен тексту 4. И далее "если 4 равно 4 (а это истина всегда!) то сделать то-то ". Условная компиляция выглядит вот так:
#define SIZE_BUS_4bit /* выбрана 4 бит ширина */
/* --- секция кода */
#ifdef SIZE_BUS_4bit // если определено 4 бита, /* ------ код работы с 4 битной шириной */
#else // иначе, /* ------ код работы с 8 битной по умолчанию */
#endif
Для тех, кто вдруг опять сфигали начнет спорить на пустом месте - объясняю: во время работы ширина шины не меняется, дорожки физически не добавляются и не убираются. Как нарисовали их, так они и остаются. 4/8 бит на ходу не переключаются - это бессмысленно. Потому условная компиляция выбирает во время компиляции кода либо один, либо другой блок, в зависимости от написанного в #define. Во время работы кода бессмысленно выполнять проверку "если константа 4 равна 4" или "если константа 8 равна 4".
Принято к сведению!А вариант отраженный в исходнике он что не рабочий?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения