Страница 1 из 1

Повторная инициализация HD44780/SED1278 и последующий сбой..

Добавлено: Вс окт 30, 2011 19:44:45
Spider
Всем привет.

Возможно ли определить проинициализорован ли дисплей или нет?
Просто такая ситуация, что если провести инициализацию в 4битный интерфейс повторно, то дисплей либо вообще отказывает, до сброса питания, либо начинает работать неадекватно.
Помогите :)

Re: Повторная инициализация HD44780/SED1278 и последующий сб

Добавлено: Вс окт 30, 2011 19:55:39
watchmaker
Тайминги при инициализации выдержаны точно? Команда выбора разрядности интерфейса подается трижды?

Re: Повторная инициализация HD44780/SED1278 и последующий сб

Добавлено: Вс окт 30, 2011 20:22:46
Spider
Трижды? А зачем трижды?
Я руководствуюсь вот этим: http://www.adafruit.com/datasheets/HD44780.pdf, стр. 46

Re: Повторная инициализация HD44780/SED1278 и последующий сб

Добавлено: Вс окт 30, 2011 20:39:05
watchmaker
Где-то мне попадалось, что эту команду надо подавать три раза с определенными интервалами. Завтра поищу.

Re: Повторная инициализация HD44780/SED1278 и последующий сб

Добавлено: Вс окт 30, 2011 22:16:02
watchmaker
Нашел на одном сайте
Инициализация должна быть строго в таком порядке
времена задержек могут быть больше, но не меньше
сбросить RS, EN

//далее взде RS=0

Вывод 30h
задержка 4.1мс !!!
Вывод 30h
задержка 100мкс !!!
Вывод 30h
задержка 100мкс !!!

Вывод 20h
задержка 100мкс !!!

//след. три действия обязательны именно в таком порядке
Вывод 28h //display-off
задержка 80мкс
Вывод 0Ch //diplay-on
задержка 80мкс
Вывод 01h //clear display
задержка 80мкс

//след. действия по желанию (установка рабочих параметров
Вывод 0Fh //diplay, cursor-on
задержка 80мкс
Вывод 06h //ch->cursor right
задержка 80мкс
Вывод 80h
задержка 80мкс

Re: Повторная инициализация HD44780/SED1278 и последующий сб

Добавлено: Пн окт 31, 2011 01:38:45
Murka
Вот на Winstar_e когда-то скачал ихний пример инициализации 4-бит интерфейса и то что из него написал для IAR. Там много лишнего, но вроде всё понятно, писалось под WinAvr_ом и было тупо скопировано в IAR.

Re: Повторная инициализация HD44780/SED1278 и последующий сб

Добавлено: Вт ноя 01, 2011 02:35:31
eufs
Для правильной организации передачи команд и данных на дисплей в 4-х битном режиме, необходимо контроллировать, принимает ли контроллер дисплея то, что ему посылается. Например, как у меня в инициализации 0802.
Сбой происходит из-за того, что дисплей не принял вторую половину команды, а его пытаются инициализировать. Соответственно все посланное позже не воспринимается им адекватно. После общего сброса или подачи питания все начинает работать правильно.
В моей процедуре проверяется, занят ли контроллер дисплея после передачи команды, если занят - все в порядке, если нет - выравниваем интерфейс половиной байта и пробуем снова.

Re: Повторная инициализация HD44780/SED1278 и последующий сб

Добавлено: Вт ноя 01, 2011 02:55:26
Murka
eufs Хоть коменты вставь, ведь не всем понятно будет.

Re: Повторная инициализация HD44780/SED1278 и последующий сб

Добавлено: Вт ноя 01, 2011 04:34:29
Spider
пасиб. Буду колупать :)

Re: Повторная инициализация HD44780/SED1278 и последующий сб

Добавлено: Вт ноя 01, 2011 22:07:00
eufs
Murka писал(а):eufs Хоть коменты вставь, ведь не всем понятно будет.
С коментами.

Код: Выделить всё

;ПП инициализации в дисплея 4х битном режиме
init_0802:
	rcall pause		;пауза после подачи питания 10 мс
	cbi _portb,en		;сбрасыв EN
	cbi _portb,rw		;сбрасыв RW
	cbi _portb,rs		;сбрасыв RS (команда)
	rcall p50us		;пауза 50us

	ldi r17,$02		;передаем тетраду 0010
	rcall d_out4

	ldi r17,$28		;передаем 0010 1000 в два этапа
	rcall d_out
	sbrs r0,_data7		;если бит 7 сброшен, то дисплей команды не принимает
	rjmp init_0802		;пробуем снова

	ldi r17,$28		;продолжаем инит, передаем 0010 1000
	rcall d_out

	ldi r17,$0c		;передвем 0000 1100
	rcall d_out

	ldi r17,$01		;передаем 0000 0001 (очстка дисплея)
	rcall d_out
	rcall pause		;пауза
	sbi _portb,rs		;устанавливаем RS (дальше будут данные)
	ret

;ПП вывода данных впо 4х битному интерфейсу
d_out:
	rcall p50us		;пауза 50мкс
				;начинаем передавать сначала старшую тетраду
	cbi _portb,_data7		;рассыпано побитно для универсальности при подключении
	sbrc r17,7
	sbi _portb,_data7

	cbi _portb,_data6
	sbrc r17,6
	sbi _portb,_data6

	cbi _portb,_data5
	sbrc r17,5
	sbi _portb,_data5

	cbi _portb,_data4
	sbrc r17,4
	sbi _portb,_data4

	sbi _portb,en		;подтверждаем передачу старших 4х бит
	rcall p50us
	cbi _portb,en

d_out4:

	rcall p50us
				;передаем младшие
	cbi _portb,_data7
	sbrc r17,3
	sbi _portb,_data7

	cbi _portb,_data6
	sbrc r17,2
	sbi _portb,_data6

	cbi _portb,_data5
	sbrc r17,1
	sbi _portb,_data5

	cbi _portb,_data4
	sbrc r17,0
	sbi _portb,_data4

	sbi _portb,en
	rcall p50us
	cbi _portb,en
				;передали
	sbic _portb,rs		;если это были данные, то ничего не проверяем
	rjmp d_out_ex

	sbi _portb,rw		;переводим интерфейс на чтение
	sbi _portb,_data7		;7 бит - это BUSY
	cbi _ddrb,_data7		;переводим на ввод
	sbi _portb,en
	nop			;небольшую паузу (4мкс)
	nop
	nop
	in r0,_pinb		;читаем состояние
	sbi _ddrb,_data7
	cbi _portb,en
	cbi _portb,rw

d_out_ex:
	rcall p50us
	ret

Re: Повторная инициализация HD44780/SED1278 и последующий сб

Добавлено: Вт ноя 08, 2011 14:01:22
kolobok0
Spider писал(а):пасиб. Буду колупать :)
как уже прозвучало - тайминги. ну и проверить всё ли при повторной инициализации находится в состоянии как после сброса?
т.е. нет выхода на разделяемую шину(если таковая присутствует) с LCD? нет ли текущего обращения к LCD и мы влезаем в середину этого общения? и т.п..

юзаю достаточно много по времени 4битную схему подключения. описанных проблем не выявленно.

(круглый)