09.09.2016, 23:13
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
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.
|
|
|
|
09.09.2016, 23:19
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 18,908
Сказал спасибо: 2,543
Сказали Спасибо 11,819 раз(а) в 5,925 сообщении(ях)
|
Re: STM32F030F4 + HD44780 работает через раз
Кажись, недавно кто-то бился головой в стену с подобным вопросом и ему помогла задержка, больше чем по ДШ.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
10.09.2016, 11:34
|
|
Заблокирован
Регистрация: 22.04.2010
Сообщений: 348
Сказал спасибо: 41
Сказали Спасибо 106 раз(а) в 95 сообщении(ях)
|
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-х разрядного режима образом.
|
|
|
|
10.09.2016, 18:29
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
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);
}
|
|
|
|
|
10.09.2016, 18:44
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
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.
|
|
|
|
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 мс и спокойно передавать текст и команды.
Этот порядок опробован давным-давно и работает без нареканий во многих случаях.
|
|
|
Сказали "Спасибо" Неаполитанский Залив
|
|
|
10.09.2016, 19:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: STM32F030F4 + HD44780 работает через раз
Неаполитанский Залив, прописал ваш инит. Вроде лучше. Плата питается от ст-линка программатора. Может изза несогласованных уровней такие глюки? Бывает дисплей зависал. На вашем ините понаблюдаю. Бывало подключаю программатор(от него всё работает) а на ЖК ероглифы и фигня. С вашим инитом тоже 1 из 5 включений ероглифы. Думаю что надо уровни согласовывать?? Подключено к А0-А5. RW к минусу. Я его не использую...
|
|
|
|
10.09.2016, 19:27
|
|
Почётный гражданин KAZUS.RU
Регистрация: 13.03.2010
Сообщений: 2,897
Сказал спасибо: 498
Сказали Спасибо 3,061 раз(а) в 1,425 сообщении(ях)
|
Re: STM32F030F4 + HD44780 работает через раз
Сообщение от Неаполитанский Залив
|
На первом этапе инициализации дисплей работает в 4-битном режиме при любом раскладе. Инфа принимается только по D4 - D7, только по старшей половине порта.
Процедура инициализации для 4-битного режима: 0x3, 0x3, 0x3, 0x2, 0x2, 0xC, 0x0, 0xC, 0x0, 0x1. Данные передаются полубайтами, с интервалом 5 мс. После этого, выждав 5 мс после последней передачи (0х1), можно уменьшить интервал передачи полубайтов до 45-80 мс и спокойно передавать текст и команды.
Этот порядок опробован давным-давно и работает без нареканий во многих случаях.
|
Не нужно распространять свои заблуждения. Выше правильно написали, после включения дисплей в восьмибитном режиме, и пока не пройдет команда переключения в 4-битный, слать вторые полубайты не надо.
Так в даташите на контроллер расписано и даже разрисовано, а то, что кривые инициализации работают, и даже не просто изредка, а "во многих случаях" - ну спасибо инженерам хитачи)
Вот фрагмент даташита, место, с которого надо слать полубайты, пометил стрелкой, режим, в котором находится контроллер - подчеркнул.
|
|
|
Сказали "Спасибо" AR_Favorit
|
|
|
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
|
|
Почётный гражданин KAZUS.RU
Регистрация: 05.07.2009
Адрес: Запорожье
Сообщений: 1,531
Сказал спасибо: 309
Сказали Спасибо 53 раз(а) в 48 сообщении(ях)
|
Re: STM32F030F4 + HD44780 работает через раз
Новый инит тоже виснит ))) Попробую сделать инит из даташита ))
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:29.
|
|