0 / 0 / 0
Регистрация: 01.08.2012
Сообщений: 4
|
|
1 | |
И снова LCD MT-16S2H14.04.2017, 12:33. Показов 4209. Ответов 16
Метки нет (Все метки)
Добрый день. Прошу помощи. Собрал часы по схеме 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
|
14.04.2017, 12:33 | |
Ответы с готовыми решениями:
16
Снова хром, снова сапопроизвольно открывается, снова bkrfdf.xyz и казино Данные АЦП в ATmega128 надо отобразить на MT-16S2H по 8-ми линиям. На Assembler STM8L + Active halt + LCD IRQ = Зависание LCD-контроллера STM32F4Discovery + LCD через fsmc для индентификации мк LCD Как сделать чтобы таймер дойдя до 0 стартовал снова и снова? |
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
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
Это значит: Скачайте даташит на МЭЛТ-овский дисплей и на тот который использовали в "радиокоте" и сравните знакогенераторы. Скорее всего они здорово отличаются.
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
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 | |
16.04.2017, 11:56 | |
Помогаю со студенческими работами здесь
17
HP 625 снова и снова перезагружается в безопасный не заходит Здравствуйте, снова проблема и снова к вам. Почему функция вызывается снова и снова? И снова .htaccess и снова переезд Снова ТИС и снова делемма Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |