|
Проблемка с LSD Winstar WH1602 |
|
|
|
Dec 6 2007, 08:17
|
Группа: Новичок
Сообщений: 12
Регистрация: 30-11-07
Пользователь №: 32 840

|
Добрый день! Прошу помощи решения проблемки! Проблемка с LSD Winstar WH1602-YYK-CTK-русифицированный, контроллер HD44780, использую PIC16F84A для вывода на дисплай тестовой инфы, проблем заключается в том, что LSD отображает правильно только цифры и некоторые знаки, например провожу инициализацию LSD, далее пытаюсь вывести по очереди например A,B,C,D......O, а ЛСД-ка выдыет вертикальные черточки, изображения прикладываю. Может я чот не правильно делаю с инициализацией, хотя с цифрами все хорошо, вообщем жду вашего совета, человек я в этом деле новый как что сильно не пинайте! Еще для пущей понятности кусок програмки в ассемблере для оного пика: ;R/W - постоянно схемно соединен с "-" LsdVideoON: CALL TIMER5 ;Ожидаем 15мс пока установится питание LSD bcf PORTA,1 ;установка RS = 0 CALL TIMER5 ;Еще ждемс movlw 0x0D ;запись 0000 1101 в порт В(DB0-DB7) movwf PORTB ;D=1-вкл.изображение,B=1-мерцаюший курсор вкл. CALL TIMER5 ; bsf PORTA,3 ;установливаем Е=1 CALL TIMER5 ; bcf PORTA,3 ;установливаем Е=0 CALL TIMER5 ; movlw 0xFF ; установливаем DB0-DB7 высокий лог-кий movwf PORTB ; уровень (Hi) CALL TIMER5 ; LsdVideoConf: bcf PORTA,1 ;тоже самое только CALL TIMER5 ; movlw 0x3F ;запись 0011 1111 в порт В(DB0-DB7) movwf PORTB ;DL=1-вкл.8-ми разрядная шина данных,N=1-вкл.две строки, CALL TIMER5 ;F=1 - матрица 5*10 точек bsf PORTA,3 ; CALL TIMER5 ; bcf PORTA,3 ; CALL TIMER5 ; movlw 0xFF ; movwf PORTB ; CALL TIMER5 ;
LsdVideoData: bsf PORTA,1 ;запись в память данных CALL TIMER5 ;RS=1 movlw 0x41 ;запись буковки А в порт В(DB0-DB7) movwf PORTB ; CALL TIMER5 ; bsf PORTA,3 ;Е=1 CALL TIMER5 ; bcf PORTA,3 ;Е=0 CALL TIMER5 ; movlw 0xFF ;DB0-DB7 = Hi movwf PORTB ; CALL PAUSE ; LsdVideoData1: bsf PORTA,1 CALL TIMER5 movlw 0x42 ; "B" movwf PORTB CALL TIMER5 bsf PORTA,3 CALL TIMER5 bcf PORTA,3 CALL TIMER5 movlw 0xFF movwf PORTB CALL PAUSE LsdVideoData2: bsf PORTA,1 CALL TIMER5 movlw 0x43 ; "C" movwf PORTB CALL TIMER5 bsf PORTA,3 CALL TIMER5 bcf PORTA,3 CALL TIMER5 movlw 0xFF movwf PORTB CALL PAUSE LsdVideoData3: bsf PORTA,1 CALL TIMER5 movlw 0x44 ; "D" movwf PORTB CALL TIMER5 bsf PORTA,3 CALL TIMER5 bcf PORTA,3 CALL TIMER5 movlw 0xFF movwf PORTB CALL TIMER5 CALL PAUSE и так до "О"
Эскизы прикрепленных изображений
|
|
|
|
|
 |
Ответов
|
Dec 6 2007, 14:34
|
Группа: Новичок
Сообщений: 12
Регистрация: 30-11-07
Пользователь №: 32 840

|
Цитата(rezident @ Dec 6 2007, 13:13)  Раз вы человек новый, то следует для начала прочитать Правила форума. После этого воспользоваться поиском по форуму. И только, если не найдете ответа (хотя сложно не найти, 2-х строчные LCD обсуждаются примерно раз в неделю) на свой вопрос разместить свое сообщение в соответствующем разделе форума (AVR видимо?). По сути проблемы. С кодом я вашим не разбирался, но судя по всему, вы пытаетесь писать в область CGRAM, а не DDRAM. Уважаемый rezident, я правила прочитал и давайте сами не будем разводить ФЛУД и высказываться будем по существу! Цитата(rloc @ Dec 6 2007, 14:33)  Контроллер у них не совсем HD44780, а совместимый с оным, собственной разработки и очень часто с огромным количеством ошибок. Лет 5 назад "парился" c WH1602D-PML-CP, таких мучений никому больше не пожелаю, жутко глюкавый, совместим с HD44780 процентов на 80%. Если найду, выложу исходники написанные на С под MCS51. LSD - "правильно" Вы его назвали  ДА уж с "LSD" я загнул, хотя LCD его пока трудно назвать! Буду пробовать перебирать всю таблицу символов  . По результатам отпишусь  .
|
|
|
|
|
Dec 7 2007, 07:57
|
Группа: Новичок
Сообщений: 12
Регистрация: 30-11-07
Пользователь №: 32 840

