Při zapnutí LCD se zobrazují čverečky

Dotazy na technické problémy, vlastní řešení technických problémů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Guitarister
Příspěvky: 11
Registrován: 11 říj 2012, 00:00

Při zapnutí LCD se zobrazují čverečky

#1 Příspěvek od Guitarister »

Koupil jsem si tento LCD display LCD WINSTAR WH1602A-TTI-ET# http://www.gme.cz/alfanumericke-maticove-lcd-displeje-s-radicem-monochr/lcd-alfanumericky-displej-winstar-wh1602a-tti-et-p513-220/#popis a po nahrání programu do ATMEGA162 a připojení LCD dipsleje se mi na displeji zobrazí pouze čverečky. Prosím nevíte někdo, co s tím, vůbec si s tím nevím rady. Předem děkuji za odpověď.
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#2 Příspěvek od forbidden »

Nejspíš chyba v programu, takto se projevuje neinicializovaný LCD. Už to tu bylo několikrát.
Uživatelský avatar
Guitarister
Příspěvky: 11
Registrován: 11 říj 2012, 00:00

#3 Příspěvek od Guitarister »

Je tam totiž asi řadič ST7066 a můj program nejspíše komunikuje pouze s řadičem HD44780. Prosím nevíte co a jak změnit, aby LCD fungovalo??
Uživatelský avatar
Prochy
Příspěvky: 283
Registrován: 12 lis 2011, 00:00

#4 Příspěvek od Prochy »

Pochybuji, že ti někdo poradí, když tu nemáš uvedený program a schéma jak to máš zapojeno.
Uživatelský avatar
forbidden
Příspěvky: 9442
Registrován: 14 úno 2005, 00:00
Bydliště: Brno (JN89GF)
Kontaktovat uživatele:

#5 Příspěvek od forbidden »

Snad by to mělo být kompatibilní, ale osobně s tím zkušenosti nemám.
Uživatelský avatar
Guitarister
Příspěvky: 11
Registrován: 11 říj 2012, 00:00

#6 Příspěvek od Guitarister »

Schéma zapojení LCD je v přiloženém souboru, jinak program je zde :

;do deklarace vložit
;.EQU PLCD=PORTD
;***********************************************************************************************
;do inicializace nutno vložit
;INIT_LCD
;***********************************************************************************************
;do inc souborů nutno vložit
;.INCLUDE "LCD_M08.INC"
;************************************************************************************************
;příklady použití - viz popis maker
;************************************************************************************************

.INCLUDE "$WINAVR\INCFILES\INI.INC"
.INCLUDE "$WINAVR\INCFILES\MCS.INC"

;*******************************************************************************

M_EQU PLCD, PORTA

.SET BIT_BACKL = 6 ;bit na kterém je zapojeno podsvětlení

;***************************************************************************************************
;platí pro všechny jednořádkové a dvouřádkové displeje, pro čtyřřádkové displeje je nastavení a pro
;čtyřřádkový displej 4x20 znaků
;pro 4x16 znaků platí:
;.SET ADR_RAD1 = $0 ;počáteční adresy jednotlivých řádků viz datasheet lcd
;.SET ADR_RAD2 = $40
;.SET ADR_RAD3 = $10
;.SET ADR_RAD4 = $50
;***************************************************************************************************

.SET ADR_RAD1 = $0 ;počáteční adresy jednotlivých řádků viz datasheet lcd
.SET ADR_RAD2 = $40
.SET ADR_RAD3 = $14
.SET ADR_RAD4 = $54

;***************************************************************************************************

.DSEG

PODSV: .BYTE 1
KBL: .BYTE 1

.CSEG

;*******************************************************************************

.MACRO BCKL_ON

PUSH R16
LDI R16, 1
STS PODSV, R16
CBI PLCD, BIT_BACKL
POP R16

.ENDMACRO

;*******************************************************************************

.MACRO BCKL_OFF

PUSH R16
LDI R16, 0
STS PODSV, R16
SBI PLCD, BIT_BACKL
POP R16

.ENDMACRO

;*******************************************************************************
;*******************************************************************************

.MACRO KURZ_ON

PUSH16 R16
LDS R16, KBL
ORI R16, 0B00001110
ANDI R16, 0B00001111
STS KBL, R16
RCALL VYSINST
POP16 R16

.ENDMACRO

;*******************************************************************************

.MACRO KURZ_OFF

PUSH16 R16
LDS R16, KBL
ORI R16, 0B00001100
ANDI R16, 0B00001101
STS KBL, R16
RCALL VYSINST
POP16 R16

.ENDMACRO

;*******************************************************************************
;*******************************************************************************

.MACRO BLIK_ON

PUSH16 R16
LDS R16, KBL
ORI R16, 0B00001101
ANDI R16, 0B00001111
STS KBL, R16
RCALL VYSINST
POP16 R16

.ENDMACRO

;*******************************************************************************

.MACRO BLIK_OFF

PUSH16 R16
LDS R16, KBL
ORI R16, 0B00001100
ANDI R16, 0B00001110
STS KBL, R16
RCALL VYSINST
POP16 R16

.ENDMACRO

;*******************************************************************************

.MACRO VYTSPZN

PUSH24 R16
LDI R18, 0B01000000
LDI ZL, LO(2 * @0) ;do registru Z (16 bitový reg.) začátek tabulky
LDI ZH, HI(2 * @0)
ZAPIS: MOV R16, R18
CALL VYSINST
LPM R16, Z+
CALL VYSDATA
INC R18
CPI R18, 0B10000000
BRNE ZAPIS
POP24 R16

.ENDMACRO

;*******************************************************************************

.MACRO CLRLCD

CALL CLLCD

.ENDMACRO

;*******************************************************************************

.MACRO INIT_LCD

PUSH16 R16
LDI R16, $FF ;do registru R16 data 0Fh
OUT PLCD, R16
LDI R16, $FF ;do registru R16 data 255
OUT DDR(PLCD), R16 ;nastaví celý port D jako výstupní
CALL LCDINI
VYTSPZN TABZN
POP16 R16

.ENDMACRO

;*******************************************************************************

.MACRO LCD1

PUSH16 R16

.IF @10 > 1

LDI R16, @2
CALL @1

.ENDIF

LDI R16, @0
CALL VYSDATA
POP16 R16

.ENDMACRO

;*******************************************************************************

.MACRO LCD_TEX

PUSH16 R16
PUSH16 R30

.IF @10 > 1

LDI R16, @2
CALL @1

.ENDIF

LDI ZL, LO((PC + 12) * 2) ;adresa tabulky v macru
LDI ZH, HI((PC + 11) * 2)
LPM R16, Z+ ;čte data dokud nenarazí na 255
CPI R16, 255
BREQ PC + 4
CALL VYSDATA
RJMP PC - 5

LPM R16, Z+
LSR ZH
ROR ZL
IJMP

.DB @0, 255

POP16 R30
POP16 R16

.ENDMACRO

;*******************************************************************************

.MACRO LCD_PRP

.IF @10 > 1

PUSH16 R16
LDI R16, @2
CALL @1
POP16 R16

.ENDIF

PUSH16 R16

.IF ISREG(@0)

MOV R16, @0
CALL VYSDATA

.ELSE

LDS R16, @0
CALL VYSDATA

.ENDIF

POP16 R16

.ENDMACRO

;*******************************************************************************

.MACRO LCD_PAS

.IF @10 > 1

PUSH16 R16
LDI R16, @2
CALL @1
POP16 R16

.ENDIF

PUSH16 R16

.IF ISREG(@0)

MOV R16, @0
ORI R16, 0B00110000
CALL VYSDATA

.ELSE

LDS R16, @0
ORI R16, 0B00110000
CALL VYSDATA

.ENDIF

POP16 R16

.ENDMACRO

;*******************************************************************************

LCDINI: LDI R16, 0 ;na bit PLCD.7 log 0 - pripojeni napajeni radice
OUT PLCD, R16
DELMS 100
LDI R16, $02 ;nastaveni 4b. prenosu
CALL OUTLCD ;podpr. pro vysl. 4 bitu
DELMS 20
LDI R16, $02 ;nastaveni 4b. prenosu
CALL OUTLCD ;podpr. pro vysl. 4 bitu
DELMS 20
LDI R16, $02 ;nastaveni 4b. prenosu
CALL OUTLCD ;podpr. pro vysl. 4 bitu
DELMS 20
LDI R16, 0B00101000 ;nastaveni 4b. prenos, dvouradkovy disp.
CALL VYSINST ;fontu 5x7
LDI R16, 0B00001100
CALL VYSINST
LDI R16, 0B00000110 ;nastaveni automat. posunu kurzoru
CALL VYSINST
VYTSPZN TABZN
CLRLCD
RET

;*****

CLLCD: LDI R16, 1 ;vynuluje displej
CALL VYSINST
DELMS 5
RET

;*****

VYSINST: LDI R17, 0B00000000 ;nastaví bit5 do log0 - instrukce
RJMP VYSBYT

VYSDATA: LDI R17, 0B00100000 ;nastaví bit5 do log1 - data
VYSBYT: CPI08 PODSV, 0
BRNE SVITI
ORI R17, (1 << BIT_BACKL)
SVITI: PUSH R16 ;zálohuje data
SWAP R16 ;vymění horní a dolní 4 bity
ANDI R16, $0F ;horní čtyři bity do log0, dolní zachová
OR R16, R17 ;domaskuje bit5 - data/instrukce+podsvětlení
CALL OUTLCD ;podprogram vyslání (horní čtyři bity)
POP R16 ;obnoví data
ANDI R16, $0F ;horní čtyři bity do log0, dolní zachová
OR R16, R17 ;domaskuje bit5 - data/instrukce+podsvětlení
CALL OUTLCD ;podprogram vyslání (dolní čtyři bity)
RET

;***************************************************************************************

RAD1: LDI R17, ADR_RAD1 ;0 - počáteční adresa prvního řádku
ADD R16, R17 ;přičte k počáteční adrese požadovanou pozici
ORI R16, 0B10000000 ;bit7 určuje instrukci nastavení pozice
CALL VYSINST ;vyšle instrukci
RET

RAD2: LDI R17, ADR_RAD2
ADD R16, R17
ORI R16, 0B10000000
CALL VYSINST
RET

RAD3: LDI R17, ADR_RAD3
ADD R16, R17
ORI R16, 0B10000000
CALL VYSINST
RET

RAD4: LDI R17, ADR_RAD4
ADD R16, R17
ORI R16, 0B10000000
CALL VYSINST
RET

;**

OUTLCD: OUT PLCD, R16 ;R16 na portd
DELUS 10
SBI PLCD, 4 ;nástupná hrana
DELUS 50
CBI PLCD, 4 ;sestupná
DELUS 10
RET

TABZN:
;č 0

.DB 0B00001010, 0B00000100
.DB 0B00001110, 0B00010000
.DB 0B00010000, 0B00010001
.DB 0B00001110, 0B00000000

;í 1

.DB 0B00000010, 0B00000100
.DB 0B00001100, 0B00000100
.DB 0B00000100, 0B00000100
.DB 0B00001110, 0B00000000

;ý 2

.DB 0B00000010, 0B00000100
.DB 0B00010001, 0B00010001
.DB 0B00001111, 0B00000001
.DB 0B00001110, 0B00000000

;á 3

.DB 0B00000010, 0B00000100
.DB 0B00001110, 0B00000001
.DB 0B00001111, 0B00010001
.DB 0B00001111, 0B00000000

;ž 4

.DB 0B00001010, 0B00000100
.DB 0B00011111, 0B00000010
.DB 0B00000100, 0B00001000
.DB 0B00011111, 0B00000000

;ó 5

.DB 0B00000010, 0B00000100
.DB 0B00001110, 0B00010001
.DB 0B00010001, 0B00010001
.DB 0B00001110, 0B00000000

;6

.DB 0B00000000, 0B00000000
.DB 0B00000000, 0B00000000
.DB 0B00000000, 0B00000100
.DB 0B00001110, 0B00011111

;7

.DB 0B00000100, 0B00001110
.DB 0B00011111, 0B00000000
.DB 0B00000000, 0B00000000
.DB 0B00000000, 0B00000000
Přílohy
LCD_modul.pdf
(141.51 KiB) Staženo 115 x
Uživatelský avatar
Standa33
Příspěvky: 298
Registrován: 07 lis 2009, 00:00

#7 Příspěvek od Standa33 »

Zkus tenhle program(zkusil jsem to jen v simulaci), jestli bude fungovat to LCD. Řadič ST7066 je podle datasheetu kompatibilní s HD44780(jediný rozdíl je, že se dá nastavit režim 1řádek _ 5x11bodů)

Pokut ano, tak bude někde chyba v tvém programu. S asm jsem také začínal, ale programování v C mi přijde snadnější a při přenosu na jiný typ uProcesoru(PIC,ARM) stačí malé úpravy(osobní názor).


Chyba bude zde(při inicializaci musí být odeslána 3x hodnota 03h):

Kód: Vybrat vše

LCDINI: LDI R16, 0 ;na bit PLCD.7 log 0 - pripojeni napajeni radice 
 OUT PLCD, R16
 DELMS 100                                            ;(delay 15ms - 50ms)
 LDI R16, $02 ;nastaveni 4b. prenosu      (8bit přenos - $03)
 CALL OUTLCD 
 DELMS 20                                              ;delay 5ms
 LDI R16, $02 ;nastaveni 4b. prenosu      (8bit přenos - $03)
 CALL OUTLCD
 DELMS 20
 LDI R16, $02 ;nastaveni 4b. prenosu      (8bit přenos - $03)
 CALL OUTLCD
 DELMS 20

 LDI R16, 0B00101000 ;nastaveni 4b. prenos, dvouradkovy disp.

;nstavení 4bit přenos - $02(0b00000010)
 CALL OUTLCD ;podpr. pro vysl. 4 bitu
 DELMS 20

 LDI R16, 0B00001100
 CALL VYSINST
 LDI R16, 0B00000110 ;nastaveni automat. posunu kurzoru
 CALL VYSINST
 VYTSPZN TABZN
 CLRLCD
Přílohy
Test_LCD.zip
(37.46 KiB) Staženo 102 x
Uživatelský avatar
Guitarister
Příspěvky: 11
Registrován: 11 říj 2012, 00:00

#8 Příspěvek od Guitarister »

díky moc, zkusím to a dám vědět jak to dopadlo
Uživatelský avatar
pocitujlasku
Příspěvky: 2764
Registrován: 12 pro 2005, 00:00
Bydliště: SR, Poprad

#9 Příspěvek od pocitujlasku »

ako pisali viaceri, neinicializoval sa display. Mal som podobny problem, hned po pripojeni napajania som zacal komunikovat s displayom. A to sa mu nie vzdy pacilo. Na zaciatok programu som dal nejaky delay (v datasheete to bude spomenute) a potom uz fungoval v pohode.

Standa: mne zase viac vyhovuje asembler, vysledny program je ovela mensi a rychlejsi.
No vidis, a tak si sa bal
Uživatelský avatar
Guitarister
Příspěvky: 11
Registrován: 11 říj 2012, 00:00

#10 Příspěvek od Guitarister »

Kód: Vybrat vše

LCDINI:      LDI   R16, 0         ;na bit PLCD.7 log 0 - pripojeni napajeni radice
      OUT   PLCD, R16
      DELMS   30
      LDI   R16, $03      ;nastaveni 8b. prenosu
      CALL   OUTLCD         ;podpr. pro vysl. 8 bitu
      DELMS   5
      LDI   R16, $03      ;nastaveni 8b. prenosu
      CALL   OUTLCD         ;podpr. pro vysl. 8 bitu
      DELMS   5
      LDI   R16, $03      ;nastaveni 8b. prenosu
      CALL   OUTLCD         ;podpr. pro vysl. 8 bitu
      DELMS   5
      LDI   R16, 0B00101000      ;nastaveni 8b. prenos, dvouradkovy disp.
      CALL   VYSINST         ;fontu 5x7
      LDI   R16, 0B00001100
      CALL   VYSINST
      LDI   R16, 0B00000110      ;nastaveni automat. posunu kurzoru
      CALL   VYSINST
      VYTSPZN   TABZN
      CLRLCD
      RET

;*****


takže pochopil jsem to správně, má to být nějak takhle??
Uživatelský avatar
Standa33
Příspěvky: 298
Registrován: 07 lis 2009, 00:00

#11 Příspěvek od Standa33 »

Mělo by to být takhle:

Kód: Vybrat vše

LCDINI: LDI R16, 0 ;na bit PLCD.7 log 0 - pripojeni napajeni radice 
 OUT PLCD, R16
 DELMS 50                                            ;(delay 50ms)
 LDI R16, $03
 CALL OUTLCD 
 DELMS 5                                              ;delay 5ms
 LDI R16, $03
 CALL OUTLCD
 DELUS 100                                           ;delay 100us (>40us)
 LDI R16, $03
 CALL OUTLCD
 DELUS 100                                           ;delay 100us(>40us)
 LDI R16, $02                                        ;přepnutí do 4bit komunikace
 CALL OUTLCD                                       
 DELUS 100                                           ;delay 100us

 LDI R16, 0B00001100
 CALL VYSINST
 LDI R16, 0B00000110                   ;nastaveni automat. posunu kurzoru
 CALL VYSINST
 VYTSPZN TABZN
 CLRLCD
Uživatelský avatar
Honza_dy
Příspěvky: 2172
Registrován: 20 srp 2004, 00:00
Bydliště: Brno-venkov

#12 Příspěvek od Honza_dy »

Vše podstatné už bylo řečeno takže malý OT.
Na této stránce je simulátor LCD displeje s řadičem HD44780. Mě docela pomohl když jsem se seznamoval s principem komunikace.
Uživatelský avatar
Guitarister
Příspěvky: 11
Registrován: 11 říj 2012, 00:00

#13 Příspěvek od Guitarister »

Tak jsem to vyzkoušel a furt to dělá to stejné, už fakt nwm co s tím, buďto je chyba v zapojení nebo někde v programu, vůbec netuším co mám dělat, už jsem snad zkusil všechno.
Uživatelský avatar
Guitarister
Příspěvky: 11
Registrován: 11 říj 2012, 00:00

#14 Příspěvek od Guitarister »

Ještě mě napadlo, jestli to nemůže být trimrem na podsvětlení, použil jsem tam 4,7 kΩ.
Uživatelský avatar
Standa33
Příspěvky: 298
Registrován: 07 lis 2009, 00:00

#15 Příspěvek od Standa33 »

Já jsem u LCD použil pro nastavení kontrastu odpor cca 1k - 2k2.

Ješte, jak máš nastavené pojistky na té ATmega?
Nemáš tam zapnuté CLKDIV8?
Už jsem mi stalo, že jsem zapoměl toto nastavení vypnou a pak jsem zjistil, že mi správně nefunguje program.

Zkus tenhle program, jestli to půjde:
Přílohy
Test_LCD_WH1602A.zip
(62.14 KiB) Staženo 118 x
Odpovědět

Zpět na „Poradna“