Отговори на тема  [ 11 мнения ] 
LCD бъг 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Вто Сеп 20, 2005 8:34 am
Мнения: 17
Мнение LCD бъг
Здравейте ,
Имам LCD модул , който е свързан по следната схема http://atilabs.hit.bg/hardware/proj1.html#i2 .
Разликата е , че вместо LPT ползвам един от портовете на PIC16F871 и пренаписах примерния код на ASM
Печатам по LCD-то успешно само ме смущава , че при включване на LCD-то и изваден от цокъла PIC , то влиза в някакъв крив режим и 1-ви и 3-ти ред са черни . Имате ли идея защо се получава ?
И още един въпрос : Възможно ли е ако времената на изчакване между командите са ПО-ГОЛЕМИ (за по-малки е ясно) да възникнат някакви проблеми ?


Чет Окт 27, 2005 5:02 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пон Юли 04, 2005 11:51 pm
Мнения: 651
Местоположение: София
Мнение 
Относно въпроса ... "при изваден от цокала ПИК" тва едва ли може да го наречеш бъг на дисплея ... щото всичките му пинове си фърчат във въздоха и неможеш да контролираш как ше го интерпретира тва драивера .. ?!? Макар че не би трябвало да е така ... все пак мисля че има някви издърпващи резистори които да го пазят иммено от тва ...

За по-голямия delay при изпращане на командите не мисля че има някво ограничени (ама ти гледаи да не е пвече от 1.сек де ... щото знам ли ??? :wink: :lol: :D )

_________________
От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?


Чет Окт 27, 2005 5:22 pm
Профил ICQ WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Ное 21, 2004 11:31 pm
Мнения: 10088
Мнение 
ха! браво на ангелчо за много пълното описание, прилича на дипломна работа.

на въпроса ти: всички дисплей с контролер на хитачи при ресет тръгват като едноредови. ако си нагласил яркостта за 2 реда, когато не е инициализиран дисплея (в режим на един ред), целия ток отива само за половината пиксели и затова единия ред е много черен, а другия съвсем го няма.

четириредовия дисплей, които ползваш, в същност е двуредов, н с по-дълги редове (2х80), нато 3-ти ред е ред 1 след 40-тия знак.
затова 1-ви и 3-ти ред са тъмни в началото.

решението е:
- да не вадиш пика от цокъла :wink:
- да подпреш Vp на PWM на пика и да регулираш светенето софтуерно


Чет Окт 27, 2005 5:37 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пон Юли 04, 2005 11:51 pm
Мнения: 651
Местоположение: София
Мнение 
А така .... виж че всичко си има обяснение ... (за тва не бях се сетил ... ) :)

_________________
От наше село са види връо, ама от връо се невиди наше село ... що така и я незнам .. ?!?


Чет Окт 27, 2005 5:39 pm
Профил ICQ WWW
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Окт 28, 2005 3:24 pm
Мнения: 30
Мнение LCD
Буквено-цифровите дисплеи при липса на инициализация се засветяват наполовина. Ако е два реда - само горния, ако са 4 - редове 1-ви и 3-ти. Това е нормално. При инициалицация линиите да данни да са на ниво "0". Времената мажду командите нямат значение. При 8-битово управление, инициализация и посане по дисплая може да се прави и само с джъмпери и резистори по входовете, без контролер. Ако правиш 4-битово управлвние, при инициализацията неизползваните линии (D0-D3) да са към земя (0V).


Пет Окт 28, 2005 3:58 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение Re: LCD
Топ написа:
Времената мажду командите нямат значение.


Само малко да те корегирам...имат значение. Първо има значение с каква скорост тъпчеш данните, второ, има значение каква команда подаваш. За тази цел има поставен BF (busy flag), в повечето случай не се ползва (когато RW е на маса). За пример ще дам команда за затриване на LCD, която трябва да чакаш 2ms :wink:


Пет Окт 28, 2005 4:18 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Окт 28, 2005 3:24 pm
Мнения: 30
Мнение LCD
Е нали ставаше въпрос за големи времена, за малките е ясно. Аз лично управлявам тези LCD-та само по 6 пина, не чета никакъв флаг. Освн изтриването на екрана, другите команди са по 37us по документация, даже някои образци работят и на под 30us. Но по подразбиране залагам 40 и нямям никакви проблеми. Но за големи времена, няма проблеми, така преди години подкарах с джъмпери първия си дисплей.


Пет Окт 28, 2005 4:38 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Ное 09, 2005 5:08 pm
Мнения: 2
Мнение 
Видях, че коментирате проблеми по lcd-та и реших да се включа. От известно време се опитвам да подкарам едно 2x16 lcd в 4 битов режим като използвам собствени функции, но нещо не тръгва. Като го пусна вторият ред е черен и никакъв текст не излиза на дисплея. Всичкo ми изглежда както трябва. Аднал съм сорса, някой ако може да ми каже кое не в ред. Ползвам CodeVision, Db0-Db3 i RW съм ги дал към GND.


Прикачени файлове:
lcd.c [2.16 KiB]
243 пъти
Сря Ное 09, 2005 5:15 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Окт 28, 2005 3:24 pm
Мнения: 30
Мнение LCD 4-bit mode
Ето ти направо решение с 37 думи - инициализация, изпращане на команда и данни.
Това го писах тогава за АТ90S2313, на 4 MHz.
Работи и на всички АТмеги и цялата серия АТ90. Направо си виж само в инициализацията къде бъркаш.
Най-често бъркат като не пращат 3 пъти тройки в началото, или не дават време на модула да се инициализира.
Хайде и се похвали като го пуснеш, защото този код вече работи в N модула.
А ако изпълниш "Welmes" фуннкцията, на долния ред ще ми изпише името на кирилица.
Успех!


;*****************************************************************************
;* LCD Driving in 4-bit Mode *
;* *
;* This program is a Driver for Character LCDs - Industrial Standart *
;* *
;* Author: *
;* Datе : 10 / 2002 *
;*****************************************************************************
;==========================================================
;-----------------------------------------------------------------------------
; LCD DEFINITIONS
;-----------------------------------------------------------------------------
.def temp= R16 ; Global Variables
.def temp1= R17
.def fine= R2 ; Pause

.equ LCD_DATA= PORTB ; LCD Data Register
; D4-D7 = PB0-PB3 (pins 12-15)
.equ LCD_RS= 4 ; Lcd Register-Select Control = PB4 - pin 16
.equ LCD_E= 5 ; Lcd Enable Control = PB5 - pin 17

.def LCD_Byte= R23 ; Lcd Byte - Command Or Data
.def SByte= R25 ; Variable For 4-Bit interface

;=============================================================================
;------------------------ L C D H A N D L I N G --------------------------
;=============================================================================

LCDINIT: ; Initialize Lcd

ldi temp , 128 ; Start Up time > 20ms
rcall DELAY
ldi LCD_Byte , 0x33 ; Set up
rcall LCDCMD
ldi LCD_Byte , 0x32 ; 4-Bit interface
rcall LCDCMD
ldi LCD_Byte , 0x28 ; 2 Lines, 5x7 dots
rcall LCDCMD
ldi LCD_Byte , 0x08 ; Display Off
rcall LCDCMD
ldi LCD_Byte , 0x01 ; Clear Screen
rcall LCDCMD
ldi LCD_Byte , 0x06 ; Entry Mode Set
rcall LCDCMD
ldi LCD_Byte , 0x0F ; Display On
rcall LCDCMD

rjmp CustomLCD ; End Initialization

;----------------------------------------------------------------------------
LCDCMD: ; Send COMMAND To Lcd
;----------------------------------------------------------------------------
; Command Code must be in LCD_Byte
ldi temp1 , 0x20 ; RS => '0' + Enable => '1'
rjmp Char
;----------------------------------------------------------------------------
LCDCHAR: ; Disply CHARACTER On Lcd
;----------------------------------------------------------------------------
; Character Code must be in LCD_Byte
ldi temp1 , 0x30 ; RS => '1' + Enable => '1'
Char: mov SByte , LCD_Byte ; LCD_Byte => SByte
Swap SByte ; SByte = D3-D0/D7-D4
andi SByte , 0x0F ; SByte = 0000/D7-D4
or SByte , temp1 ; SByte = 0 0 1 RS/D7-D4
out LCD_DATA , SByte ; Apply Data On Lcd Pins

cbi LCD_DATA , LCD_E ; Enable => '0'

ldi temp , 32 ; DELAY > 6 ms
rcall DELAY ; Required only For Initialisation

mov SByte , LCD_Byte ; LCD_Byte => SByte
andi SByte , 0x0F ; SByte = 0000/D3-D0
or SByte , temp1 ; SByte = 0 0 1 RS/D3-D0
out LCD_DATA , SByte ; Apply Data On Lcd Pins

cbi LCD_DATA , LCD_E ; Enable => '0'

ldi temp , 26 ; DELAY > 5 ms
; Time To Accept Command/Data

DELAY: ; DALAY=771 x (temp) x Tosc
dec fine ; +1
brne DELAY ; +2
dec temp ; +1
brne DELAY ; +2
ret ; End

;=============================================================================
; End LCD Control Program - total 37 words
;=============================================================================

;=============================================================================
; CUSTOMIZE LCD
;=============================================================================
CustomLCD: ; Load 8 custom characters into Lcd
ldi LCD_Byte , 0x40 ; Set Cursor at the begining of CGRAM
rcall LCDCMD
ldi ZH , high(2*LCDTable) ; Set Pointer To Lcd Table
ldi ZL , Low(2*LCDTable)
Lp: lpm ; Load Byte from Program Memory into R0
mov LCD_Byte , r0
rcall LCDCHAR ; Display Character
adiw ZL , 1 ; Set the Pointer To the Next Character
cpi Zl , Low(2*LCDTable+64) ; Tablå loaded ?
brne Lp ; NO - Go On
ret ; End

LCDTable: ; CUSTOM CHARACTERS DESCRIPTION
.db 12, 18, 20, 30, 17, 17, 30, 0 ; â = Craracter Code '00'
.db 0, 0, 15, 21, 21, 21, 21, 0 ; ò = Craracter Code '01'
.db 14, 17, 1, 14, 1, 1, 30, 0 ; Ç = Craracter Code '02'
.db 0, 0, 14, 17, 17, 30, 1, 30 ; ä = Craracter Code '03'
.db 4, 10, 10, 10, 10, 10, 31, 17 ; Ä = Craracter Code '04'
.db 0, 0, 17, 17, 31, 17, 17, 0 ; í = Craracter Code '05'
.db 0, 0, 17, 17, 15, 1, 1, 0 ; ÷ = Craracter Code '06'
.db 0, 0, 17, 19, 21, 25, 17, 0 ; è = Craracter Code '07'

;LCDTable: ; CUSTOM CHARACTERS DESCRIPTION (Cyrillic letters)
;.db 31, 17, 16, 16, 16, 16, 16, 0 ; Ã = Craracter Code '00'
;.db 4, 10, 10, 10, 10, 10, 31, 17 ; Ä = Craracter Code '01'
;.db 17, 17, 19, 21, 25, 17, 17, 0 ; È = Craracter Code '02'
;.db 7, 9, 9, 9, 9, 9, 17, 0 ; Ë = Craracter Code '03'
;.db 31, 17, 17, 17, 17, 17, 17, 0 ; Ï = Craracter Code '04'
;.db 17, 17, 17, 15, 1, 1, 1, 0 ; × = Craracter Code '05'
;.db 24, 8, 8, 14, 9, 9, 14, 0 ; Ú = Craracter Code '06'
;.db 15, 17, 17, 15, 5, 9, 17, 0 ; ß = Craracter Code '07'
;=============================================================================
; E N D CUSOMIZING - Total 43 Words
;=============================================================================

;=============================================================================
LCDMSG: ; Dislay String On Lcd, the last Byte must be '08'
; Register Z points the String is FLASH memory
;=============================================================================
lpm ; Load Byte from Program Memory into R0
mov LCD_Byte , r0
cpi LCD_Byte , 8 ; End Message ? ("08" means End String)
breq Msgend ; YES => Exit

rcall LCDCHAR ; Display Character
adiw ZL , 1 ; Set the Pointer To the Next Character
rjmp LCDMSG ; Loop
Msgend:
ret ; End String
;=============================================================================
; END of showing a string on LCD - Total 8 Words
;=============================================================================

;=============================================================================
LCDBYTE: ; Display Byte on LCD in HEX Value (00-FF)
;=============================================================================
push LCD_Byte ; Store Byte in STACK
swap LCD_Byte ; LCD_Byte = 4321/7654
rcall DisNibble ; Display High Nibble
pop LCD_Byte ; Restore Byte from STACK
DisNibble:
andi LCD_Byte , 0x0F ; LCD_Byte = 0000/xxxx
ori LCD_Byte , 0x30 ; LCD_Byte = 0011/xxxx
cpi LCD_Byte , 0x3A ; Data > 9 (A..F) ?
brlo Lcdok
subi LCD_Byte , 0xF9 ; YES => Convert Value
Lcdok: rjmp LCDCHAR ; Display Character and Exit

;=============================================================================

;=============================================================================
; Display Welcome Message
;=============================================================================
Welmes:
ldi LCD_Byte , 0x80 ; Set Cursor Position = Line 1, Pos 1
rcall LCDCMD
ldi ZH , high(2*Mess01) ; Set Message Pointer To Mess01
ldi ZL , Low(2*Mess01)
rcall LCDMSG ; Display " LCD Demo Module "
ldi LCD_Byte , 0xC0 ; Set Cursor Position = Line 2, Pos 1
rcall LCDCMD
ldi ZH , high(2*Mess02) ; Set Message Pointer To Mess02
ldi ZL , Low(2*Mess02)
rcall LCDMSG ; Display
ret
;-----------------------------------------------------------------------------
; MESSAGES
;-----------------------------------------------------------------------------
Mess01:
.db " LCD Demo Module ", 8
Mess02:
.db "A",0,1,"op:",2,3,"pa",0,"ko ",4,"e",5,6,"e",0;
.db 8
;=============================================================================


Сря Ное 09, 2005 6:17 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Сря Ное 09, 2005 5:08 pm
Мнения: 2
Мнение 
Пиша собствени функции, защото ползвам различни портове за данни и RS и EN. Иначе не бих се занимавал, щеше направо да ползвам готовите библиотеки на CodeVision. Малко странно се получи, че не мога да сложа LCD-то на 1 порт. Освен това асемблера не ми е силната страна :oops: но благодаря все пак.


Сря Ное 09, 2005 7:26 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Пет Авг 19, 2005 11:38 am
Мнения: 978
Местоположение: Europe -> BG
Мнение 
Виж Function Set-а на твоете LCD и просто задай бита ,който указва 4/8бит интефейс за 4.

относно сменянето на портовете #define за какво е :)

#define RS PORTA,1

или

#define RS 0x05,1

и по нататък ползваш само RS :) а си го мениш в #define ,каквото ти трябва , на кой език програмираш?

_________________
един факт :-)
Съжалявам , че исках да помогна ...


Сря Ное 09, 2005 7:45 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 11 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 4 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни