Страница 1 из 2
hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Ср май 16, 2012 17:31:37
jordan
Просьба к админам, не перенаправляйте на тему
viewtopic.php?f=20&t=584&p=1272238&hilit=hd44780#p1272238 там черт ногу сломит, и я там такой проблемы не нашёл.
Программирую AVR не первый год, работал с кучей lcd... Взял wh1602b, перечитал всю документацию и примеры. С 8 битной шиной запустился с первого раза, вывел две строки поигрался все работает отлично!!! потом понадобились ножки хотел переподключить контроллер на 4 битную шину и начались чудеса, дисплей выводит символы но криво и где ему хочется!!!
Второй день схожу с ума, перепробовал кучу вариантов может последний и не самый удачный, пробовал менять задержки и что я только не пробовал все зря...
один и тот же код на 8 бит работает на 4 с поправками инициализации и подстановки не работает !!!
Помогите схожу с ума!!!
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Ср май 16, 2012 18:51:13
codenamehawk
Скачайте библиотеку с
http://jump.to/fleury для лцд и сравните со своей.
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Ср май 16, 2012 19:18:03
vovksextra
Были у самого такие проблемы с этим дисплеем.
Библиотека написана под Микропаскаль, но сложного ничего нету. Пробуй
Код: Выделить всё
//******************************************************************
//**** Functions for LCD WH1602 teste on WH1602A-NGG-CT (hd44780)
//******************************************************************
//Controller: AVR
//Compiler: mikroPascal PRO for AVR v.5.6.0
//Author: Vladimir Bejevetc (Ukraine)
// www.voov.com.ua
//ver: 1.0
//
//******************************************************************
unit lcd1602;
const
LCD_FIRST_ROW = 128;
LCD_SECOND_ROW = 192;
LCD_CLEAR = 1;
LCD_RETURN_HOME = 2;
LCD_CURSOR_OFF = 12;
LCD_UNDERLINE_ON = 14;
LCD_BLINK_CURSOR_ON = 15;
LCD_MOVE_CURSOR_LEFT = 16;
LCD_MOVE_CURSOR_RIGHT = 20;
LCD_TURN_ON = 12;
LCD_TURN_OFF = 8;
LCD_SHIFT_LEFT = 24;
LCD_SHIFT_RIGHT = 28;
procedure lcd_init;
procedure lcd_cmd(p: byte);
procedure lcd_dat(p: byte);
procedure lcd_goto_cursor(row, column: byte);
procedure lcd_out(x, y: byte; msg: ^byte; max_len: byte);
procedure lcd_out_current_pos(msg: ^byte; max_len: byte);
procedure lcd_out_const(x, y: byte; const msg: ^byte; max_len: byte);
procedure lcd_out_const_current_pos(const msg: ^byte; max_len: byte);
var
lcd_port: byte; sfr; external;
lcd_ddr: byte; sfr; external;
implementation
const
RS = 0;
EN = 1;
procedure lcd_init();
begin
lcd_ddr := 0xFF; // Порт на выход.
delay_ms(100);
lcd_cmd(0x02); // Шина 4 бит. .
delay_ms(10);
lcd_cmd(0x28); // Шина 4 бит, 2 строки, 5*8 пикселей.
delay_ms(10);
lcd_cmd(LCD_CURSOR_OFF); // Включить отображение, выключить курсор.
lcd_cmd(LCD_CLEAR); // Очистить дисплей.
end;
procedure lcd_cmd(p: byte);
begin
lcd_port := (p and 0xF0) or (1 shl EN);
delay_1ms();
lcd_port := lcd_port and not (1 shl EN);
delay_1ms();
lcd_port := ((p shl 4) and 0xF0) or (1 shl EN);
delay_1ms();
lcd_port := lcd_port and not (1 shl EN);
delay_1ms();
end;
procedure lcd_dat(p: byte);
begin
lcd_port := ((p and 0xF0) or (1 shl RS)) or (1 shl EN);
delay_1ms();
lcd_port := lcd_port and not (1 shl EN);
delay_1ms();
lcd_port := ((p shl 4) and 0xF0) or (1 shl RS) or (1 shl EN);
delay_1ms();
lcd_port := lcd_port and not (1 shl EN);
delay_1ms();
end;
procedure lcd_goto_cursor(x, y: byte);
begin
case y of
1: y := LCD_FIRST_ROW;
2: y := LCD_SECOND_ROW
else
y := LCD_FIRST_ROW;
end;
y := y + x - 1;
lcd_cmd(y);
end;
procedure lcd_out(x, y: byte; msg: ^byte; max_len: byte);
var
i: byte;
begin
lcd_goto_cursor(x, y);
i := 0;
while (msg^ <> 0) and (i < max_len) do
begin
lcd_dat(msg^);
inc(msg);
inc(i);
end;
end;
procedure lcd_out_current_pos(msg: ^byte; max_len: byte);
var
i: byte;
begin
i := 0;
while (msg^ <> 0) and (i < max_len) do
begin
lcd_dat(msg^);
inc(msg);
inc(i);
end;
end;
procedure lcd_out_const(x, y: byte; const msg: ^byte; max_len: byte);
var
i: byte;
begin
lcd_goto_cursor(x, y);
i := 0;
while (msg^ <> 0) and (i < max_len) do
begin
lcd_dat(msg^);
inc(msg);
inc(i);
end;
end;
procedure lcd_out_const_current_pos(const msg: ^byte; max_len: byte);
var
i: byte;
begin
i := 0;
while (msg^ <> 0) and (i < max_len) do
begin
lcd_dat(msg^);
inc(msg);
inc(i);
end;
end;
end.
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Ср май 16, 2012 22:36:50
jordan
спасибо !!!
Если кому то пригодится то ответ таиться в библиотеки вежливо предложной vovksextra
lcd_cmd(0x02); // Шина 4 бит. . --- вот так работает
а я пробовал посылать 0x2C и 0x28 для перевода на 4 битную шину - так советовали во многих примерах, но так не работает!!!
я так понял что после скармливания ему $2, или 0010 в бинаре, контроллер сразу переходит на 4 бит шину и последующие пол байта уже не принимаются должным образом а наоборот сбивают(сдвигает) все последующею команды и данные на эти пол байта, и получается что не получается

Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Чт май 17, 2012 04:45:03
Совесть
Плохо вы читали документацию, как и тот чьими исходниками вы пользуетесь.
Порядок инициализации приведен в DS на HD4480, например тут
http://www.adafruit.com/datasheets/HD44780.pdf стр. 46
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Чт май 17, 2012 09:24:50
vovksextra
Совесть писал(а):Плохо вы читали документацию, как и тот чьими исходниками вы пользуетесь.
Плохо делать глупые комментарии, на то то что работает в железе уже давно. И с чем были проблемы, которые устранены.
Речь шла о конкретном LCD и стандартная процедура инициализации на нем работать не хотела.
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Чт май 17, 2012 09:45:12
Shapa
vovksextra писал(а):Плохо делать глупые комментарии, на то то что работает в железе уже давно. И с чем были проблемы, которые устранены.
Вы очень зря придераетесь. Человек абсолютно верно подметил, что даташит вы не читали. Там черным по белому написано, что для верной инициализации 4-х битного режима необходимо трижды повторить одну и ту же последовательность. И только после этого уже контроллер экрана будет верно воспринимать посылаемые ему комманды
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Чт май 17, 2012 10:41:26
vovksextra
Всегда удивлялся такого рода постам. К вам человек обратился за помощью - так помогите ему. Читать даташит умеют все, а понять что как делать только некоторые. Как раз таки я его и читал и делал все как положено, но устройство отказывалось работать. Я привел рабочий и проверенный код, а Вы мне говорите что так работать не будет.....Пля....
Купите
здесь LCD и запустите его при помощи даташита, на который вы ссылаетесь - вот тогда все сами и поймете.
PS
В данном LCD контроллер используется S6B0066U
Полным аналогом данного контроллера являются следующие контроллеры:
*
HD44780 * KS0066
Аналог аналогом , а даташит у него свой:
http://www.picbasic.ru/_fr/3/S6B0066U.pdfИ строка инициализации (стр.27 )отличается от HD44780
По-этому и назвал комментарий глупым.
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Чт май 17, 2012 11:25:56
Shapa
vovksextra писал(а):Всегда удивлялся такого рода постам. К вам человек обратился за помощью - так помогите ему. Читать даташит умеют все, а понять что как делать только некоторые. Как раз таки я его и читал и делал все как положено, но устройство отказывалось работать. Я привел рабочий и проверенный код, а Вы мне говорите что так работать не будет.....Пля....
ВЫ верно говрите. Но упускаете один момент. Индикатор индикатору рознь. однажды я написал свою первую либу по работе с индикатором Wh1602D и был доволен как слон, решив, что теперь я всегда смогу использовать эти индикаторы аж бегом. Прошло немного времени, в очередном проекте нужно было подключить индикатор и оп ля - Не работает. Инициализация проходит через раз. Психовал я и ломал голову не один день в поисках проблемы. И только в конце концов разглядывая инициализацию, понял, что инциализировать его нужно не 1 раз...
Это я всё к тому, что отлично работающий код на 1 изделии, не гарантирует его 100% исправность на серии, а значит, что работало у одного - не факт, что так же хорошо сработает у другого.
Вы дали полезный совет человеку, я же хотел уточнить 1 момент, из-за которого, может вылезти баг. Мир?
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Чт май 17, 2012 11:31:55
vovksextra
Shapa писал(а):
Вы дали полезный совет человеку, я же хотел уточнить 1 момент, из-за которого, может вылезти баг. Мир?
Я за мир во всем мире).
PS.
Предыдущим постом выложил правильный даташит
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Чт май 17, 2012 12:24:04
jordan
Shapa писал(а):vovksextra писал(а):Плохо делать глупые комментарии, на то то что работает в железе уже давно. И с чем были проблемы, которые устранены.
Вы очень зря придераетесь. Человек абсолютно верно подметил, что даташит вы не читали. Там черным по белому написано, что для верной инициализации 4-х битного режима необходимо трижды повторить одну и ту же последовательность. И только после этого уже контроллер экрана будет верно воспринимать посылаемые ему комманды
во первых посмотрите код там трижды идет команда инициализации и выдержанными интервалами
во вторых vovksextra огромное спасибо за помощь, а все остальные кто решил блеснуть умом после того ка вопрос уже решился не вызывают много уважения так как для этого много ума не нужно, я читал всё в том числе и даташит, и в 8 битном режиме все заработало за 15 мин, вопрос был в 4 битном режиме, там скользко с тем что по началу шлешь контроллеру 4 бита а он принимает команду как по 8 битной шине пока не схавает каманду $C, а по этому нельзя слать команды 0xC_.......
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Ср авг 29, 2012 21:19:51
lazer
Доброго времени суток всем! Я тоже не сразу запустил 4-х битный режим, пришлось помучаться. Если кому ещё нужно - поделюсь своим вариантом.
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Чт авг 30, 2012 11:43:49
vovksextra
lazer писал(а):Доброго времени суток всем! Я тоже не сразу запустил 4-х битный режим, пришлось помучаться. Если кому ещё нужно - поделюсь своим вариантом.
Что значит нужно? Давайте и свой вариант )
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Вс сен 02, 2012 13:44:24
lazer
Выкладываю свой вариант общения контроллера с дисплеем по 4 линиям. Учился по книге Вольфганга Трамперта "AVR-RISC микроконтроллеры", откуда и взяты подпрограммы, которые переделал под 4-х битный режим. Сейчас вот работаю над валкодером...
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Вс сен 02, 2012 14:18:07
lazer
Еще хотелось бы добавить к вышесказанному: в приложенной программе сигналы управления индикатором и данные передаются через разные порты ATMEL. Так удобнее для написания программы, но не рационально в плане использования портов. Поэтому, потом я изменил программу и вывел все сигналы для индикатора через один порт. Надо сказать, пришлось попотеть!!! Все получилось, но скорость работы стала явно ниже, т.е. при тактовой частоте 1МГц индикатор ничего не показывал. И лишь при снижении ее до 400кГц все было нормально. Для сравнения: в 8-битном режиме все работало и при 8МГц.
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Чт окт 04, 2012 07:59:26
EmDmAl
Здравствуйте. Осваиваю WH1602B-YYH-CTK на HD44780, нашел на мой взгляд хороший драйвер, для работы с ним
http://we.easyelectronics.ru/AVR/hd44780-biblioteka-dlya-avr-gcc.html.
Но мне стало интересно, а можно сделать, чтобы одна строка прокручивалась, а на второй оставалось статичное сообщение. В инете погуглив почти не встретил чтобы кто-то задавался
этим вопросом, а строки если прокручиваются, то обе одновременно, если статичное сообщение, то на обе строки тоже. Если кто видел, или делал подобное - напишите.

Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Чт окт 04, 2012 09:16:02
vovksextra
EmDmAl писал(а):.....а можно сделать, чтобы одна строка прокручивалась, а на второй оставалось статичное сообщение. В инете погуглив почти не встретил чтобы кто-то задавался
этим вопросом, а строки если прокручиваются, то обе одновременно, если статичное сообщение, то на обе строки тоже. Если кто видел, или делал подобное - напишите.

......
Аппаратно это сделать нельзя. Программно - очень просто. Выводим верхнюю строчку, а нижнюю выводим в цикле.
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Чт окт 04, 2012 09:34:24
uk8amk
Ничего сложного. Т.к. контроллер дисплея не содержит таких встроенных функций, то нужно объявить текстовую строку/массив над которой мы будем издеваться. Данный массив должен с определенной переодичностью(например по таймеру) передаваться в дисплей чтобы обновить информацию. Примерно так:
char text[16*2]="наша строка";
lcd_puts(text);
while(1){
//здесь смещаете напр. первые 16 индексов
text[15]=text[0];
for(i=0; i<15; i++)
{
text[i]=text[i+1];
}
lcd_puts(text);//обновить картинку дисплея
delay_ms(1000);
}
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Пт окт 12, 2012 10:17:23
EmDmAl
С прокруткой разобрался, спасибо за помощь. А не поможите как вывести длинное сообщение в одной строке(скажем строку в 100 символов). Я накидал код в котором сначало разбиваю строки на двухмерный массив, в котором 1ый индекс - номер массива состоящего из 40 символов.Но в него заносятся непонятно почему пробелы и только где-то в конце первая буква Д
Код: Выделить всё
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <string.h>
#include "lcd-library.h"
int main(void)
{
lcdInit();//ОБЯЗАТЕЛЬНО
lcdClear();//ОБЯЗАТЕЛЬНО
unsigned char myString[] = "Длина этого сообщение 100 символов, для тестирования вывода большой строки более 40 символов!!!!!!!";
unsigned int myArray1[5][40];//Объявляю 2мерный массив из 5 массивов по 40 символов
unsigned char b = 0;
unsigned char i = 0;
lcdGotoXY(0, 0);//Переходим на начало верхней строки
for (unsigned char k = 0; k < 99; k++){
myArray1[b][i] = myString[k];//Заполняем массив значениями
i++;
if (i == 40){//Если конец массива, то переходим к следующему
i = 0;
b++;
}
}
lcdPuts(myArray1[0]);//Загружаем в lcd первый массив из 40ка символов
//Теперь в myArray1 двумерный массив, с разбитой строкой, по 40 символов
while(1)
{
lcdDisplayScroll(1, LCD_SCROLL_LEFT);//Прокручиваем на позицию влево
_delay_ms(600);
}
}
В итоге поидеи должно получится:
myArray1 = {"Длина этого сообщение 100 символов", "тестирования вывода большой строки более" , " 40 символов!!!!!!!"}
Или подскажите как можно подругому разбить массив на 40 символов каждый.
Re: hd44780(wh1602b) AVR Си, проблема схожу с ума
Добавлено: Пт окт 12, 2012 19:15:48
uk8amk
Может я чего не понял, но зачем строку разбивать на двухмерный массив?
myString[0] - начало первого сообщения
myString[0+40] - второе сообщение и т.д.
Обращайтесь сразу к исходной строке и ничего не мудрите.