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

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

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

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

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

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


 
Опции темы
Непрочитано 09.09.2016, 23:13  
miwutka
Почётный гражданин KAZUS.RU
 
Регистрация: 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) == ) {DB7(1)} else {DB7(0)}
    if ( ((
data ›› 6)&0x01) == ) {DB6(1)} else {DB6(0)}
    if ( ((
data ›› 5)&0x01) == ) {DB5(1)} else {DB5(0)}
    if ( ((
data ›› 4)&0x01) == ) {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_Numcharstr)
{
    
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(0str);
      
sprintf(str2"Hz = %4i ",t);
                
LCD_Send_String4(1str2);
      
Delay_ms(300);
    } 
с чем бороться, что исправить?....
Реклама:

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

Кажись, недавно кто-то бился головой в стену с подобным вопросом и ему помогла задержка, больше чем по ДШ.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
akegor на форуме  
Непрочитано 10.09.2016, 11:34  
firew0rker
Заблокирован
 
Регистрация: 22.04.2010
Сообщений: 348
Сказал спасибо: 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.RU
 
Регистрация: 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.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 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.RU
 
Регистрация: 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.RU
 
Регистрация: 13.03.2010
Сообщений: 2,901
Сказал спасибо: 499
Сказали Спасибо 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.RU
 
Регистрация: 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 14:16


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


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot