demsp 0 28 июня, 2018 Опубликовано 28 июня, 2018 (изменено) · Жалоба Можно ли инициализиовать дисплей 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 Изменено 29 июня, 2018 пользователем demsp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kovigor 6 28 июня, 2018 Опубликовано 28 июня, 2018 · Жалоба Можно ли инициализиовать дисплей 44780, подавая биты на входы дисплея Запросто, лишь бы подавать их в соответствии с временной диаграммой, нарисованной в даташите. Только зачем ? В CodeVision этот дисплей, насколько я помню, поддерживается, все уже написано и отлажено ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 29 июня, 2018 Опубликовано 29 июня, 2018 · Жалоба Можно ли инициализиовать дисплей 44780, подавая биты на входы дисплеяМожно. Задержка нужна, согласно документации не менее 450 нс. PORTD = 0b0011 0000; //PD4=1; PD5=1; PORTD = 0b0000 1000; //E=1; Вот только тут второй строчкой вы сбросили PD4 и PD5, а они должны удерживаться пока E=1. Только зачем ? В CodeVision этот дисплей,Может затем, что автор использует gcc, а не компилятор "языка, похожего на Си"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demsp 0 29 июня, 2018 Опубликовано 29 июня, 2018 (изменено) · Жалоба Спасибо, но пока не работает (( Кстати, по диаграмме из даташита необходимо подавать управляющие сигналы на 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; ... } Так правильно? Изменено 29 июня, 2018 пользователем demsp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 29 июня, 2018 Опубликовано 29 июня, 2018 · Жалоба Спасибо, но пока не работает ((Такое бывает. Могу порекомендовать купить на али 8-канальный логический анализатор, он рублей 300 стоит сейчас. Очень помогает в подобных случаях - записал диаграмму и сиди себе, рассматривай, времянки измеряй или даже передаваемые данные рассматривай (софт имеет декодеры многих протоколов передачи). Конечно, пока он приедет, вы эту задачу десять раз решить успеете, но к следующей уже будете во всеоружии. Кстати, по диаграмме из даташита необходимо подавать управляющие сигналы на DB4-DB7 "после фронта" на Е (подаём 1 на Е, задержка, подаем 1 на DB4-DB7, подаём 0 на Е (запись по спаду), задержка, подаем 0 на DB4-DB7),Да, вы правы, а я подзабыл уже. И ноль на DB4-DB7 можно не подавать, можно сразу же следующие данные выставлять. Так правильно?Да, на первый взгляд выглядит правильно. Задержка после 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 мс). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 141 6 июля, 2018 Опубликовано 6 июля, 2018 · Жалоба Про логический анализатор перенес сюда Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться