Работа с ЖКИ на контроллере HD44780 и его аналогах
- WiseLord
- Друг Кота
- Сообщения: 4905
- Зарегистрирован: Чт апр 11, 2013 11:19:59
- Откуда: Минск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Попробовать бы увеличить задержки при работе с дисплеем. Маловероятно, но возможно, параметры дисплея "уплыли" и стали впритык к тому, что в коде. Как вариант, если нет доступа к коду или лень ковырять его - через FUSE-биты замедлить МК в целом и посмотреть на результат.
- trengtor
- Сверлит текстолит когтями
- Сообщения: 1299
- Зарегистрирован: Вт мар 31, 2015 22:56:07
- Откуда: Мы люди простые, живем в лесу, на пенек молимся
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Сначала надо цепи питания конденсаторами обвязать. А уже потом начинать о таймингах волноваться. У меня стандартные тайминги нормально работают даже с китайскими 1602 по 80 рублей.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
а ведь я пытался...[uquote="ARV",url="/forum/viewtopic.php?p=2982950#p2982950"]так и с ЖКИ. есть метод, который с любым дисплеем, в любых услвиях, гарантированно дает положительный результат - это работа с контролем занятости контроллера ЖКИ. т.е. разработав соответствующую "библиотеку" можно вообще не беспокоиться о том, какой дисплей какие задержки обеспечивает, достаточно удостовериться, что он придерживается принятого протокола обмена. и абсолютно не стоит переживать, 40 мкС у него цикл или 43 или 37 или 98 вдруг. понимаете? раз - и навсегда.WiseLord писал(а):Попробовать бы увеличить задержки при работе с дисплеем
если у вас в программе задержки (независимо от способа их формирования - циклы, таймеры или еще что), то при любых отступлениях от типа ЖКИ, для которого код проверен, вы обязаны удостовериться, что ваши задержки гарантированно более предельных для конкретного типа, без этого вы не можете быть уверены, что код сработает. и даже если вы закладываете 1 мс паузу там, где по даташиту ожидается 40 мкс, это ни от чего вас не спасает - все равно надо проверять даташит, иначе вы не разработчик, а шаляй-валяйщик.
и кому оно надо - лишние телодвижения? ради чего? ради утешения "я крут, потому что делаю не так, как проще"? можно делать по разному, но, имхо, лучше делать именно так, как я описал. не потому, что я описал, а потому что так правда лучше.[/uquote]
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- trengtor
- Сверлит текстолит когтями
- Сообщения: 1299
- Зарегистрирован: Вт мар 31, 2015 22:56:07
- Откуда: Мы люди простые, живем в лесу, на пенек молимся
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
[uquote="ARV",url="/forum/viewtopic.php?p=3126379#p3126379"]а ведь я пытался...[/uquote]
Как обрабатываешь ситуацию «дисплей завис»?
Как обрабатываешь ситуацию «дисплей завис»?
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
[uquote="trengtor",url="/forum/viewtopic.php?p=3126433#p3126433"]Как обрабатываешь ситуацию «дисплей завис»?[/uquote]
примерно так же, как "метеорит упал", т.е. никак. но если очень хочется - в чем проблема? ожидание с таймаутом: хотите парить мозг, так на здоровье.
примерно так же, как "метеорит упал", т.е. никак. но если очень хочется - в чем проблема? ожидание с таймаутом: хотите парить мозг, так на здоровье.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Всем доброго времени суток! Товарищи программисты, помогите пожалуйста. Суть проблемы такова. МК Atmega16A, индикатор 16х2 (HD44780) подключенный по 4-х битному интерфейсу. В программе пока ничего особенного. Пока просто организовано меню. Движение по меню кнопками +/-. В самом начале описана глобальная переменная menu, которая меняется в зависимости от нажатий кнопок. А в основном цикле в зависимости от содержимого этой переменной с помощью switch(menu) case: на дисплей выводятся нужные пункты меню. В программе сначала вызывается функция инициализации дисплея, затем вывод на него приветственного сообщения и задержка в 3 секунды. Затем очищаю дисплей послав ему код 0х01 и выжидаю 2 мс для выполнения команды(по даташиту надо 1640 мкс). Все, дисплей очищается и начинается основной цикл программы.
Здесь стоит
switch (menu)
{
case 10: ...............; break;
case 20: ...............; break;
case 30: ...............; break;
}
так же здесь находится функция опроса кнопок, но это не важно. проблема не в этом.
С помощью таймера, каждые 100мс я устанавливаю флажок в некой переменной. Как только этот флажок устанавливается, программа заходит в вышеописанный switch, для того чтобы обновить текст на дисплее и сбрасываю этот флаг. Таким образом обновление дисплея происходит каждые 100мс.
И самое важное. Перед каждым обновлением дисплея, я его очищаю командой 0х01 и ставлю задержку в 2мс для выполнения команды. Но при этом наблюдается мерцание дисплея. Движение по меню работает, все нормально, а дисплей мерцает.
Собственно вопрос: кто как и в какой момент времени очищает дисплей? Что я делаю не так? Может подскажете...
МК работает на частоте 4МГц. Пишу на Си в Atmel Studio 7.0
Здесь стоит
switch (menu)
{
case 10: ...............; break;
case 20: ...............; break;
case 30: ...............; break;
}
так же здесь находится функция опроса кнопок, но это не важно. проблема не в этом.
С помощью таймера, каждые 100мс я устанавливаю флажок в некой переменной. Как только этот флажок устанавливается, программа заходит в вышеописанный switch, для того чтобы обновить текст на дисплее и сбрасываю этот флаг. Таким образом обновление дисплея происходит каждые 100мс.
И самое важное. Перед каждым обновлением дисплея, я его очищаю командой 0х01 и ставлю задержку в 2мс для выполнения команды. Но при этом наблюдается мерцание дисплея. Движение по меню работает, все нормально, а дисплей мерцает.
Собственно вопрос: кто как и в какой момент времени очищает дисплей? Что я делаю не так? Может подскажете...
МК работает на частоте 4МГц. Пишу на Си в Atmel Studio 7.0
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
не надо очищать дисплей. строки меню надо либо выводить с очисткой "справа", либо сделать все по 16 символов, дополнив справа пробелами.
обновлять экран надо только в том случае, если состояние меню изменилось, т.е. было нажатие на кнопки. если состояние не менялось, обновлять не надо. т.е. обновление по таймеру не нужно.
обновлять экран надо только в том случае, если состояние меню изменилось, т.е. было нажатие на кнопки. если состояние не менялось, обновлять не надо. т.е. обновление по таймеру не нужно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Нужно ли очищать дисплей чтобы обновить индикацию? Полагаю, что нет. Сам никогда не использую команду 0x01, а сразу вывожу образ экрана.
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
обновлять экран надо только в том случае, если состояние меню изменилось, т.е. было нажатие на кнопки. если состояние не менялось, обновлять не надо. т.е. обновление по таймеру не нужно
Спасибо, буду пробовать так.
строки меню надо либо выводить с очисткой "справа"
Это как?
а сразу вывожу образ экрана
То есть это то что имел ввиду уважаемый ARV?
сделать все по 16 символов, дополнив справа пробелами
Извиняюсь если что за глупые вопросы, просто ни разу не имел дело с индикаторами, да и пишу недавно...
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
включите логику.
если на экране было МАМА (остальное - пустое место, т.е. пробелы), а вы вывели (без очистки) ПАПА - будет мерцание? нет, конечно! мерцание есть от того, что на долю секунды слово МАМА исчезло и экран опустел, и вы это видели, а потом на экране новое слово.
стоит убрать очистку - мерцание пропадет.
что же будет, если вместо ПАПА вы решите вывести НА? на экране будет НАМА, потому что НА затирает не все 4 позиции, а только две от старого слова. поэтому в этом случае следует вывести еще и 2 пробела после НА.
логично?
распространяя логику на все случаи жизни, приходим к тому, что я уже сказал: всегда выводить по 16 символов. если симвлоов в строке меньше 16, то дополнять строку пробелами. это можно сделать двумя способами: либо на самом деле все строки уровнять по длине при помощи пробелов, либо написать функцию, которая будет выводить символы строки, пока строка не кончится, а затем выводить пробелы, пока общее количество символов не достигнет 16. это я и назвал "вывод с очисткой справа".
если на экране было МАМА (остальное - пустое место, т.е. пробелы), а вы вывели (без очистки) ПАПА - будет мерцание? нет, конечно! мерцание есть от того, что на долю секунды слово МАМА исчезло и экран опустел, и вы это видели, а потом на экране новое слово.
стоит убрать очистку - мерцание пропадет.
что же будет, если вместо ПАПА вы решите вывести НА? на экране будет НАМА, потому что НА затирает не все 4 позиции, а только две от старого слова. поэтому в этом случае следует вывести еще и 2 пробела после НА.
логично?
распространяя логику на все случаи жизни, приходим к тому, что я уже сказал: всегда выводить по 16 символов. если симвлоов в строке меньше 16, то дополнять строку пробелами. это можно сделать двумя способами: либо на самом деле все строки уровнять по длине при помощи пробелов, либо написать функцию, которая будет выводить символы строки, пока строка не кончится, а затем выводить пробелы, пока общее количество символов не достигнет 16. это я и назвал "вывод с очисткой справа".
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
ARV, спасибо огромное за разъяснение. Буду пробовать 
Добавлено after 2 minutes 39 seconds:
И еще такой вопросик: хватит ли частоты работы 4МГц? Если учесть, что общение с индикатором происходит по 4-х проводной линии.
Добавлено after 2 minutes 39 seconds:
И еще такой вопросик: хватит ли частоты работы 4МГц? Если учесть, что общение с индикатором происходит по 4-х проводной линии.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
хватит или нет - это уж от ваших задач зависит
для меню - не то, что хватит, а еще и останется.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- trengtor
- Сверлит текстолит когтями
- Сообщения: 1299
- Зарегистрирован: Вт мар 31, 2015 22:56:07
- Откуда: Мы люди простые, живем в лесу, на пенек молимся
- Контактная информация:
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
[uquote="PSH",url="/forum/viewtopic.php?p=3139777#p3139777"]И еще такой вопросик: хватит ли частоты работы 4МГц? Если учесть, что общение с индикатором происходит по 4-х проводной линии.[/uquote]
Вопрос не совсем корректен: зависит от того, каким кодом заполняются эти временные слоты. Возьми китайский логический анализатор и посмотри, сколько времени на что уходит.
Вопрос не совсем корректен: зависит от того, каким кодом заполняются эти временные слоты. Возьми китайский логический анализатор и посмотри, сколько времени на что уходит.
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Ой спасибо всем участвующим. С вашей помощью понял я свои ошибки. Понял в каком направлении действовать нужно
Уже часть кода изменил. Вроде работает
Если что, еще напишу.
- Feklistov_as
- Открыл глаза
- Сообщения: 41
- Зарегистрирован: Сб фев 13, 2016 21:58:21
- Откуда: Волгоград
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Доброго времени суток! Тоже проблема с экраном Winstar WH2004A-YGH-CT. Если коротко - не работает команда занятия адреса(Set DDRAM Address).
Пару лет назад начинал делать устройство с этим дисплейчиком и забросил, вроде все работало.
Сейчас же делаю новое устройство на новом кристале. Теперь экран просто по порядку(точнее через строчку) заполняется нужным текстом, работают команды включения отключения курсора и подобные, но при попытке занятия адреса - выводит левый символ и пишет дальше со старого места.
Пробовал играться с задержками(до 100-ен миллисекунд) - толку ноль.
При этом при симуляции в Proteus все работает (и работало до всяких манипуляций) корректно.
Прозвонил все цепи - от МК до LCD. На всякий случай подтянул выход R/W.
В режиме отладки через MPlab замерял уровень напряжение на выводе RS - все правильно.(правда в этом режиме даже символ не напечатался)
Контроллер pic16f1937, 32МГц.
Убил пол ночи. виню дисплей(хотя в глубине души понимаю - проблема во мне
)