|
И так что мне удалось узнать, прошерстил я всю таблицу символов, попробовал другой такой же LCD, результат одинаковый, pdf-чик с таблицой из даташита прилагаю, а вот что отображает дисплей: адреса: - с 00 до 0D отображаются ввиде вертикальных черточек (по две или три (реже) штуки в ячейке); - с 0Е до 0F - пустые; - с 10 до 1F - пустые; - 20 - пустая; - 21 - 2F - как положено; - 30 - 3F - как положено; - 40 - 4F - ввиде вертикальных черточек; - 50 - 5F - ввиде вертикальных черточек; - 61 - 6F = 21 - 2F; - 70 - пустая; - 71 - 7F = 21 - 2F; - 80 - пустая; - 81 - 90 - ввиде вертикальных черточек; - 91 - A0 - пустые; - A0 - AF - ввиде вертикальных черточек; - B1 - BF = 21 - 2F; - C0 - CF - как положено; - D0 - DF - как положено; - E0 - EF - как положено; - F0 - FF - как положено. Вывод у меня напрашивается один - брак производителя, криво прошита память; что скажите народ?
|
|
|
|
|
Dec 7 2007, 09:20
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(_Vadim_ @ Dec 7 2007, 09:57)  попробовал другой такой же LCD.... что скажите народ? Что с кривыми индикаторами сталкиваться не приходилось (а тем более с двумя!), а вот с кривыми программами - сколько угодно. rezident совершенно правильно вам заметил, что инициализация обсасывалась на этом форуме очень много раз. Вы можете до потери сознания обвинять собеседников во флуде, но он вам сделал два совершенно правильных замечания - 1) читать ваш код очень трудно - вы не потрудились его обрамить тегами code 2) ваша инициализация никуда не годится - ищите на форуме. Не годится по следующим причинам: 1) надо указывать одну строку а не две - примите это как аксиому 2) вы не даете команду установки адреса DDRAM. 3) вы не даете еще несколько необходимых команд Можете кивать на производителя сколько угодно, но пока не сделаете правильную инициализацию работать не будет. Примеров море что в гугле что на форуме. Творить еще одну копию нет никакого желания.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 12 2007, 12:00
|
Группа: Новичок
Сообщений: 12
Регистрация: 30-11-07
Пользователь №: 32 840

|
Цитата(Сергей Борщ @ Dec 7 2007, 13:20)  Что с кривыми индикаторами сталкиваться не приходилось (а тем более с двумя!), а вот с кривыми программами - сколько угодно. rezident совершенно правильно вам заметил, что инициализация обсасывалась на этом форуме очень много раз. Вы можете до потери сознания обвинять собеседников во флуде, но он вам сделал два совершенно правильных замечания - 1) читать ваш код очень трудно - вы не потрудились его обрамить тегами code 2) ваша инициализация никуда не годится - ищите на форуме. Не годится по следующим причинам: 1) надо указывать одну строку а не две - примите это как аксиому 2) вы не даете команду установки адреса DDRAM. 3) вы не даете еще несколько необходимых команд Можете кивать на производителя сколько угодно, но пока не сделаете правильную инициализацию работать не будет. Примеров море что в гугле что на форуме. Творить еще одну копию нет никакого желания. Сергей, собственно от перечтения даташитов, док и разных примеров, нечего существенно нового не узнал по инициализации, текст программы (кривой - правильно подмечено) поправил, но проблема остается таже, может поможете еще разок? кратко попробую описать инициализацию дисплея: 1. Установить RS, E, R/W - в Down (0) (R/W-сидит на нуле); 2. Выждать паузу не менее 15 мс; 3. Установить RS в Down (на всякий случай); 4. Вывести на шину данных 0х30= 00110000 (инициализация в 8-ми битном режиме); 5. Установить Е в UP(1); 6. Установить Е в Down (0); 7. Установить шину данных в уровень высокого импеданса 1; 8. выждать паузу не менее 5 мс; 9. повторить пункты 3-7; 10. пауза не менее 100мкс (у меня 1мс); 11. повторить пункты 3-7; 12. Установить RS в Down; 13. Вывести на шину данных 0x3C= 8 бит, 2 строки, матрица 5х10 14. повторить пункты 5-7; 15. Установить RS в Down; 16. Вывести на шину данных 0x06=курсор авомат-ки перемещ. слева-направо; 17. повторить пункты 5-7; 18. Установить RS в Down; 19. Вывести на шину данных 0x01=отчиска экрана; 20. повторить пункты 5-7; 21. Установить RS в Down; 22. Вывести на шину данных 0x80=установка адресса ДДРАМ; 23. повторить пункты 5-7; Файлик в асме прилагаю коментарии в нем имеются.
|
|
|
|
|
Dec 12 2007, 14:15
|
Группа: Новичок
Сообщений: 12
Регистрация: 30-11-07
Пользователь №: 32 840

|
Файлик почемуто не добавляется, тогда вот текст.
;************************************************************************** ; Используется микроконтроллер PIC16F84A. Частота кварца 4000кГц. ;******************************************************************************* ********* LIST p=16F84a ; Используется PIC16F84A. __CONFIG 03FF9H ; PWR вкл, WDT выключен, бит защиты не установлен. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ программа вывода информации на LCD + ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ STATUS EQU 0x03 PORTA EQU 0x05 PORTB EQU 0x06 TRISA EQU 0x05 TRISB EQU 0x06 INTCON EQU 0x0B SecH equ 0x0C SecL equ 0x0D SecM equ 0x0E TimerL equ 0x0F TimerH equ 0x10 F EQU 1 RP0 EQU 5 RS EQU 1 E EQU 3 ORG 0 GOTO START ORG 0x04 GOTO PAUSE ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ Подпрограмма задержки ~ 1 секунда + ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ PAUSE: movlw 0xFF movwf SecL movwf SecM movlw 0x05 movwf SecH PAUSE_1: decfsz SecL,F goto PAUSE_1
PAUSE_2: nop nop decfsz SecM,F goto PAUSE_1
PAUSE_3: decfsz SecH,F goto PAUSE_1 goto END_PAUSE
END_PAUSE: retfie
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ Подпрограммы задержки 1мс, 5мс, 20 мс + ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pause1ms: movlw 0x49 movwf TimerL movlw 0x02 movwf TimerH goto TIMER1 pause5ms: movlw 0x7B movwf TimerL movlw 0x07 movwf TimerH goto TIMER1
pause20ms: movlw 0xF7 movwf TimerL movlw 0x1A movwf TimerH TIMER1: decfsz TimerL,F goto TIMER1 TIMER2: decfsz TimerH,F goto TIMER1 goto END_PAUSE
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ Вывод данных на LCD + ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LCD_DATA_OUTPUT: movwf PORTB ;запись информации в порт ;CALL pause1ms ; Опционально bsf PORTA,E ;Е=1=Up ;CALL pause1ms ; Опционально bcf PORTA,E ;Е=1=Down CALL pause1ms ;пауза 1 мс movlw 0xFF ;записать в аккамулятор 1111 1111 movwf PORTB ;установить D0-D7 в Up CALL pause1ms ;пауза 1 мс
retfie ;возврат по стеку ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ Начало программы + ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ START: clrf INTCON BSF STATUS,RP0 clrw movwf TRISA movwf TRISB BCF STATUS,RP0 clrw movwf PORTA movwf PORTB
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ Выполняется инициализация LCD + ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Lsd_INIT: CALL pause20ms ;ждем 20 мс bcf PORTA,RS ; RS-Down CALL pause1ms ; инициализация 00110000 movlw 0x30 ;Dl=1-8-битная шина данных CALL LCD_DATA_OUTPUT ; вызов подпрограммы вывода CALL pause5ms ; инф-ции в порт данных CALL LCD_DATA_OUTPUT ; и так три раза, как в даташите CALL pause1ms ; CALL LCD_DATA_OUTPUT ;
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ Выполняется установка режима работы LCD + ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LsdVideoConf1: bcf PORTA,RS movlw 0x3C ; 8 бит, 2 строки, матрица 5х10 CALL LCD_DATA_OUTPUT
LsdVideoConf2: bcf PORTA,RS movlw 0x0E ;изображение вкл., курсор в виде подчерка вкл. CALL LCD_DATA_OUTPUT
LsdVideoConf3: bcf PORTA,RS movlw 0x06 ; курсор авомат-ки перемещ. слева-направо CALL LCD_DATA_OUTPUT
LsdVideoConf4: bcf PORTA,RS movlw 0x01 ; отчиска экрана CALL LCD_DATA_OUTPUT
LsdVideoConf5: bcf PORTA,RS movlw 0x80 ; установка адресса ДДРАМ CALL LCD_DATA_OUTPUT ; (нулевой адресс)
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ Выполняется вывод данных на LCD + ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ LsdVideoData: bsf PORTA,RS movlw 0x41 ; simbol "А" CALL LCD_DATA_OUTPUT CALL PAUSE LsdVideoData1: bsf PORTA,RS movlw 0x42 ; simbol "B" CALL LCD_DATA_OUTPUT CALL PAUSE LsdVideoData2: bsf PORTA,RS movlw 0x43 ; simbol "C" CALL LCD_DATA_OUTPUT CALL PAUSE LsdVideoData3: bsf PORTA,RS movlw 0x41 ; simbol "D" CALL LCD_DATA_OUTPUT CALL PAUSE goto LsdVideoData ; гоняем буквы по кругу
END
Сообщение отредактировал _Vadim_ - Dec 12 2007, 15:03
|
|
|
|
|
Dec 12 2007, 17:01
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(_Vadim_ @ Dec 12 2007, 17:15)  Файлик почемуто не добавляется, тогда вот текст. Код ... END По сути уважаемые уже все сказали. Небольшие дополнения, не относящееся к теме: 1) разница между return и retfie в PIC'ах, конечно, не слишком великая, но таки есть. 2) имхо, крайне негуманно по отношению к контроллеру организовать п/п обработки прерывания как задержку на 1 секунду.
|
|
|
|
|
Dec 13 2007, 07:09
|
Группа: Новичок
Сообщений: 12
Регистрация: 30-11-07
Пользователь №: 32 840

|
Спасибо всем! Действительно не продумал с W, это от неопытности, извените, поправлю и сообщю о результатах.
|
|
|
|
|
Dec 13 2007, 09:47
|
Группа: Новичок
Сообщений: 12
Регистрация: 30-11-07
Пользователь №: 32 840

|
Цитата(_Vadim_ @ Dec 13 2007, 11:09)  Спасибо всем! Действительно не продумал с W, это от неопытности, извените, поправлю и сообщю о результатах. Поправил свою ошибку в секции вывода данных на LCD и дальше по тексту программы подобавлял после записи в W, копирование W в CopyW где нужно. Код ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;+ Вывод данных на LCD + ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
LCD_DATA_OUTPUT: CALL pause1ms movf CopyW,W ;скопировать содержимое CopyW в W movwf PORTB ;запись информации в порт ;CALL pause1ms bsf PORTA,E ;Е=1=Up ;CALL pause1ms bcf PORTA,E ;Е=1=Down CALL pause1ms ;пауза 1 мс movlw 0xFF ;записать в 0аккамулятор 1111 1111 movwf PORTB ;установить D0-D7 в Up CALL pause1ms ;пауза 1 мс
retfie ;возврат по стеку результат тот же, что скажите вроде основные ляпы убрал, инициализация вроде идет как надо, теперь то по идее должно работать, но не работает, что делать? вот результаты вывода 2-го и 3-го столбцов таблицы символов:
и результаты вывода 4-го и 5-го столбцов таблицы символов:
да вот еще файлик в асме:
test.zip ( 1.82 килобайт )
Кол-во скачиваний: 171
|
|
|
|
|
Dec 13 2007, 13:05
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(_Vadim_ @ Dec 13 2007, 11:47)  результат тот же, что скажите вроде основные ляпы убрал, инициализация вроде идет как надо, теперь то по идее должно работать, но не работает, что делать? Уберите запись 0xFF в порт после вывода данных - оно не мешает, но лишнее. Вместо retfie используйте команду ret - retfie используется для возврата из прерывания. Проверьте, что у вас до индикатора доходят сигналы по старшим линиям шины данных - возможно они попутаны или просто не доходят и поэтому выводятся не те символы.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
_Vadim_ Проблемка с LSD Winstar WH1602 Dec 6 2007, 08:17    _Vadim_ Цитата(Сергей Борщ @ Dec 7 2007, 13:20) Ч... Dec 7 2007, 10:49      Сергей Борщ Цитата(_Vadim_ @ Dec 12 2007, 16:15) Файл... Dec 12 2007, 15:51          _Vadim_ Цитата(Сергей Борщ @ Dec 13 2007, 17:05) ... Dec 13 2007, 13:51           _Vadim_ Проверил.
В соединениях проблем нет, при записи в... Dec 13 2007, 15:03            Сергей Борщ Цитата(_Vadim_ @ Dec 13 2007, 17:03) Може... Dec 13 2007, 15:25             _Vadim_ Цитата(Сергей Борщ @ Dec 13 2007, 19:25) ... Dec 14 2007, 06:54     rezident Цитата(_Vadim_ @ Dec 12 2007, 17:00) Серг... Dec 12 2007, 14:58      _Vadim_ Цитата(rezident @ Dec 12 2007, 18:58) В в... Dec 12 2007, 15:07 rloc Цитата(_Vadim_ @ Dec 6 2007, 11:17) Пробл... Dec 6 2007, 10:33
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|