Официальный сайт компании Arduino по адресу arduino.cc
STM32 Arduino IDE и дисплей 1602
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Всем привет! Имеется стандартная синяя плата на STM32. В нее был успешно записан ардуиновский бутлоадер. Теперь я могу спокойно прошиваться по USB. Blink заработал вообще без проблем. Решил сразу подключить дисплей 1602 со стандартной библиотекой. Прописал новые выводы, вгрузил. Но дисплей к сожалению показывает рандомные символы, но иногда проскакивает пара-тройка букв из слов, которые должны выводиться.
Перепробовал много всего, разные версии ардуины, разные библиотеки, другие порты, другие дисплеи но результат един.
Частично помогло только изменение CPU SPEED во вкладке Инструменты. Раньше стояло 72мгц, я же поставил 48мгц. Теперь при включении на первые секунды слова выводятся правильно, но все равно иногда некорректно, в первой строчке "Interfacing LCD", во второй -CircuitDigest после этого дисплей затягивает каракулями и на этом все.
Пример кода:
#include <LiquidCrystal.h> // include the LCD library const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; //mention the pin names to with LCD is connected to LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //Initialize the LCD void setup() { lcd.begin(16, 2);//We are using a 16*2 LCD lcd.setCursor(0, 0); //At first row first column lcd.print("Interfacing LCD"); //Print this lcd.setCursor(0, 1); //At secound row first column lcd.print("-CircuitDigest"); //Print this delay(2000); //wait for two secounds lcd.clear(); //Clear the screen } void loop() { lcd.setCursor(0, 0); //At first row first column lcd.print("STM32 -Blue Pill"); //Print this lcd.setCursor(0, 1); //At secound row first column lcd.print(millis() / 1000); //Print the value of secounds }
А если после lcd.begin и lcd.clear задержки на 2 секунды поставить что будет?
Ничего хорошего, к сожалению не получилось. На частоте 72мгц вообще глухо, на 42 реакция такая-же, только теперь с задержками в 2с.
А с другими ардуинами этот дисплей пробовали? У меня есть дисплеи которые clear выполняют больше секунды и setCursor 200 мс. Если раньше подать другую команду раньше, то дисплей перестаёт нормально отображать. Но ещё бы я проверил линию Е тестером.
У меня есть много дисплеев 1602, даже от факса где-то валяется. Сейчас использую качественный дисплей DV16230, с ним проблем на ардуине никаких не было. Пробовал и китайские с али, не работают.
Не знаю, может загрузчик не тот, но если блинк работает, то и это тоже должно
pixel28, а как вы включили дисплей? То, что он 5-вольтовый, а МК 3х вольтовый учли?
Подключал как и обычно, сам дисплей к 5ти вольтам. Выводы D7-D4, RS, EN к STM32. Попробовал даже подтянуть эти выводы к 5ти вольтам, ничего не изменилось. Как будто дисплей просто не успевает за STM32...
Помно, когда изучал Ассемблер и мк 8051 была проблема с 1602, потому что мк был слишком скоростной. Какими-то костылями и задержками удалось это исправить
Посмотрите в библиотеку. Как там сделаны задержки при инициализации. Наверняка дело в них. Если nop-ами, то понятно, что в них. Сделайте нормальные задержки и жизнь наладится.
Из стандартной библиотеки. Задержки через честные п.п. С этой библиотекой точно должно работать.
Да, задержки во всех библиотеках, которые я пробовал были сделаны именно так. Сегодня попробовал очередную библиотеку LiquidCrystal, с моим кодом дисплей спокойно завелся на частоте 72мгц, но после отработки Lcd.clear(); появляются кракозябры и дисплей больше не работает. Кажется я понял в чем была вся проблема) Не правильная работа Lcd.clear();
В итоге заменил все Lcd.clear(); на что-то типа lcd.print(" "); Отдельно для первой и второй строки и о чудо - работает!
Но почему же тогда Lcd.clear отказывается работать только у меня:?? У всех остальных она спокойно отрабатывает на STM32. Да, понимаю, что Arduino IDE на STM32 это полнейший бред, но я перешел на STM32 только из-за хорошего АЦП и ЦАП, буду осваивать их и хочу получить точность измерения напряжения в 3 знака после запятой.
Вот мой код:
Ты будешь смеяться, но и у меня много дисплеев не переваривают lcd.clear. Вернее переваривают, но подавать команду после них надо с большой задержкой. И задержку надо подбирать. Но больше 2 секунд ни разу не было. Поэтому я тоже чищу пробелами. Так получается быстрее.