Менял порядок выставления данных в порт и изменения битов RS и R/W. Чередовал эти операции значительными задержками.
Может кто сталкивался с подобными проблемами? Может я не в ту сторону копаю?(
P.S. добавлено 6 часов спустя.
ошибка программная, так что вопрос снимаю. сейчас буду искать, где накосячил, так как при использовании следующей конструкции, все работает
Пару лет назад начинал делать устройство с этим дисплейчиком и забросил, вроде все работало.
Сейчас же делаю новое устройство на новом кристале. Теперь экран просто по порядку(точнее через строчку) заполняется нужным текстом, работают команды включения отключения курсора и подобные, но при попытке занятия адреса - выводит левый символ и пишет дальше со старого места.
Пробовал играться с задержками(до 100-ен миллисекунд) - толку ноль.При этом при симуляции в Proteus все работает (и работало до всяких манипуляций) корректно.
Прозвонил все цепи - от МК до LCD. На всякий случай подтянул выход R/W.
В режиме отладки через MPlab замерял уровень напряжение на выводе RS - все правильно.(правда в этом режиме даже символ не напечатался)
Контроллер pic16f1937, 32МГц.
Убил пол ночи. виню дисплей(хотя в глубине души понимаю - проблема во мне
Спойлер
Код: Выделить всё
#define RS PORTD,0
#define RW PORTD,1
#define E PORTD,2
#define LCD_DB PORTC
;========================
; Инициализация дисплея
;========================
INIT_LCD
bcf RS
bcf RW
bcf E
movlw .20
call pause_T ; задержка не менее 15мс
bsf E
movlw b'00110000' ;Команда "Function set"
movwf LCD_DB
call strobe
bcf E
movlw .5
call pause_T ; задержка не менее 4,1 мс
bsf E
movlw b'00110000' ;снова команда "Function set"
movwf LCD_DB
call strobe
bcf E
movlw .200
call pause_T ; задержка не менее 100 мкс
bsf E
movlw b'00111100' ;И снова команда "Function set"
movwf LCD_DB ;но уже с настройками: 8 бит, 2-line, 5x11dots
call strobe
bcf E
movlw .1
call pause_T ; задержка не менее 39 мкс
bsf E
movlw b'00001110' ;Команда "Display On/OF"
movwf LCD_DB ;включаем дисплей, курсор и отелючаем подсветку курсора
call strobe
bcf E
movlw .1
call pause_T ; задержка не менее 39 мкс
bsf E
movlw b'00000001' ;Команда "Display Clear"
movwf LCD_DB ;очистка дисплея
call strobe
bcf E
movlw .2
call pause_T ; задержка не менее 1,53 мс
bsf E
movlw b'00000110' ;Команда "Entery Mode Set"
movwf LCD_DB ;автоматический сдвиг курсора(вкл) и сдвиг всего дисплея(откл)
call strobe
bcf E
movlw .1
call pause_T ; задержка не менее 39 мкс
call zalivka
movlw 40h ;занимаем 40 адрес
call SET_ADRES
call zalivka2
return
;*****************************
; Конец инициализации дисплея
;*****************************
strobe
nop
nop
nop
nop
nop
nop
nop
nop
return
pause_T
movwf T3
P1 movlw .40
movwf T2
P2 movlw .66
movwf T1
P3 decfsz T1,f
goto P3
decfsz T2,f
goto P2
decfsz T3,f
goto P1
return
;==================
SET_ADRES
movwf LCD_DB
bsf LCD_DB,7 ;Команда "Set DDRAM Adress"
bcf RS
bcf RW
call strobe
bsf E
call strobe
bcf E
movlw .5
call pause_T ; задержка не менее 39 мкс
return
Менял порядок выставления данных в порт и изменения битов RS и R/W. Чередовал эти операции значительными задержками.
Может кто сталкивался с подобными проблемами? Может я не в ту сторону копаю?(
P.S. добавлено 6 часов спустя.
ошибка программная, так что вопрос снимаю. сейчас буду искать, где накосячил, так как при использовании следующей конструкции, все работает
Код: Выделить всё
bsf E
movlw b'11000000' ;Команда "Команда "Set DDRAM Adresst"
movwf LCD_DB ;с занятием места 40Н
call strobe
bcf E
movlw .1
call pause_T ; задержка не менее 39 мкс
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Парни, подскажите есть ли возможность инвертировать символ или надо создавать свой? Рою инет и чета тишина...
Processor not found! Software emulation ...
- Feklistov_as
- Открыл глаза
- Сообщения: 41
- Зарегистрирован: Сб фев 13, 2016 21:58:21
- Откуда: Волгоград
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Парни, подскажите есть ли возможность инвертировать символ или надо создавать свой? Рою инет и чета тишина...
Даташита достаточно. был бы это графический дисплей - без проблем. А в символьном - только свои создавать!
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Для HD44780[uquote="skeef",url="/forum/viewtopic.php?p=3207115#p3207115"]...надо создавать свой...[/uquote] или пользоваться командой B довольствуясь таким
Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
спасибо!
А вот еще вопрос на засыпку: возможно ли вывести несколько курсоров? Или подчеркнуть строку?
Ну или подскажите как выделить пункт меню, что он типа выбран. Моргалки (символ->пробел->символ ...) раздражают
А вот еще вопрос на засыпку: возможно ли вывести несколько курсоров? Или подчеркнуть строку?
Ну или подскажите как выделить пункт меню, что он типа выбран. Моргалки (символ->пробел->символ ...) раздражают
Processor not found! Software emulation ...
