реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> lcd 4470 avr, инициализация дисплея mt-10S1
demsp
сообщение Jun 28 2018, 18:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 17-03-18
Пользователь №: 102 435



Можно ли инициализиовать дисплей 44780, подавая биты на входы дисплея
Код
#include <avr/io.h>
#define F_CPU 16000000UL //16MHz
#include <util/delay.h>

int main(void) {
DDRD = 0b11111100;
PORTD = 0b00000000;
_delay_ms(20);         //задержка 20ms
PORTD = 0b0011 0000;   //PD4=1; PD5=1;
PORTD = 0b0000 1000;   //E=1;
// тут нужна задержка?
PORTD = 0b0000 0000;   //E=0;
_delay_us(40);         //задержка 40us
PORTD = 0b0000 1000;   //E=1;
PORTD = 0b0000 0000;   //E=0;
_delay_us(40);         //задержка 40us
PORTD = 0b0000 1000;   //E=1;
PORTD = 0b0000 0000;   //E=0;
_delay_us(40);         //задержка 40us
PORTD = 0b0010 0000;   //PD5=1;
PORTD = 0b0000 1000;   //E=1;
PORTD = 0b0000 0000;   //E=0;
_delay_us(40);        
// ...
}


A=PD2 (RS)
E=PD3
DB4=PD4
DB5=PD5
DB6=PD6
DB7=PD7

Прикрепленное изображение


Сообщение отредактировал demsp - Jun 29 2018, 06:04
Go to the top of the page
 
+Quote Post
kovigor
сообщение Jun 28 2018, 21:50
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295



Цитата(demsp @ Jun 28 2018, 21:57) *
Можно ли инициализиовать дисплей 44780, подавая биты на входы дисплея

Запросто, лишь бы подавать их в соответствии с временной диаграммой, нарисованной в даташите. Только зачем ? В CodeVision этот дисплей, насколько я помню, поддерживается, все уже написано и отлажено ...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 29 2018, 00:26
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (demsp @ Jun 28 2018, 21:57) *
Можно ли инициализиовать дисплей 44780, подавая биты на входы дисплея
Можно. Задержка нужна, согласно документации не менее 450 нс.
QUOTE
CODE
PORTD = 0b0011 0000;   //PD4=1; PD5=1;
PORTD = 0b0000 1000;   //E=1;
Вот только тут второй строчкой вы сбросили PD4 и PD5, а они должны удерживаться пока E=1.

QUOTE (kovigor @ Jun 29 2018, 00:50) *
Только зачем ? В CodeVision этот дисплей,
Может затем, что автор использует gcc, а не компилятор "языка, похожего на Си"?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
demsp
сообщение Jun 29 2018, 12:29
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 17-03-18
Пользователь №: 102 435



Спасибо, но пока не работает ((
Кстати, по диаграмме из даташита необходимо подавать управляющие сигналы на DB4-DB7 "после положительного фронта" на входе Е (подаём 1 на Е, задержка, подаем 1 на DB4-DB7, подаём 0 на Е (запись по спаду), задержка, подаем 0 на DB4-DB7), т.е. должно быть так (в 4bit режиме)
Код
int main(void) {
DDRD = 0b11111100;
PORTD = 0b00000000;
_delay_ms(20);         //задержка 20ms после подачи питания
PORTD = 0b0000 1000;   //E=1;
_delay_us(40);         //задержка 40us
PORTD = 0b0011 1000;   //PD4=1; PD5=1; E=1;
_delay_us(40);         //задержка 40us
PORTD = 0b0011 0000;   //PD4=1; PD5=1; E=0; (запись по спаду)
_delay_us(40);         //задержка 40us
PORTD = 0b0000 0000;
...
}


Так правильно?

Сообщение отредактировал demsp - Jun 29 2018, 12:52
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 29 2018, 13:02
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (demsp @ Jun 29 2018, 15:29) *
Спасибо, но пока не работает ((
Такое бывает. Могу порекомендовать купить на али 8-канальный логический анализатор, он рублей 300 стоит сейчас. Очень помогает в подобных случаях - записал диаграмму и сиди себе, рассматривай, времянки измеряй или даже передаваемые данные рассматривай (софт имеет декодеры многих протоколов передачи). Конечно, пока он приедет, вы эту задачу десять раз решить успеете, но к следующей уже будете во всеоружии.

QUOTE (demsp @ Jun 29 2018, 15:29) *
Кстати, по диаграмме из даташита необходимо подавать управляющие сигналы на DB4-DB7 "после фронта" на Е (подаём 1 на Е, задержка, подаем 1 на DB4-DB7, подаём 0 на Е (запись по спаду), задержка, подаем 0 на DB4-DB7),
Да, вы правы, а я подзабыл уже. И ноль на DB4-DB7 можно не подавать, можно сразу же следующие данные выставлять.
QUOTE (demsp @ Jun 29 2018, 15:29) *
Так правильно?
Да, на первый взгляд выглядит правильно. Задержка после E=1 не нужна - по документации задержка от установки данных до E=0 не менее 195 нс, а это меньше времени записи в порт для AVR на макисальной часоте. Длительность E=1 не менее 450 нс тоже получается автоматически без дополнительных задержек (тут я какую-то ерунду написал, не читайте. Это для PIC16F84 на 4 МГц было справедливо). Задержку после E=1 и перед E=0 достаточно сделать по 1 мкс. А вот остальные задержки маловаты. Глянул в свои исходники - после включения питания 200 мс, после первой и второй записи DB6=1, DB7=1 по 50 мс, после третьей записи DB6=1, DB7=1 и после DB6=0, DB7=1 - по 100 мкс и дальше уже по 50 мкс для всех команд кроме очистки крана и возврата курсора (они по 1.6 мс).


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jul 6 2018, 19:46
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Про логический анализатор перенес сюда


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 13:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01582 секунд с 7
ELECTRONIX ©2004-2016