0 / 0 / 0
Регистрация: 01.08.2012
Сообщений: 4
1

И снова LCD MT-16S2H

14.04.2017, 12:33. Показов 4209. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Прошу помощи. Собрал часы по схеме http://rodyokot.ru/circuit/digital/home/54/
ЖКИ МТ-16S2H-2YLG (http://www.melt.com.ru/docs/MT-16S2H.pdf) подключил к ATtiny2313A на PORTD по четырех битной шине.
Залил прошивку от автора, по непонятной причине пару раз промелькнул календарь после чего дисплей ничего не отображал.
Решил поправить код. Взял datasheet на МТ-16S2h и начал проверять команды и задержки при инициализации. AVR Studyo показывает в регистрах те команды которые в datasheet задержки в два раза больше, но это потому-что частота в два раза меньше (4 МГц в симуляторе). В Proteuse при 8 МГц все работает.
Прошиваю МК, дисплей на половину пустой на половину залит квадратами. При нажатии кнопок, квадратики начинают шевелиться, но часы не отображаются и температура тоже не отображается.
Пробовал увеличить задержку перед инициализацией, делал двойную инициализацию. Пробовал увеличить паузу между командами, пробовал дважды подавать команду (старшая, младшая тетрады для 4х битного режима), но дисплей не показывает часы. Что может быть не так. Почему в PROTEUSE работает а на плате нет. Fuse установил от внутреннего генератора на 8 Мгц.
Спасибо за внимание.

[5.41 Кб]
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.04.2017, 12:33
Ответы с готовыми решениями:

Снова хром, снова сапопроизвольно открывается, снова bkrfdf.xyz и казино
Здравствуйте! Собственно, проблема уже не новая, хотя, как показывают сообщения форума, за...

Данные АЦП в ATmega128 надо отобразить на MT-16S2H по 8-ми линиям. На Assembler
Имеются микроконтроллер ATmega128 и индикатор MT-16S2H. Надо данные с выхода АЦП микроконтроллера...

STM8L + Active halt + LCD IRQ = Зависание LCD-контроллера
Доброго всем времени суток. Поделитесь опытом, кто и как совмещает режим active halt и обновление...

STM32F4Discovery + LCD через fsmc для индентификации мк LCD
Нужна помощь, может кто поделиться готовым проектом,чтобы на STM32F4-Dyscovery используя...

Как сделать чтобы таймер дойдя до 0 стартовал снова и снова?
Здравствуйте :) Как сделать чтобы таймер дойдя до 0 стартовал снова и снова? TimerSec = 59;...

16
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
14.04.2017, 14:42 2
Автор с Радиокота использовал импортный индикатор, вы используете отечественный МЭЛТ. У них есть различия, может дело в них?
0
0 / 0 / 0
Регистрация: 01.08.2012
Сообщений: 4
14.04.2017, 15:01 3
В чем заключается отличие? Команды как в datasheet, время между командами как указано.
Может я что-то не понимаю?
F = 8 МГц
TCLK = 1/8000000 = 0.000000125 сек = 0.125 мксек
Время выполнения команды 0.125 * 1 = 0.125 микросекунды (команда nop выполняется за 1 такт).
Для строба E нужно выставить 1 на время не менее 230 нс для этого достаточно двух команд nop nop? Я правильно понимаю?
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
14.04.2017, 15:45 4
Внимательно прочитайте процедуры инициализации разных индикаторов. На этом форуме это уже затерто до дыр, не хотите искать, бог поможет...
У МЭЛТ есть своя рекомендованная процедура инициализации...
0
0 / 0 / 0
Регистрация: 01.08.2012
Сообщений: 4
14.04.2017, 17:16 5
Делаю как рекомендуют МЭЛТ только на asm. Почему дисплей не хочет показывать? В чем моя ошибка?
Код
INIT_LCD16S2D:  ;
ldi R16,0
out PortD,R16
rcall Delay40mks
ldi Temp1,14
ldi ZL,Low(LCD_INIT_DATA*2)
ldi ZH,High(LCD_INIT_DATA*2)

lpm
out PortD,r0;Temp    ;;;;;            LCD.RW=0; LCD.A0=0; LCD.D=0x03;   //Установка типа интерфейса (8 бит) (0x03 - старший полубайт команды 0x30)
odyw ZL,1
nop              ;;;;;            Delay(>40ns);      //Это время предустановки адреса (tAS)
sbi PortD,4              ;;;;;            LCD.E=1; Delay(>230ns);   //Время предустановки данных попало сюда (tDSW)
nop
nop
cbi PortD,4               ;;;;;            LCD.E=0; Delay(>40us);   //Пауза между командами
nop
sbi PortD,4
nop              ;;;;;             LCD.E=1; Delay(>230ns);   //Минимально допустимая длительность сигнала E=1
nop
cbi PortD,4               ;;;;;            LCD.E=0; Delay(>40us);   //Пауза между командами
nop
sbi PortD,4                ;;;;;          LCD.E=1; Delay(>230ns);
nop
nop
cbi PortD,4                 ;;;;;         LCD.E=0; Delay(>40us);   //Пауза между командами
nop
dec Temp1
lpm
out PortD,r0;Temp       ;;;;;      LCD.D=0x02;      //Установка типа интерфейса (4 бит) (0x02 - старший полубайт команды 0x20) (при этом биты RW и A0 измениться не должны!)
odyw ZL,1
nop
sbi PortD,4                   ;;;;;       LCD.E=1; Delay(>230ns);   //Время предустановки данных попало сюда (tDSW)
nop
nop
cbi PortD,4                   ;;;;;     LCD.E=0; Delay(>270ns);   //Минимально допустимый интервал между сигналами E=1
nop
nop
Init_next0:                            ;;;;;    //Здесь индикатор входит в рабочий режим с установленным типом интерфейса и можно подавать команды как обычно
lpm
out PortD,r0;Temp
odyw ZL,1
nop
sbi PortD,4
dec Temp1
brne Init_next0

rcall Delay1500mks
;   ldi Temp,0
;   out PortD,Temp

ret
LCD_INIT_DATA:
;      are3210    are3210
;8bit
.db 0b00000011,0b00000010 ;
;4bit
.db 0b00000010,0b00001000 ;

.db 0b00000000,0b00001000 ;

.db 0b00000000,0b00000110 ;

.db 0b00000000,0b00001100 ;

.db 0b00001000,0b00000000 ;

.db 0b00000000,0b00000001 ;
0
0 / 0 / 0
Регистрация: 14.10.2011
Сообщений: 806
14.04.2017, 18:03 6
Цитата Сообщение от dfm
Делаю как рекомендуют МЭЛТ только на asm. Почему дисплей не хочет показывать? В чем моя ошибка?
Где настройка PortD на выход?
0
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
14.04.2017, 18:03 7
После подачи питания нужно сделать задержку работы с дисплеем на 20 мс.
И кстати да, настройте порт D на выход. Регистр DDRD.
0
0 / 0 / 0
Регистрация: 01.08.2012
Сообщений: 4
14.04.2017, 18:09 8
Настройка DDRD и задержка делаются до входа в подпрограмму инициализации. Почему не работает не понимаю

Код
Riset:   ; начало рабочего кода
;=============================================================
ldi Temp,0b011110000   ; настройка портов
out DDRB,Temp
ldi Temp,0b11111111   ; настройка портов
out DDRd,Temp
ldi Temp,RamEnd      ; установка указателя стека
out SPL,Temp
..............

;==============================================================
;Работа с LCD

rcall Delay20ms      ; Пауза перед включением
rcall Init_LCD16s2d   ; Инициализация дисплея
rcall Write_CGROM      ; Создание собственного символа
Код
INIT_LCD16S2D:  ;
ldi R16,0
out PortD,R16
rcall Delay40mks
ldi Temp1,14
ldi ZL,Low(LCD_INIT_DATA*2)
ldi ZH,High(LCD_INIT_DATA*2)

lpm
out PortD,r0;Temp    ;;;;;            LCD.RW=0; LCD.A0=0; LCD.D=0x03;   //Установка типа интерфейса (8 бит) (0x03 - старший полубайт команды 0x30)
odyw ZL,1
nop              ;;;;;            Delay(>40ns);      //Это время предустановки адреса (tAS)
sbi PortD,4              ;;;;;            LCD.E=1; Delay(>230ns);   //Время предустановки данных попало сюда (tDSW)
nop
nop
cbi PortD,4               ;;;;;            LCD.E=0; Delay(>40us);   //Пауза между командами
nop
sbi PortD,4
nop              ;;;;;             LCD.E=1; Delay(>230ns);   //Минимально допустимая длительность сигнала E=1
nop
cbi PortD,4               ;;;;;            LCD.E=0; Delay(>40us);   //Пауза между командами
nop
sbi PortD,4                ;;;;;          LCD.E=1; Delay(>230ns);
nop
nop
cbi PortD,4                 ;;;;;         LCD.E=0; Delay(>40us);   //Пауза между командами
nop
dec Temp1
lpm
out PortD,r0;Temp       ;;;;;      LCD.D=0x02;      //Установка типа интерфейса (4 бит) (0x02 - старший полубайт команды 0x20) (при этом биты RW и A0 измениться не должны!)
odyw ZL,1
nop
sbi PortD,4                   ;;;;;       LCD.E=1; Delay(>230ns);   //Время предустановки данных попало сюда (tDSW)
nop
nop
cbi PortD,4                   ;;;;;     LCD.E=0; Delay(>270ns);   //Минимально допустимый интервал между сигналами E=1
nop
nop
Init_next0:                            ;;;;;    //Здесь индикатор входит в рабочий режим с установленным типом интерфейса и можно подавать команды как обычно
lpm
out PortD,r0;Temp
odyw ZL,1
nop
sbi PortD,4
dec Temp1
brne Init_next0

rcall Delay1500mks
;   ldi Temp,0
;   out PortD,Temp

ret
LCD_INIT_DATA:
;      are3210    are3210
;8bit
.db 0b00000011,0b00000010 ;
;4bit
.db 0b00000010,0b00001000 ;

.db 0b00000000,0b00001000 ;

.db 0b00000000,0b00000110 ;

.db 0b00000000,0b00001100 ;

.db 0b00001000,0b00000000 ;

.db 0b00000000,0b00000001 ;
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 25
14.04.2017, 19:10 9
У МЭЛТ-а знакогенератор отличается. Там две страницы.
0
0 / 0 / 0
Регистрация: 01.08.2012
Сообщений: 4
14.04.2017, 19:22 10
Цитата Сообщение от Momut78
У МЭЛТ-а знакогенератор отличается.
Что это значит?
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 25
14.04.2017, 19:37 11
Цитата Сообщение от dfm
Цитата Сообщение от Momut78
У МЭЛТ-а знакогенератор отличается.
Что это значит?

Это значит: Скачайте даташит на МЭЛТ-овский дисплей и на тот который использовали в "радиокоте" и сравните знакогенераторы.

Скорее всего они здорово отличаются.
0
0 / 0 / 0
Регистрация: 24.12.2011
Сообщений: 2,752
14.04.2017, 19:45 12
Сам не сталкивался, ругань в рунете на знакогенератор МЭЛТ:
Описываю задачу. Есть программа LCD Smartie - http://lcdsmortie.sourceforge.net/ (http://lcdsmortie.sourceforge.net/)
При работе с индикатором МЭЛТ не работает часть символов (custom characters, которые генерятся в ROM контроллера дисплея).
Контроллер - полный аналог HD44780/KS0066. Различается только кодовая страница (МЭЛТовцы туда понапихали всего только что можно).
Нужно сделать чтобы корректно отображались custom characters. Есть прототип на FTDI, так что можно походу проверять работоспособность.
Но похоже он у вас даже не инициализировался, рано думать о кодовых страницах.

Почитайте форум МЭЛТ, там похожие проблеммы...
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 25
14.04.2017, 20:12 13
Цитата Сообщение от omokost
Сам не сталкивался, ругань в рунете на знакогенератор МЭЛТ:
Но похоже он у вас даже не инициализировался, рано думать о кодовых страницах.
Ну почему-же? ТС пишет, что что-то там промелькнуло и пол экрана залилось квадратами. Нажатия на кнопки заставляли их меняться, значит дисплей инициализировался и реагирует.

МЭЛТ-овсткие дисплеи которые MT12S2 - вообще-то хорошие кондовые экраны без глюков, их делают для военки, поэтому они при - 40 работают и показывают в отличии от китайского говна. Американские аналоги их с MIL приёмкой стоят как чугунный мост.
Как-то я раз графический МЭЛТ мучал и материл, типа какого они интерфейс сделали такой кривой, не могли тупо слизать с EPSON-a...
А потом разобрался и понял что зря. Динная модель быстрее аналога в 4 (!) раза. Заливается пулей. Китайцы курят в сторонке...

Но и минусы есть. Как всегда в России - никакая поддержка. Сделают вещь и никакой документации толковой (лично исправлял кривые даташиты МЭЛТ-а) ни примеров толковых, ни видео, ничего короче... Не для начинающих их дисплеи. Для военных и пр.
0
0 / 0 / 0
Регистрация: 01.08.2012
Сообщений: 4
14.04.2017, 22:55 14
Всем спасибо. Буду курить (datasheet http://www.melt.com.ru/docs/MT-16S2H.pdf). Не понятно как инициализировать LCD, передавать данные в 4-х битном режиме. Что и как выводить в порт D?
0
0 / 0 / 0
Регистрация: 13.03.2017
Сообщений: 25
14.04.2017, 23:34 15
Цитата Сообщение от dfm
Всем спасибо. Буду курить (datasheet http://www.melt.com.ru/docs/MT-16S2H.pdf). Не понятно как инициализировать LCD, передавать данные в 4-х битном режиме. Что и как выводить в порт D?
Пишите адрес в личку - пришлю исходники конкретно под МЭЛТ MT-12S2H... Я на них даже не собаку, а слона съел... Даже для Вашего 2313 что-то есть по моему... Хотя что там можно запихать в 2К ума не приложу... :)
0
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
15.04.2017, 00:24 16
Код
;**************************************************
;*   ;;/Инициализация LCD для 4 битной шине;;*    *
;**************************************************
LCD_INIT:
ldi      temp,1<<PB0|1<<PB1|0<<PB2|1<<PB3|1<<PB4|1<<PB5|1<<PB6|1<<PB7
outr   DDRB,temp
ldi      temp,1<<LCD_RS|1<<LCD_RW
outr   LCD_PORT,temp
rcall   Woyt20ms         ; Ждать три раза по 20 ms
rcall   LCD_INIT_NoWoyt      ;= Запись в регистр режимов
;/ Эта команда обязательна и идёт всегда первой после Init
ldi      temp,$2A         ;+ Установка режима 4 битной шины данных
;+ и страницы (1) DDROM
rcall   LCD_WriteCtrl      ;+ LCD уже принимает данные по 4 битной шине
;+ поэтому передаём байт полубайтами
;/
;- Эти команды можно распологать в произвольном порядке
ldi      temp,$0C         ; Включаем LCD бвыбираем тип работы курсора (не мигает)
rcall   LCD_WriteCtrl
ldi      temp,$06         ; Сдвиг курсора при вводе символа в право
rcall   LCD_WriteCtrl      ; Сдвиг дисплея отключён
ldi      temp,$01         ; Очистка дисплея установка курсора
rcall   LCD_WriteCtrl      ; и установка курсора в самую левую позицию
;/ UP for test      ;;=rcall   TEST_LCD
ret
;|*************************************************
;+               ;;/Подпрограммы;;+              *
;|*************************************************

;*******************************************
;|Установка режимов работы LCD не ждет Busy
;| ИСПОЛЬЗУЕТСЯ ТОЛЬКО ПРИ ИНИЦИАЛИЗАЦИИ
;*******************************************
LCD_INIT_NoWoyt:
cbi      LCD_PORT,LCD_RS
cbi      LCD_PORT,LCD_RW
ldi      count,$03
ldi      temp,$30         ;+ Установка согласно DS 8-bit mode (3 раза)
Cycle_Three:
sbr      temp,1<<LCD_E
outr   LCD_PORT,temp
nop                     ;+ Ждём времечко для установки данных на шине
nop
nop
cbi      LCD_Port,LCD_E      ;+ Записываем данные в LCD
rcall   Woyt40us
inr      temp,LCD_Port
subi   count,1
brmi   END_INIT_NoWoyt
brne   Cycle_Three
omdi   temp,0x20
rjmp   Cycle_Three
END_INIT_NoWoyt:
ret
;***************************************
;-   Установка режимов работы    LCD
;***************************************
LCD_WriteCtrl:
push   temp1
cbi      LCD_PORT,LCD_RS
cbi      LCD_PORT,LCD_RW      ;= Устанавливаем режим -запись команд
mov      temp1,temp         ;= Запоминаем temp
cbr      temp,0x0F         ;| Маскируем младшие биты данных в temp
sbr      temp,1<<LCD_E      ;| $08 ;;*Устанавливем сигнал строба (Е) в one
outr   LCD_PORT,temp      ;/ Выводим первый полубайт в порт
;+ И готовим второй , чтобы не ставить "тупые" NOP для задержки
swap   temp1
cbr      temp1,0x0F
cbr      temp,0xF0
cbi      LCD_Port,LCD_E      ;" Записываем данные в LCD
or      temp,temp1
outr   LCD_PORT,temp      ;/ Выводим второй полубайт в порт
rcall   Woyt_BS
pop      temp1
ret
;***************************************
;-     Запись в LCD байта данных
;***************************************
LCD_WriteData:
push   temp1
sbi      LCD_PORT,LCD_RS      ;* Установка режима записи данных в DDROM
cbi      LCD_PORT,LCD_RW
mov      temp1,temp         ;= Запоминаем temp
cbr      temp,0x0F         ;| Маскируем младшие биты данных в temp
sbr      temp,1<<LCD_RS|1<<LCD_E   ;| $0A
outr   LCD_PORT,temp      ;/ Выводим первый полубайт в порт
;+ И готовим второй , чтобы не ставить "тупые" NOP для задержки
swap   temp1
cbr      temp1,0x0F
cbr      temp,0xF0
cbi      LCD_Port,LCD_E      ;" Записываем данные в LCD
or      temp,temp1
outr   LCD_PORT,temp      ;/ Выводим второй полубайт в порт
rcall   Woyt_BS
pop      temp1
ret
;***************************************
;-  Woyt BS   для ускорения вывода на LCD
;***************************************
Woyt_BS:   ;/ Установка режима   чтения BS
cbi      LCD_PORT,LCD_E      ;" Записываем данные в LCD
cbi      LCD_CtrlDDR,MsbOne
ldi      temp,1<<LCD_BUSY|1<<LCD_RW|0<<LCD_RS
outr   LCD_PORT,temp
nop                     ;/ Для частоты 18.432 Мгц нужно не менее
nop
nop                     ;/ (3-х) команд NOP !!
nop
sbi      LCD_PORT,LCD_E      ; Установить (Е )
nop
nop
BS_WAIT:
sbic   PINB,LCD_BUSY      ; Цикл проверки BS
rjmp   BS_WAIT
sbi      LCD_CtrlDDR,MsbOne   ;+ ПортB переключаем на выход
ret
;*******************************************
;|         ;;- Tест дисплея;;|
;*******************************************
/*
TEST_LCD:
ldi      temp,$30         ;+ Вывод на дисплей первых 80 символов страницы DDROM
mov      R0,temp
ldi      rab,80            ; начиная с адреса 30 (ноль)
WriteData:
rcall   LCD_WriteData
mov      temp,R0
yms      temp
mov      R0,temp
dec      rab
brne   WriteData
ldi      temp,$01         ; Очистка дисплея установка курсора
rcall   LCD_WriteCtrl      ; и установка курсора в самую левую позицию
ret */
0
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
16.04.2017, 11:56 17
У МЭЛТ отлично работает техподдержка на сайте. Задайте там вопрос и в течении дня получите развернутый ответ. Я так поборол свой 12864, когда разбирался с ним.
0
16.04.2017, 11:56
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2017, 11:56
Помогаю со студенческими работами здесь

HP 625 снова и снова перезагружается в безопасный не заходит
Ребята помогите , проблема вот какая врубаю я ноут он доходит до заставки майкрософта и снова...

Здравствуйте, снова проблема и снова к вам.
Имеется данный код: var iX, iY, fov: Integer; HD: HWND; sDC: hDC; begin HD :=...

Почему функция вызывается снова и снова?
При просмотре всех учетных записей ( последняя функция = prosmotr_ych_z()) она не останавливается,...

И снова .htaccess и снова переезд
Казалось бы, столько написано. Ноне нашел ответа. Перезд с мультиязычного сайта на самостоятельный...

Снова ТИС и снова делемма
Привет Ребята! Имею сканер-штрих-кода, который дал дамам на склад. Представьте себе такую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru