Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.71/267: Рейтинг темы: голосов - 267, средняя оценка - 4.71
bosyt147
0 / 0 / 0
Регистрация: 23.10.2010
Сообщений: 5
1

Подключение LCD WH1602B-YYH-CTK к Atmega16

27.10.2010, 01:18. Просмотров 48377. Ответов 45
Метки нет (Все метки)

Здравствуйте. Никак не могу связать LCD c микроконтроллером. Перелопатил кучу форумов, разобрался в библиотеке Дихалта для LCD, в целях обучения написал свою программу на асме для работы с LCD, уже 3ий день ищу в ней ошибку и все безуспешно.

Вот код, может укажет кто в чем дело, почему не работает(поидее должна появиться еденица и курсор мигать):

Код
Код
.include "m16def.yms"
;= Start macro.yms ========================================
.equ DATA_PORT=PORTB
.equ DATA_PIN=PINB
.equ DATA_DDR=DDRB
.equ CMD_PORT=PORTB
.equ CMD_PIN=PINB
.equ CMD_DDR=DDRB
.equ E=0
.equ RW=1
.equ RS=2
.equ DELAY=25
;= End macro.yms  ========================================

; ROM =====================================================
.DSEG

; FLASH ===================================================
.CSEG
LDI R16,Low(ROMEND)
OUT SPL,R16
LDI R16,High(ROMEND)
OUT SPH,R16

RCALL LCD_init

loop: NOP
RJMP loop

LCD_delay:
LDI R16,DELAY
LCD_delay_loop:   DEC R16
BRNE LCD_delay_loop
RET

LCD_cmd_port_out:   IN R16,CMD_DDR
ORI R16,0b00001111
OUT CMD_DDR,R16
RET

LCD_data_port_out:   IN R16,DATA_DDR
ORI R16,0b11110000
OUT DATA_DDR,R16
RET

LCD_data_port_in:   IN      R16,DATA_DDR
ANDI   R16,0b00001111
OUT      DATA_DDR,R16
IN      R16,DATA_PORT
ORI      R16,0b11110000
OUT      DATA_PORT,R16
RET

LCD_write_cmd_init:   CLI   //Запись 4х битных команд из R17, вида 0bqqqq(для начальной инициализации)
RCALL LCD_delay
SBI CMD_PORT,E
IN R16,DATA_PORT
ANDI R16,0b00001111
SWAP R17
OR R16,R17
OUT DATA_PORT,R16
RCALL LCD_delay
CBI CMD_PORT,E
RCALL LCD_delay
SEI
RET

LCD_write_cmd:      CLI //Запись 8и битных команд из R17
RCALL LCD_busy_woyt
SBI CMD_PORT,E
IN R16,DATA_PORT
ANDI R16,0b00001111
PUSH R17
ANDI R17,0b11110000
OR R17,R16
OUT DATA_PORT,R17
RCALL LCD_delay
CBI CMD_PORT,E
RCALL LCD_delay
SBI CMD_PORT,E
IN R16,DATA_PORT
ANDI R16,0b00001111
POP R17
ANDI R17,0b00001111
SWAP R17
OR R17,R16
OUT DATA_PORT,R17
RCALL LCD_delay
CBI CMD_PORT,E
RCALL LCD_delay
SEI
RET

LCD_busy_woyt:   CLI
RCALL LCD_cmd_read_mode
LCD_busy_loop:   SBI   CMD_PORT,E
RCALL LCD_delay
CBI CMD_PORT,E
RCALL LCD_delay
IN R16,DATA_PIN
PUSH R16
SBI CMD_PORT,E
RCALL LCD_delay
CBI   CMD_PORT,E
RCALL LCD_delay
POP   R16
ANDI R16,0b10000000
BRNE LCD_busy_loop
LCD_busy_no:   SEI
RET

LCD_cmd_write_mode:   RCALL LCD_cmd_port_out
RCALL LCD_data_port_out
CBI CMD_PORT,RS
CBI CMD_PORT,RW
RET

LCD_data_write_mode:   RCALL LCD_cmd_port_out
RCALL LCD_data_port_out
SBI CMD_PORT,RS
CBI CMD_PORT,RW
RET

LCD_cmd_read_mode:   RCALL LCD_cmd_port_out
RCALL LCD_data_port_in
CBI CMD_PORT,RS
SBI CMD_PORT,RW
RET

LCD_data_read_mode:   RCALL LCD_cmd_port_out
RCALL LCD_data_port_in
SBI CMD_PORT,RS
SBI CMD_PORT,RW
RET

LCD_init:
RCALL LCD_cmd_write_mode
LDI R17,0b0011
RCALL LCD_write_cmd_init
LDI R17,0b0011
RCALL LCD_write_cmd_init
LDI R17,0b0011
RCALL LCD_write_cmd_init

