Sida 1 av 1
Får inte LCDn att fungera
Postat: 24 september 2006, 01:31:01
av Nickeh
Sitter och försöker få min HD44780 LCD att fungera i 4-bits läge hittade lite info om det och har läst databladen men får det inte att fungera.
Som det ser ut nu så startar displayen och har översta raden svart, sedan så skickar jag följande kommandon
Kod: Markera allt
R/S | D4-D7
0 | 0011 function set 8 bit
0 | 0011
0 | 0011
0 | 0010 function set 4 bit
0 | 0010 första delen av:
0 | 1010 Function set 2 lines
0 | 0000 första delen av:
0 | 1000 Display off
0 | 0000 första delen av:
0 | 0001 Clear Display
0 | 0000 första delen av:
0 | 0110 Set Entrymode
0 | 0000 första delen av:
0 | 1111 Display on, cursor, blink
Detta resulterar i att displayen blir helt tom först för att sedan återgå till att visa den svarta linjen och sedan tillbaka till att vara helt tom. Ingen markör eller något.
Har lagt in rätt delays som är väl tilltagna om man kollar i databladet vad som rekommenderas.
Kikade på denna tråd och det gav rätt mycket men hittar inte riktigt någon lösning...
http://www.elektronikforumet.com/forum/ ... 80&start=0
hoppas att någon här kan klura ut detta för jag börjar få slut på ideér nu[/code]
Postat: 24 september 2006, 01:48:15
av björn
Jag kan inte se några fel nu direkt, kolla dock om du har gjort rätt på "increment display shift" vilket jag får till att det ska vara
Togglar du E enligt databladet?
EDIT: Nej, du har gjort rätt på Increment med.
Postat: 24 september 2006, 21:15:44
av Nickeh
Det verkar onekligen vara något med togglingen utav E som strular.
Skulle koppla en LED till den för att se vad som skedde. Kopplade först fel så att E blev konstant hög och helt plötsligt så fungerade allt som det skulle
Problemet nu är att jag inte får det att fungera utan E knuten till 5v
Har testat att lägga in större delay för att öka toggle tiden men det verkar inte ge något vidare resultat
Komm till ett läge där displayen visade en massa citattecken och i slutet det tecken som jag testat att skriva ut....
Kod: Markera allt
SENDNIB ;Sends a nibble
;In: nibToSend
clrf W
movf nibToSend, 0 ;Load nibble into W
movwf PORTB ;Send nibble
nop
nop
nop
bsf PORTA,lcdE ;Pulse the LCD Enable high
nop
nop
nop
nop
nop
nop
nop
nop
nop
bcf PORTA,lcdE ;lower LCD enable
nop
nop
nop
return
[/code]
Postat: 24 september 2006, 21:28:55
av sodjan
Kan du förtydliga, fungerar det nu eller inte ?
Postat: 25 september 2006, 01:37:34
av Nickeh
Som det ser ut nu så fungerade det då jag kopplat E till 5v. Kör jag utan det så beror resultatet lite på hur lång puls jag lägger på E.
Har testat med både väldigt långa delays vilket resulterade i att skärmen visade ca 20 st citattecken och sedan det tecken jag ville visa. Och med kortare pulser så är skärmen oftast helt blank (Ingen markör) efter initieringen.
E är kopplad på RA0 och comparatorn är avstängd är det något annat som kan orsaka problem där?
I data bladet för LCDn så står det att längden på pulsen till E ska vara minst 480 ns vilket borde räcka med några nop som jag gjort i koden ovan.
Den där koden är tagen från exempel på piclist så helt fel kan den ju inte vara.
Hoppas att jag lyckats få med den info som behövs nu.
Postat: 25 september 2006, 14:05:31
av sodjan
> En annan tanke är att bygga en sådan programmerare.
Viken processor och vilka pinnar använder du (och till vad) ?
Postat: 25 september 2006, 18:38:25
av Nickeh
Såhär har jag kopplat LCDn till en PIC 16F628A
Kod: Markera allt
; LCD PIC
; RS (6) RA2(1)
; R/W (7) RA1(18)
; E (8) RA0(17)
; DB4(13) RB3(9)
; DB5(14) RB2(8)
; DB6(15) RB1(7)
; DB7(16) RB0(6)
När jag kopplar in lysdioden (5+ -> LED -> Motstånd 330 Ohm -> RA0 ) så fungerar LCDn som det ska men då borde väl E ligga hög. Förstår inte riktigt varför det inte fungerar utan att koppla in LEDen men inte då jag bara har kopplat RA0 till E på LCDn
Tycker även att det är lite konstigt att LCDn inte bara matar ut en massa tecken helatiden iom att E alltid borde vara 1.
Någon som kan förklara vad som som händer när jag kopplat med dioden?
Postat: 25 september 2006, 18:45:24
av sodjan
> Tycker även att det är lite konstigt att LCDn inte bara matar ut en massa tecken helatiden iom att E alltid borde vara 1.
"E" är *flank* styrd, inte *nivå* styrd.
Minns inte vilken flank, men det vet vilket datablad som helst för en HD44780 display...
R/W, behöver du *läsa* från displayen ? Oftast lägger man den bara låg (till gnd). Spar en I/O pinne...
Du har stängt av komparatorerna (enligt databladet) ?
> Någon som kan förklara vad som som händer när jag kopplat med dioden?
Är förtfarande E kopplat till RA0 när dioden är inkopplad ?
Postat: 25 september 2006, 19:02:56
av Nickeh
>"E" är *flank* styrd, inte *nivå* styrd.
>Minns inte vilken flank, men det vet vilket datablad som helst för en HD44780 display...
Ska läsa på om det, har plöjt igenom datablad för displayen och ett anat som Icecap hade på sin hemsida.
>R/W, behöver du *läsa* från displayen ? Oftast lägger man den bara låg (till gnd). Spar en I/O pinne...
LCDn skall ännu inte användas i någon aplikation, är i rent lärningssyfte som jag har gjort detta. Kan ju inte skada att lära sig så mycket som möjligt när man väl har kopplat upp allt.
> Du har stängt av komparatorerna (enligt databladet) ?
Ja, tagit kod från exemplet på PORTA initiering från databladet
>Är förtfarande E kopplat till RA0 när dioden är inkopplad ?
Precis, kabeln till E är kopplad närmast RA0 och motstånd + LED några hål bort på labbplattan...
EDIT:
Efter en titt på databladet så förstår jag vad du meade med att E var flank styrd. Men jag blir ännu mera förbryllad för om jag förstår det rätt så bord ju displayen aldrig läsa när den är kopplad till 5 v. Om det inte blir någon nivåskillnad när RA0 ändar läge...
Postat: 25 september 2006, 22:37:11
av sodjan
Du har en poäng där...
Men, det spelar ingen roll, en *puls* på E är det som ska användas för
att "klocka in" ett kommando eller data (i två delar "nibbles" i ditt fall).
Så om inte det fungerar så är något annat galet.
Jag vet inte vilket material du har arbetet med, men själv tyckte
jag att dessa två artiklar var användsbara i början :
http://www.epemag.wimborne.co.uk/resources.htm
Kolla de två PDF'erna mitt på sidan...
Postat: 25 september 2006, 23:06:49
av Nickeh
Har kikat igenom de där pdf:arna, riktigt bra faktist.
Fick mig att förstå en hel del om själva initieringen...
Ska ta ett kort på min labbplatta och lägga upp då det känns som att det är där som det är något galet, iom att koden är tagen ur olika exempel osv. Måste bara ladda batterier till kameran....
Kan längden på kabeln mellan E och RA0 spela någon roll?
Lägger in hela min kod ifall det är någon galen inställning eller nåogt liknande som jag gjort...
Kod: Markera allt
;****************************************************
; Pic LCD Driver
; LCD: HD44780 based
; Processor: 16F628A
; Creator: Nicklas Haraldsson
; Date: 2006-09-18
;
; Training program to interface with HD44780 LCDs
;
; Wiring:
; LCD PIC
; RS (6) RA2(1)
; R/W (7) RA1(18)
; E (8) RA0(17)
; DB4(13) RB0(6)
; DB5(14) RB1(7)
; DB6(15) RB2(8)
; DB7(16) RB3(9)
;
; Switches wired to PORTA
;
;*****************************************************
list p=16F628A
#include <p16F628A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _INTOSC_OSC_NOCLKOUT & _MCLRE_ON & _LVP_OFF
;*****************
; Ram Definitions
;*****************
CBLOCK 0x20
hiByte
loByte
LCDByte
counter_outer
counter_inner
nibToSend
d1
ENDC
lcdRS equ 2 ;RS on RA0
lcdRW equ 1 ;RW on RA1
lcdE equ 0 ;E on RA2
;PortB used for data ports
;*****************
;Code begins here
;*****************
org 0x0000
clrf PORTA
clrf PORTB
movlw 0x07 ; Disable comparators to enable
movwf CMCON ; pins for I/O
bsf STATUS,RP0 ;RAM Page 1
clrf TRISA
clrf TRISB
movlw 0xfe
call DelayXX ;Wait for everything to start
movlw 0xfe
call DelayXX
movlw 0xfe
call DelayXX
movlw 0xfe
call DelayXX
Main bcf PORTA, lcdE
bcf PORTA, lcdRS ;Prepare LCD for commands
movlw b'0011' ; 8 Bit
movwf nibToSend ; Send
call SENDNIB
movlw 0xfe
call DelayXX
movlw b'0011' ; 8 Bit
movwf nibToSend ; Send
call SENDNIB
movlw 0xfe
call DelayXX
;
; Resten av initieringe ser lika dan ut. ....
;
;
Loop
goto Loop
;******************
;Sub routines
;******************
LCDBYTE ;Sends a byte to LCD i 4 BIT
;IN LCDByte OUT: hiByte, loByte
clrf hiByte ;Clear vars
clrf loByte
bcf STATUS,0 ;clear carry to avoid screwing bitshifting
rlf LCDByte, 1 ;Rotate LCDByte left puting LCDByte<7> in the STATUS,0 Carry bit
rlf hiByte ;Move carry to hiByte
rlf LCDByte, 1
rlf hiByte
rlf LCDByte, 1
rlf hiByte
rlf LCDByte, 1
rlf hiByte
movf LCDByte, 0 ;Load LCDByte into W
movwf loByte ;And inte loByte
swapf loByte, 1 ;Swap hi and lo nibble and put it back
movf hiByte, 0 ;Move hiByte into w
movwf nibToSend ;Put it in the outbox
call SENDNIB
movf loByte,0
movwf nibToSend
call SENDNIB
call SHORTDLY ;Wait until instructions are done
return
SENDNIB ;Sends a nibble
;In: nibToSend
clrf W
movf nibToSend, 0 ;Load nibble into W
movwf PORTB ;Send nibble
nop
nop
nop
nop
nop
nop
nop
bsf PORTA,lcdE ;Pulse the LCD Enable high
nop
movlw 0x01
call DelayXX
bcf PORTA,lcdE ;lower LCD enable
nop
nop
nop
nop
nop
nop
return
;******************
;Delay XX
;Usage:
; movlw 5 ;Bigger value delay longer (1...255)
; call DelayXX ;Delay 4+w
;
;******************
DelayXX
movwf counter_outer ;Store delay time
loop_outer
clrf counter_inner ;Prepare inner loop
loop_inner
decfsz counter_inner ;dec and loop 256 times
goto loop_inner ;1+2 inst x 256 (Delay period)
clrwdt ;Give the dog a bone
decfsz counter_outer ;Dec outer loop_outer
goto loop_outer ; 1+1+2 inst x value of counter_outer
;Total delay 4 * W + (3*256) * W
; Example W = 5
; (4*5) + (3*256) * 5 = 20 + (768 * 5) =
; 20 + 3840 = 3860 Instructioncycles
retlw 0 ;Return and clear w
SHORTDLY ;Around 50us
movlw 0x48
movwf d1
SHORTDLY_0
decfsz d1, f
goto SHORTDLY_0
;4 cycles including call
return
END
Postat: 25 september 2006, 23:17:28
av sodjan
Kontrollera din bank-hantering !
Den ser inte rätt ut.
TRISA/TRISB ligger i bank1, men variablerna som DelayXX använder ligger *inte* i bank1...
Tips, om du *vill* anropa DelayXX oberoende på vilken bank som för
tillfället är vald, lägg counter_outer och counter_inner från h'70', d.v.s
i det som kallas "unbanked memory".
Sen, skriv aldrig "bcf STATUS, 0" ! Använd symbolerna, d.v.s "bcf STATUS, C",
om det är Carry-flaggan som avses.
Sen kanske du har gjort det lite väl komplicerat med alla dina rotates.
Nornalt skriver man bara 4 bitar, gör en SWAP och skriver de andra 4 bitarna.
Postat: 26 september 2006, 01:03:42
av Nickeh
Antog att min kod inte skulle vara speciellt slipad. Är ju fortfarande i ett rätt tidigt stadium. Nu har jag en hel del att kolla över men nu är det dags att sova!
Tack för all input, ska kolla igenom koden i veckan och se om jag kommer någon vart.
Postat: 26 september 2006, 12:13:04
av Nickeh
Kollade över koden och ändrade det du påpekade och då fungerade det klockent!
Tusen tack för hjälpen!
Ska nu försöka skriva en LCDBYTE funktion som inte ändra de oanvända PORTB linorna så att man kan använda de till annat...