STM32 Arduino IDE и дисплей 1602

pixel28
Offline
Зарегистрирован: 23.11.2015

Всем привет! Имеется стандартная синяя плата на 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
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

А если после lcd.begin и lcd.clear задержки на 2 секунды поставить что будет?

pixel28
Offline
Зарегистрирован: 23.11.2015

Ничего хорошего, к сожалению не получилось. На частоте 72мгц вообще глухо, на 42 реакция такая-же, только теперь с задержками в 2с. 

nik182
Offline
Зарегистрирован: 04.05.2015

А с другими ардуинами этот дисплей пробовали? У меня есть дисплеи которые clear выполняют больше секунды и setCursor 200 мс. Если раньше подать другую команду раньше, то дисплей перестаёт нормально отображать. Но ещё бы я проверил линию Е тестером.

 

pixel28
Offline
Зарегистрирован: 23.11.2015

У меня есть много дисплеев 1602, даже от факса где-то валяется. Сейчас использую качественный дисплей DV16230, с ним проблем на ардуине никаких не было. Пробовал и китайские с али, не работают. 
Не знаю, может загрузчик не тот, но если блинк работает, то и это тоже должно

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

pixel28, а как вы включили дисплей? То, что он 5-вольтовый, а МК 3х вольтовый учли?

pixel28
Offline
Зарегистрирован: 23.11.2015

Подключал как и обычно, сам дисплей к 5ти вольтам. Выводы D7-D4, RS, EN к STM32. Попробовал даже подтянуть эти выводы к 5ти вольтам, ничего не изменилось. Как будто дисплей просто не успевает за STM32...

Помно, когда изучал Ассемблер и мк 8051 была проблема с 1602, потому что мк был слишком скоростной. Какими-то костылями и задержками удалось это исправить 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Посмотрите в библиотеку. Как там сделаны задержки при инициализации. Наверняка дело в них. Если nop-ами, то понятно, что в них. Сделайте нормальные задержки и жизнь наладится.

nik182
Offline
Зарегистрирован: 04.05.2015
void LiquidCrystal::pulseEnable(void) {
  digitalWrite(_enable_pin, LOW);
  delayMicroseconds(1);    
  digitalWrite(_enable_pin, HIGH);
  delayMicroseconds(1);    // enable pulse must be >450ns
  digitalWrite(_enable_pin, LOW);
  delayMicroseconds(100);   // commands need > 37us to settle
} 

Из стандартной библиотеки. Задержки через честные п.п. С этой библиотекой точно должно работать. 

pixel28
Offline
Зарегистрирован: 23.11.2015

Да, задержки во всех библиотеках, которые я пробовал были сделаны именно так. Сегодня попробовал очередную библиотеку  LiquidCrystal, с моим кодом дисплей спокойно завелся на частоте 72мгц, но после отработки Lcd.clear(); появляются кракозябры и дисплей больше не работает. Кажется я понял в чем была вся проблема) Не правильная работа Lcd.clear();  
В итоге заменил все Lcd.clear(); на что-то типа lcd.print("                        "); Отдельно для первой и второй строки и о чудо - работает! 
Но почему же тогда Lcd.clear отказывается работать только у меня:?? У всех остальных она спокойно отрабатывает на STM32. Да, понимаю, что Arduino IDE на STM32 это полнейший бред, но я перешел на STM32 только из-за хорошего АЦП и ЦАП, буду осваивать их и хочу получить точность измерения напряжения в 3 знака после запятой. 

Вот мой код:

#include <LiquidCrystal.h>
 
int sensorPin = PA0;    // к пину Analog IN 0
int sensor2Pin = PA2;   // к пину Analog IN 2
int ledPin = PC13;      // пин к затвору транзистора
 
LiquidCrystal lcd(PB9, PB8, PB7, PB6, PB5, PB4); // initialize the library with the numbers of the interface pins
 
int sensorValue = 0;  // variable to store the value coming from the sensor 
int sensor2Value = 0;  // variable to store the value coming from the sensor 
float LiMinThreshold = 2700; // Lithium Minimal Voltage for load removal
float LiMaxThreshold = 4200; // Lithium Max Voltage for load removal
float NmhMinThreshold = 950; // NMH Minimal Voltage for load removal
float NmhMaxThreshold = 1600; // NMH Max Voltage for load removal
float SelectedMinThreshold = 5000;
float current;
int BatVoltage = 5000;
int FetVoltage = 5000;
long TotalCurrent = 0;
boolean done = false;
boolean i = false;
unsigned long PrevMillis ;
unsigned long MillisPassed ;
 
void CL2(){
  lcd.setCursor(0, 1);// Second line first char
  lcd.print("                        ");
  lcd.setCursor(0, 1);// Second line first char
}  

void CL1(){
  lcd.setCursor(0, 0);// First line first char
  lcd.print("                        ");
  lcd.setCursor(0, 0);// First line first char
}
 
void setup() {
  pinMode(ledPin, OUTPUT);//activation led and enable for FET
  lcd.begin(16, 2);// set up the LCD's number of rows and columns: 
  delay(500);
  
  lcd.print("     HELLO     ");  // Print a message to the LCD.
  
  lcd.setCursor(0, 1);// Second line first char
  lcd.print("Detecting Bat"); // print voltage value
  
  delay(2000);
   
  lcd.setCursor(0, 1);// Second line first char
  lcd.print("                        ");
  
  lcd.setCursor(0, 1);// Second line first char
  digitalWrite(ledPin, HIGH);   // set the LED on
  sensorValue = analogRead(sensorPin);   // read the value from the sensor:
  digitalWrite(ledPin, LOW);   // set the LED off
  // Detecting battery type



  
  BatVoltage = map(sensorValue, 0, 4095, 0, 3316)/0.7522;
  if (BatVoltage > 4500){
    lcd.print("Warning high-V! ");
    done = true;}
  else if (BatVoltage > LiMinThreshold){
    lcd.print("Type:Li-Ion Bat ");
    SelectedMinThreshold = LiMinThreshold;}
  else if (BatVoltage > NmhMinThreshold){
    lcd.print("Type:NiMH/Cd Bat ");
    SelectedMinThreshold = NmhMinThreshold;}
  else{
    lcd.print("Unknown Bat V < 1");
    done = true;}
  lcd.print("V=");
  lcd.print(map(sensorValue, 0, 4095, 0, 3316)/0.7522); // print voltage value
  delay(3000); 
  CL2();
  PrevMillis = millis();
}
 
void loop() {

  

      int time = millis() / 1000;
    
      if (BatVoltage > SelectedMinThreshold && !done) {
      digitalWrite(ledPin, HIGH);   // set the LED on
      sensorValue = analogRead(sensorPin);   // read the value from the sensor:
      sensor2Value = analogRead(sensor2Pin);   // read the value from the FET:
      
      FetVoltage = (map(sensor2Value, 0, 4095, 0, 3316)/0.7554);
      BatVoltage = (map(sensorValue, 0, 4095, 0, 3316))/0.7522;
      current = (BatVoltage/3.3);
      
      CL1();
      
      lcd.setCursor(0, 0);// First line first char
      TotalCurrent=TotalCurrent+MillisPassed/1000*(BatVoltage-FetVoltage)/3.3/3.6;
      lcd.print("    I=");
      lcd.print(TotalCurrent/1000);     
      lcd.print("mAH");
      

      lcd.setCursor(0, 1);// Second line first char
      lcd.print("V=");
      lcd.print(BatVoltage/1000.0); // print voltage value
      lcd.print("V ");

      
      lcd.print("A=");
      lcd.print(current/1000);
      lcd.print("A"); 
      
      
      delay(1000); 
      MillisPassed = millis()- PrevMillis;
      PrevMillis = millis();
      
     
    }
    else
    {
      done=true;
      digitalWrite(ledPin, LOW);   // set the LED off - stop loading
      CL2();

      
      sensorValue = analogRead(sensorPin);   // read the value from the sensor:
      BatVoltage = map(sensorValue, 0, 4095, 0, 3316)/0.7522;
      lcd.setCursor(0, 1);// Second line first char
      lcd.print("V=");
      lcd.print(BatVoltage/1000.0); // print voltage value
      lcd.print("V ");
      lcd.print("I=");
      lcd.print(TotalCurrent/1000);     
      lcd.print("mAH");

         
    if(i==false) 
    { 
      i=true;
     lcd.setCursor(4, 0);
        if (time / 60 / 60 < 10) {
          lcd.print ("0");                  //часы
      }
      lcd.print (time / 60 / 60);
      lcd.print (":");
        if (time / 60 % 60 < 10) {
          lcd.print ("0");                  //минуты
      }
      lcd.print ((time / 60) % 60);
      lcd.print (":");
        if (time%60<10) { lcd.print ("0"); }//секунды
          lcd.print (time%60);
    }

      delay(1000);
    }
}

 

nik182
Offline
Зарегистрирован: 04.05.2015

Ты будешь смеяться, но и у меня много дисплеев не переваривают lcd.clear. Вернее переваривают, но подавать команду после них надо с большой задержкой. И задержку надо подбирать. Но больше 2 секунд ни разу не было. Поэтому я тоже чищу пробелами. Так получается быстрее.

sanstan
Offline
Зарегистрирован: 24.06.2019

Добрый день, использую nucleo f030R8.  не работает библиотека LiquidCrystal.h 

Проверил задержки - 

void LiquidCrystal::pulseEnable(void) {
  digitalWrite(_enable_pin, LOW);
  delayMicroseconds(1);   
  digitalWrite(_enable_pin, HIGH);
  delayMicroseconds(1);    // enable pulse must be >450ns
  digitalWrite(_enable_pin, LOW);
  delayMicroseconds(100);   // commands need > 37us to settle
}

стоят правильно,

думал, может дисплей неисправен, запрограммировал через Micropascal - дисплей завелся сразу, но с русским языком какие то накладки.

Подскажите, как запустить дисплей 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А он (дисплей) точно кириллицу поддерживает?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

BOOM пишет:

А он (дисплей) точно кириллицу поддерживает?

Да нет, конечно! Но почитать интересно. Там создать десяток символов - и все дела. А тут - целая тема..

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ну бывают и с поддержкой. Тут уж 50 на 50. 

sanstan
Offline
Зарегистрирован: 24.06.2019
А он (дисплей) точно кириллицу поддерживает?

Поддерживает - русские символы появляются , но буквам не соответствуют. - это в микропаскале

В Ардуино - сплошной верхний ряд - прямоугольники...  - не походит инициализация почему то...  

 

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

sanstan пишет:

А он (дисплей) точно кириллицу поддерживает?

Поддерживает - русские символы появляются , но буквам не соответствуют. - это в микропаскале

В Ардуино - сплошной верхний ряд - прямоугольники...  - не походит инициализация почему то...  

 

 

Ну измените библиотеку по Вашим опытам. И опубликуйте на гигхабе. И будет Вам частье!

sanstan
Offline
Зарегистрирован: 24.06.2019

Я бы изменил библиотеку.... если бы знал, что менять...

Максимум попробовал задержки поставить не 1мкс, а 5 )) - не заработало:
void LiquidCrystal::pulseEnable(void)

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

sanstan пишет:

Я бы изменил библиотеку....

И вот такой чувственный вдох.

Чего менять  - так изображение символов. Русских

sanstan
Offline
Зарегистрирован: 24.06.2019

Тут не доходит дело до символов, потому что ничего не отображается - сплошной верхний ряд - прямоугольники вместо ЛЮБЫХ символов , не только русских букв.

nik182
Offline
Зарегистрирован: 04.05.2015

Верхний ряд прямоугольников - это значит нет начальной инициализации. 

sanstan
Offline
Зарегистрирован: 24.06.2019

Как сделать инициализацию?? Использую стандартную библиотеку LiquidCrystal.h   плата Nucleo F030R8. Дисплей 16*2,

питание +5В - управление +3,3   (Дисплей проверен - работает в MicroPascal - символы отображаются)

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Примеры к этой стандартной библиотеке работают?

sanstan
Offline
Зарегистрирован: 24.06.2019

нет, не работают. я пример и пытался запустить

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

sanstan пишет:

Поддерживает - русские символы появляются , но буквам не соответствуют.

Так это почти всегда так. Перекодировать надо.

b707
Offline
Зарегистрирован: 26.05.2017

sanstan пишет:

Как сделать инициализацию?? Использую стандартную библиотеку LiquidCrystal.h   плата Nucleo F030R8. Дисплей 16*2,

вы в какой среде прогрпммируете? Ардуино? какой аддон? Библиотека хотя бы компилируется?

Выложите код и схему подключения

sanstan
Offline
Зарегистрирован: 24.06.2019
#include "LiquidCrystal.h"

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = PA_12, en = PA_6, d4 = PA_11, d5 = PA_7, d6 = PB_12, d7 = PB_6;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  lcd.print("hello, w!");
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}

Схема подключения :    https://yapx.ru/v/K47VM

b707
Offline
Зарегистрирован: 26.05.2017

ответов на вопросы не увидел.

Еще выложите ссылку на библиотеку. библиотек с названием LiquidCrystal.h - минимум десяток

sanstan
Offline
Зарегистрирован: 24.06.2019

Библиотека компилируется , Arduino 1.8.5. - в ней стандартная библиотека LiquidCrystal.h :  https://yadi.sk/d/eQcECrWSUGXPTw

b707
Offline
Зарегистрирован: 26.05.2017

sanstan пишет:

в ней стандартная библиотека LiquidCrystal.h :  https://yadi.sk/d/eQcECrWSUGXPTw

Простите, а отвечать нормально на вопросы можно? Или надо все клещами тянуть?

Стандартная Ардуино не поддерживает СТМ32. Вы должны были сами ставить пакет для СТМ, я вас спросил какой - ответа нет.

Сссылка на ваш яндекс-диск для библиотеки меня не интересует. каждая библиотека ардуина лежит на гитхабе. дайте ссылку туда. откуда вы ее скачивали.

sanstan
Offline
Зарегистрирован: 24.06.2019

Вот этот пакет : 

https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json

я отдельно не скачивал ее с гитхаба...

b707
Offline
Зарегистрирован: 26.05.2017

sanstan пишет:

Вот этот пакет : 

https://github.com/stm32duino/BoardManagerFiles/raw/master/STM32/package_stm_index.json

я отдельно не скачивал ее с гитхаба...

в указанном Вами пакете нет такой библиотеки. Из чего следует, что вы используете библиотеку для контроллеров АВР и ее работу в СТМ32 никто не гарантирует.

С точки зрения программиста - раз у вас дисплей на этой плате в Паскале работает, то проще всего взять секцию инициализации из паскаля и сравнить ее с инициализацией в библиотеке на Си.

А вам только могу посоветовать поискать в Гугле по комбинации названия библиотеки и обозначения вашей платы, может кто уже разбирался

 

Да. еще вопрос - а схемы подключения в Микропаскале и в обсуждаемой библиотеке - совпадают? все пины одни и те же используются?

sanstan
Offline
Зарегистрирован: 24.06.2019

Микропаскаль - штука очень удобная, но денег стоит и очень специфична, если что то доработать надо.

Спасибо за подсказку - теперь остается библиотеку как то прикрутить... а какая библиотека подойдет?? 

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

sanstan пишет:

Микропаскаль - штука очень удобная, но денег стоит и очень специфична, если что то доработать надо.

Спасибо за подсказку - теперь остается библиотеку как то прикрутить... а какая библиотека подойдет?? 

 

Например эта