LDI R17,0b00101000
RCALL LCD_write_cmd
LDI R17,0b00001110
RCALL LCD_write_cmd
LDI R17,0b00000110
RCALL LCD_write_cmd
LDI R17,0b00000001
RCALL LCD_write_cmd
LDI R17,0b00010100
RCALL LCD_write_cmd

RCALL LCD_data_write_mode
LDI R17,0b00110001
RCALL LCD_write_cmd

RET

; EEPOM ====================================================
.ESEG
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.10.2010, 01:18
Ответы с готовыми решениями:

LCD WH1602B
Здравствуйте! Помогите пожалуйста найти ошибку в коде. Только начал изучать программирование МК,...

Atmega16 + LCD
Здравствуйте! Хочу сделать термометр как тут...

ATMEGA16 и LCD на какие порты вешать?
Добрый день. Пытаюсь нарисовать Developer Board самопальную. (заводская выглядит так погуглите...

Работа с LCD дисплеем HD44780 из МК Atmega16 (GCC)
Здравствуйте, пытаюсь подключить LCD дисплей к микроконтроллеру, скачал библиотеку, но уже на...

Подключение BTM-222 к ATMEGA16
Хочу создать машинку на bluetooth управлении. Нашел статью...

45
motfriiusir
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 188
27.10.2010, 01:32 2
WH1602B-YYH-CTK имеет контролер KS0066, у него инициализация отличается от HD44780.
0
bosyt147
0 / 0 / 0
Регистрация: 23.10.2010
Сообщений: 5
27.10.2010, 01:36 3
Но библиотека Дихалта нормально там работает(тестирую на pinboard), а моя программа написана по аналогии, но где-то я ошибся, видимо и никак ошибку найти не могу(
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
27.10.2010, 01:40 4
Цитата Сообщение от motfriiusir
WH1602B-YYH-CTK имеет контролер KS0066, у него инициализация отличается от HD44780.
А вот и ошибаетесь, уважаемый. Проверено эксперементально, совместимы.
0
27.10.2010, 01:40
motfriiusir
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 188
27.10.2010, 01:43 5
Цитата Сообщение от Brykodyr
А вот и ошибаетесь, уважаемый. Проверено эксперементально, совместимы.
Ох, не всегда. Проверено эксперементально
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
27.10.2010, 02:04 6
Цитата Сообщение от motfriiusir
Ох, не всегда. Проверено эксперементально
И в чем же по вашему нестыковка?
ЗЫ. Загляните в даташиты и в разделе инициализации, что называется, найдите «5» отличий. KS0066 является полным (в логическом смысле) аналогом HD44780, отличается технологическими нюансами.
0
motfriiusir
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 188
27.10.2010, 02:21 7
Цитата Сообщение от Brykodyr
ЗЫ. Загляните в даташиты и в разделе инициализации, что называется, найдите «5» отличий. KS0066 является полным (в логическом смысле) аналогом HD44780, отличается технологическими нюансами.
Не понял) Вы хотите сказать, что алгоритм инициализации KS0066 и HD44870 абсолютно одинаков?
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
27.10.2010, 02:34 8
С точки зрения логики работы (список комманд) - одинаковые. Могут различаться величина паузы перед инициализацией (после подачи питания на контроллер LCD) и время исполнения инструкций.
0
motfriiusir
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 188
27.10.2010, 02:43 9
Колличество и значения байтов подаваемых при инициализации команд разное, разве нет?
0
zomzy
0 / 0 / 0
Регистрация: 06.02.2010
Сообщений: 97
27.10.2010, 02:52 10
Как обычно, начинать искать проблему надо с железа.
0
bosyt147
0 / 0 / 0
Регистрация: 23.10.2010
Сообщений: 5
27.10.2010, 02:55 11
Железо точно работает, так что загвоздка в программе
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
27.10.2010, 03:00 12
Цитата Сообщение от motfriiusir
Колличество и значения байтов подаваемых при инициализации команд разное, разве нет?
Это и есть логическая составляющая. У этих микрух они совпадают.
0
motfriiusir
0 / 0 / 0
Регистрация: 17.03.2010
Сообщений: 188
27.10.2010, 03:09 13
HD44780
0 0 1 1 * * * *
0 0 1 1 * * * *
0 0 1 1 * * * *
0 0 1 1 N F * *
0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 1I/DS

KS0066
0 0 1 1 N F X X
0 0 0 0 1 D C B
0 0 0 0 0 0 0 1
0 0 0 0 0 1I/DSH
0
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
27.10.2010, 03:22 14
Нафик эти готовые библиотеки. Берешь даташит, там все написано. Я долго боролся с индикатором, пытаясь его заставить жить с использованием библиотеки. Взял даташит, написал сам инициализацию, и все заработало. А библиотеки можно использовать если действительно сложные алгоритмы используются.
0
Brykodyr
0 / 0 / 0
Регистрация: 16.08.2010
Сообщений: 1,326
27.10.2010, 03:24 15
HD44780
0 0 1 1 * * * *
0 0 1 1 * * * *
0 0 1 1 * * * *
0 0 1 1 N F * *
0 0 0 0 0 0 0 1
0 0 0 0 0 1I/DS

KS0066
0 0 1 1 N F * *
0 0 0 0 1 D C B
0 0 0 0 0 0 0 1
0 0 0 0 0 1I/DS

Так точнее. Разница лишь в троекратной начальной установке 8-битного режима. Да, Хитачи рекомендует так делать, однако и KS0066 нормально проглатывает этот хитачевский финт.
0
boss
0 / 0 / 0
Регистрация: 02.03.2012
Сообщений: 3
27.10.2010, 06:48 16
Проблемы замечены только при инициализации режима.
Вот вариант для WH2004 (4х строчный), данные 4 бит.
Используется как раз библиотека Дихалта
Код
   .MACRO   INIT_LCD            ; Инициализация LCD
RCALL   InitHW               ; Настроить контрольный порт
RCALL   LCD_DELAY               ; Подождать

;4 бит, 2 строки
;при инициализации 4битного режима первый раз отправляется 1 тетрада
CBI      CMD_PORT,RS      ; Идет команда!
CBI      CMD_PORT,RW      ; Запись!
SBI      CMD_PORT,E      ; Поднять строб
RCALL      PortOut
in      R16, DATA_PIN   ;
cbr      R16, 0xF0      ; зачистили старшую тетраду порта
out      DATA_PORT, R16
sbi      DATA_PORT, LCD_F   ; сказали что отправляем данные по 4м битам
nop
CBI      CMD_PORT,E      ;
RCALL   LCD_DELAY

nop
SBI      CMD_PORT,E      ; Поднять строб
nop
CBI      CMD_PORT,E      ;
RCALL   LCD_DELAY

nop
SBI      CMD_PORT,E      ; Поднять строб
nop
CBI      CMD_PORT,E      ;

RCALL   LCD_DELAY

WR_CMD   0b10000000      ;2 Line ,5*8 Font
WR_CMD   0b10000000      ;2 Line ,5*8 Font
WR_CMD   0b10000000      ;2 Line ,5*8 Font

WR_CMD   (1<<LCD_F)|(0<<LCD_F_8B)|(1<<LCD_F_2L)|(0<<LCD_F_10D)
WR_CMD   (1<<LCD_ON)|(1<<LCD_OM_DISPLAY)|(0<<LCD_ON_CURSOR)|(0<<LCD_ON_BLINK)
WR_CMD   (1<<LCD_ENTRY_MODE)|(1<<LCD_ENTRY_INC)

.ENDM
после этого LCD стал подавать признаки жизни
0
Bomomd
0 / 0 / 0
Регистрация: 29.03.2010
Сообщений: 2,020
27.10.2010, 09:57 17
Я думаю есть смысл попробовать какой нибудь компиллятор тапа MicroPascal или Bassom чтобы проверить железо. Там ведь все просто делается и ошибиться в проге негде. Я именно так поступил когда воевал с дисплеем. Ну а потом, конечно, копать свой код.
0
kishom
0 / 0 / 0
Регистрация: 13.07.2010
Сообщений: 451
27.10.2010, 10:14 18
я новичок=)тут аппаратные прерывния не участвуют?просто я не вижу секции векторов.
0
Uttrym
0 / 0 / 0
Регистрация: 19.10.2010
Сообщений: 219
27.10.2010, 11:49 19
Цитата Сообщение от kishom
я новичок=)тут аппаратные прерывния не участвуют?просто я не вижу секции векторов.
При простой работе с дисплеем прерывания не нужны. Только если его вкорячивать в какой-нибудь навороченный проект, работающий под диспетчером или чем-то таким еще...

