Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

STM32F030F4 + HD44780 работает через раз

Непрочитано 09.09.2016, 23:13  
miwutka
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию STM32F030F4 + HD44780 работает через раз

Добрый день. Подключил ЖК к МК и он через раз включается. То есть инит проходит и экран чистый без ничего. Перезупусков 20-30 сделаешь и показывает текст. Если перепрошить 1-3 раза то показывает. Выключишь, включишь и опять чистый. Подскажите что может быть не так. Инит делал по даташиту.....
PHP код:
#define RS_PIN         GPIO_Pin_0
#define RS_PORT     GPIOA

//#define RW_PIN         GPIO_Pin_4
//#define RW_PORT     GPIOB

#define EN_PIN         GPIO_Pin_1
#define EN_PORT     GPIOA

#define DB4_PIN     GPIO_Pin_2
#define DB4_PORT     GPIOA

#define DB5_PIN     GPIO_Pin_3
#define DB5_PORT     GPIOA

#define DB6_PIN     GPIO_Pin_4
#define DB6_PORT     GPIOA

#define DB7_PIN     GPIO_Pin_5
#define DB7_PORT     GPIOA

#define RS(a)         GPIO_WriteBit(RS_PORT, RS_PIN, (BitAction)a);
//#define RW(a)         GPIO_WriteBit(RW_PORT, RW_PIN, (BitAction)a);
#define EN(a)         GPIO_WriteBit(EN_PORT, EN_PIN, (BitAction)a);

#define DB4(a)         GPIO_WriteBit(DB4_PORT, DB4_PIN, (BitAction)a);
#define DB5(a)         GPIO_WriteBit(DB5_PORT, DB5_PIN, (BitAction)a);
#define DB6(a)         GPIO_WriteBit(DB6_PORT, DB6_PIN, (BitAction)a);
#define DB7(a)         GPIO_WriteBit(DB7_PORT, DB7_PIN, (BitAction)a);

void LCD_Set_Data(uint8_t data)
{
    
    if ( ((data ›› 7)&0x01) == 1 ) {DB7(1)} else {DB7(0)}
    if ( ((data ›› 6)&0x01) == 1 ) {DB6(1)} else {DB6(0)}
    if ( ((data ›› 5)&0x01) == 1 ) {DB5(1)} else {DB5(0)}
    if ( ((data ›› 4)&0x01) == 1 ) {DB4(1)} else {DB4(0)}
    //if ( ((data ›› 3)&0x01) == 1 ) {DB3(1)} else {DB3(0)}
    //if ( ((data ›› 2)&0x01) == 1 ) {DB2(1)} else {DB2(0)}
    //if ( ((data ›› 1)&0x01) == 1 ) {DB1(1)} else {DB1(0)}
    //if ( ((data ›› 0)&0x01) == 1 ) {DB0(1)} else {DB0(0)}


}

void LCD_SendCommand4(uint8_t data)
{
    RS(0)
    LCD_Set_Data(data&0xF0);
    EN(1)
    Delay_us(100);
    EN(0)

    LCD_Set_Data((data‹‹4)&0xF0);
    EN(1)
    Delay_us(100);
    EN(0)
}

void LCD_SendData4(uint8_t data)
{
    RS(1)
    LCD_Set_Data(data&0xF0);
    EN(1)
    Delay_us(100);
    EN(0)

    LCD_Set_Data((data‹‹4)&0xF0);
    EN(1)
    Delay_us(100);
    EN(0)

}

void LCD_ini4(void)
{
    LCD_init_PORT();
    Delay_ms(55);
//    LCD_SendCommand(0x20);  // for 4-bit
//    Delay_us(50);
    LCD_SendCommand4(0x28);  // for 8-bit
    Delay_us(100);
    LCD_SendCommand4(0x28);  // cursor
    Delay_us(100);
    LCD_SendCommand4(0x0F);  // clear LCD
    Delay_us(100);
    LCD_SendCommand4(0x01);  // shift LCD, increment/decrement
    Delay_ms(2);
    LCD_SendCommand4(0x06);  // home cursom DDRam
    Delay_us(100);
    LCD_SendCommand4(0x02);  // home cursom DDRam
    Delay_ms(2);

}

void LCD_Send_String4(uint8_t String_Num, char* str)
{
    uint8_t i=0;

    if (String_Num == 0)
    {
        LCD_SendCommand4(0x80);  // go to ddram 00 adres - 0 stroka
    } else {
        LCD_SendCommand4(0xC0);  //go to ddram 40 adres - 1 stroka
    }
    Delay_ms(2);

    while( str[i] != 0)
    {
        LCD_SendData4(str[i]);
        i++;
    }
}
в вайле вот так
while (1)
    {
      sprintf(str, "speed = %4i ",speed_sr);
                LCD_Send_String4(0, str);
      sprintf(str2, "Hz = %4i ",t);
                LCD_Send_String4(1, str2);
      Delay_ms(300);
    } 
с чем бороться, что исправить?....
Реклама:

Последний раз редактировалось miwutka; 10.09.2016 в 20:04.
miwutka вне форума  
Непрочитано 09.09.2016, 23:19  
akegor
Гуру портала
 
Аватар для akegor
 
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
akegor на пути к лучшему
По умолчанию Re: STM32F030F4 + HD44780 работает через раз

Кажись, недавно кто-то бился головой в стену с подобным вопросом и ему помогла задержка, больше чем по ДШ.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor вне форума  
Непрочитано 10.09.2016, 11:34  
firew0rker
Заблокирован
 
Регистрация: 22.04.2010
Сообщений: 347
Сказал спасибо: 41
Сказали Спасибо 106 раз(а) в 95 сообщении(ях)
firew0rker на пути к лучшему
По умолчанию Re: STM32F030F4 + HD44780 работает через раз

Из статьи "Алфавитно-цифровые индицирующие ЖК-модули на основе контроллера HD44780",сохранённой с gaw.ru:
Производитель контроллера рекомендует выполнять следующую последовательность действий для инициализации. Выдержать паузу не менее 15 мс между установлением рабочего напряжения питания (› 4,5 В) и выполнением каких-либо операций с контроллером. Первой операцией выполнить команду, выбирающую разрядность шины (это должна быть команда $30 независимо от того, какой разрядности интерфейс вы собираетесь использовать в дальнейшем), причем перед выполнением этой операции не проверять значение флага BF. Далее опять выдержать паузу не менее 4,1 мс и повторить команду выбора разрядности шины, причем перед подачей команды вновь не производить проверку флага BF. Следующим шагом необходимо вновь выдержать паузу, на этот раз 100 мкс, и в третий раз повторить команду установления разрядности шины, вновь без проверки BF. Эти три операции являются инициализирующими и призваны вывести контроллер в исходный режим работы (то есть перевести в режим работы с 8-ми разрядной шиной) из любого состояния. Следом за ними нормальным порядком (без выдерживания пауз, но с проверкой флага BF) выполняется инициализация режимов работы с выдачей инициализирующей последовательности, аналогичной указанной в таблице 7 (содержащей в том числе команду выбора необходимой разрядности шины).
Необходимо помнить, что когда Вы объявляете режим работы с 4-х разрядной шиной, то есть выдаете команду $20, то делаете это обычно из 8-ми разрядного режима, который устанавливается автоматически после подачи напряжения питания, а значит вы не сможете адекватно объявить необходимое значение флагов N и F, располагающихся в младшей тетраде команды установки разрядности шины. Поэтому команду необходимо повторить в уже установившемся 4-х разрядном режиме путем последовательной передачи двух тетрад, то есть для 4-х разрядного режима образом.
firew0rker вне форума  
Непрочитано 10.09.2016, 18:29  
miwutka
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: STM32F030F4 + HD44780 работает через раз

firew0rker, если я подключил 4-битную шину то как я смогу по 8-битной шине сказать что я выбираю 8-битный режим, а потом выбрать 4-ех битный? Если для этого нужно 8-битный режим подключать то смысл 4-ех битный потом использовать. Всеравно 8 проводов использовано? Спасибо за сообщение, но я немного сути не понял.

Сделал вот такой инит. Чуть лучше. Но всеравно бред. ЖК запитан от 5 вольт. МК от 3.3.
PHP код:
void LCD_ini4(void)
{
    LCD_init_PORT();
    Delay_ms(55);
    LCD_SendCommand4(0x11);  // for 8-bit
    Delay_ms(4);
   LCD_SendCommand4(0x11);  // for 8-bit
    Delay_us(100);
   LCD_SendCommand4(0x11);  // for 8-bit
    Delay_ms(1);
    LCD_SendCommand4(0x10);  // for 8-bit
    Delay_ms(4);
    LCD_SendCommand4(0x28);  // cursor
    Delay_ms(1);
   LCD_SendCommand4(0x0C);  // clear LCD
    Delay_ms(1);
    LCD_SendCommand4(0x06);  // shift LCD, increment/decrement
    Delay_ms(1);
    LCD_SendCommand4(0x0F);  // clear LCD
    Delay_ms(1);
    LCD_SendCommand4(0x02);  // home cursom DDRam
    Delay_ms(1);

} 
miwutka вне форума  
Непрочитано 10.09.2016, 18:44  
AR_Favorit
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: STM32F030F4 + HD44780 работает через раз

Сообщение от miwutka Посмотреть сообщение
firew0rker, если я подключил 4-битную шину то как я смогу по 8-битной шине сказать что я выбираю 8-битный режим, а потом выбрать 4-ех битный? Если для этого нужно 8-битный режим подключать то смысл 4-ех битный потом использовать. Всеравно 8 проводов использовано? Спасибо за сообщение, но я немного сути не понял.
8 проводов использовать не надо, просто в 4 старших разряда 3 раза с указанными паузами (не обязательно с точными значениями паузы, 4,1 мс и 100 мкс - это просто минимальные значения, которые надо выдержать до следующей записи) записываете тройку (старший полубайт команды). И все. Младшую половину байта писать не надо. Контроллер после включения находится НЕ в 4-битном режиме, и посылку второй половины байта воспринимате как отдельную команду, которой там быть не должно.

Затем - точно так же, без младшей половины байта передать 0x20.

Для этого у вас должна быть отдельная функция, например,

Код:
void LCD_SendNibble(uint8_t data)
{
    RS(0)
    LCD_Set_Data(data);
    EN(1)
    Delay_us(100);
    EN(0)
}

И ваша инициализация таким образом превращается в
Код:
void LCD_ini4(void)
{
    LCD_init_PORT();
    Delay_ms(55);
    LCD_SendNibble(0x30);  
    Delay_ms(5);  //Не менее 4,1 мс! 4 - это меньше, чем 4,1
    LCD_SendNibble(0x30);  
    Delay_us(100);
    LCD_SendNibble(0x30);  
    Delay_ms(1);

    LCD_SendNibble(0x20);  // Перевод в 4-битный режим, команда 0x20, а не 0x10
    Delay_ms(5);

    LCD_SendCommand4(0x28);  // повтор команды перехода в 4-битный режим, но уже в 4-битном режиме, с возможностью передать бит в младшем полубайте, устанавливающий 2-строчный режим
    Delay_ms(1);
   LCD_SendCommand4(0x0C);  // clear LCD
    Delay_ms(1);
    LCD_SendCommand4(0x06);  // shift LCD, increment/decrement
    Delay_ms(1);
    LCD_SendCommand4(0x0F);  // clear LCD
    Delay_ms(1);
    LCD_SendCommand4(0x02);  // home cursom DDRam
    Delay_ms(1);
А с командами в инициализации уже сами разберитесь, судя по комметариям, этого не сделано...

Последний раз редактировалось AR_Favorit; 10.09.2016 в 19:18.
AR_Favorit вне форума  
Непрочитано 10.09.2016, 18:45  
Неаполитанский Залив
Временная регистрация
 
Регистрация: 10.09.2016
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 5 раз(а) в 4 сообщении(ях)
Неаполитанский Залив на пути к лучшему
По умолчанию Re: STM32F030F4 + HD44780 работает через раз

На первом этапе инициализации дисплей работает в 4-битном режиме при любом раскладе. Инфа принимается только по D4 - D7, только по старшей половине порта.
Процедура инициализации для 4-битного режима: 0x3, 0x3, 0x3, 0x2, 0x2, 0xC, 0x0, 0xC, 0x0, 0x1. Данные передаются полубайтами, с интервалом 5 мс. После этого, выждав 5 мс после последней передачи (0х1), можно уменьшить интервал передачи полубайтов до 45-80 мс и спокойно передавать текст и команды.
Этот порядок опробован давным-давно и работает без нареканий во многих случаях.
Неаполитанский Залив вне форума  
Сказали "Спасибо" Неаполитанский Залив
miwutka (10.09.2016)
Непрочитано 10.09.2016, 19:27  
miwutka
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: STM32F030F4 + HD44780 работает через раз

Неаполитанский Залив, прописал ваш инит. Вроде лучше. Плата питается от ст-линка программатора. Может изза несогласованных уровней такие глюки? Бывает дисплей зависал. На вашем ините понаблюдаю. Бывало подключаю программатор(от него всё работает) а на ЖК ероглифы и фигня. С вашим инитом тоже 1 из 5 включений ероглифы. Думаю что надо уровни согласовывать?? Подключено к А0-А5. RW к минусу. Я его не использую...
miwutka вне форума  
Непрочитано 10.09.2016, 19:27  
AR_Favorit
Почётный гражданин KAZUS.RUN
 
Регистрация: 13.03.2010
Сообщений: 2,896
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
AR_Favorit на пути к лучшему
По умолчанию Re: STM32F030F4 + HD44780 работает через раз

Сообщение от Неаполитанский Залив Посмотреть сообщение
На первом этапе инициализации дисплей работает в 4-битном режиме при любом раскладе. Инфа принимается только по D4 - D7, только по старшей половине порта.
Процедура инициализации для 4-битного режима: 0x3, 0x3, 0x3, 0x2, 0x2, 0xC, 0x0, 0xC, 0x0, 0x1. Данные передаются полубайтами, с интервалом 5 мс. После этого, выждав 5 мс после последней передачи (0х1), можно уменьшить интервал передачи полубайтов до 45-80 мс и спокойно передавать текст и команды.
Этот порядок опробован давным-давно и работает без нареканий во многих случаях.
Не нужно распространять свои заблуждения. Выше правильно написали, после включения дисплей в восьмибитном режиме, и пока не пройдет команда переключения в 4-битный, слать вторые полубайты не надо.

Так в даташите на контроллер расписано и даже разрисовано, а то, что кривые инициализации работают, и даже не просто изредка, а "во многих случаях" - ну спасибо инженерам хитачи)

Вот фрагмент даташита, место, с которого надо слать полубайты, пометил стрелкой, режим, в котором находится контроллер - подчеркнул.
Миниатюры:
Нажмите на изображение для увеличения
Название: 11330392.png
Просмотров: 0
Размер:	45.2 Кб
ID:	101026  
AR_Favorit вне форума  
Сказали "Спасибо" AR_Favorit
miwutka (10.09.2016)
Непрочитано 10.09.2016, 19:32  
Неаполитанский Залив
Временная регистрация
 
Регистрация: 10.09.2016
Сообщений: 29
Сказал спасибо: 1
Сказали Спасибо 5 раз(а) в 4 сообщении(ях)
Неаполитанский Залив на пути к лучшему
По умолчанию Re: STM32F030F4 + HD44780 работает через раз

Можете хоть серо-буро-малиновым цветом подчеркивать, да только вот находящиеся левее буковки с циферками однозначно показывают, что инфа принимается только на старшую половину порта, только на 4 линии.
Даташиты тоже содержат неоднозначности. Написано одно, а показано другое. В другом месте даташита написано третье. И даташиты отличаются. И фиг знает, что подразумевалось на самом деле.
Я же сужу по тому, насколько надежно работает тот или иной метод.

Кстати, на приведенном вами фрагменте из даташита нет противоречия тому, что я написал в цифрах.
Написанный мной порядок правильно отрабатывает даже повторную инициализацию без выключения питания. Могу приложить видео с дисплеями Winstar.

Последний раз редактировалось Неаполитанский Залив; 10.09.2016 в 19:40.
Неаполитанский Залив вне форума  
Непрочитано 10.09.2016, 19:33  
miwutka
Почётный гражданин KAZUS.RUN
 
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
miwutka на пути к лучшему
По умолчанию Re: STM32F030F4 + HD44780 работает через раз

Новый инит тоже виснит ))) Попробую сделать инит из даташита ))
miwutka вне форума  
 
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Решено] Так, рассказик :)) Я долго ржал :)) DK Отвлекитесь, эмбеддеры! 7 31.08.2007 22:33
[Решено] легкие деньги Коллекция глюков 0 17.04.2006 13:43
Еще раз о подключении внешнего устройства через PC Владимир Микроконтроллеры, АЦП, память и т.д 4 18.02.2005 13:16


Часовой пояс GMT +4, время: 16:36.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.