Топикстартеру:
проверь значение задержки LCD_Delay. Я тоже маялся с запуском своей старой библиотеки, потому как слетели все тайминги. Правда моя библиотека на сях и тайминги полетели из-за изменения алгоритма оптимизации с момента 2002 года до 2010, когда я добрался до своего железного чумодана и новый gcc воткнул... Но симптомы схожи.
0
dsodir
0 / 0 / 0
Регистрация: 28.09.2010
Сообщений: 4,284
27.10.2010, 13:37 20
Если прерывания не используются , то нахрена SEI в LCD_write_cmd_init, LCD_write_cmd, LCD_busy_woyt ????

Задержка слишком маленькая. Я делал задержку 100us при посылке команды. И 5ms (милли) между командами инициализации.
0
27.10.2010, 13:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2010, 13:37

Atmega16 (подключение хидеров к исходному коду)
не могу понять в чем проблема или что то не так делаю? нужно подключить заголовочный файл...

ATMega16 или ATMega8+подключение к USB+firmware+C#+C++
Собственно вот... Мучался несколько дней, так и не подключил свою ATMiko16 к компу. Не...

MCS-51(8051) и lcd 16x2 подключение
Добрый день. Имеется плата UNI-DS3 и установленный UNI-DS3 40 PIN 8051 CARD. Нужно выводить текст...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru