Hallo, ik ben aan het proberen om een de letter 'A' op een LCD schermpje weer te geven. Tot nu toe heb ik daar niet veel succes mee en ik weet niet waar het aan ligt :(

Uiteraard heb ik naar de vorige post gekeken:

http://www.circuitsonline.net/forum/view/47665/1/lcd

maar ben daar helaas ook niets mee opgeschoten.

Ik maak gebruik van een PIC16F628 microcontroller om met de HD44780 te praten. De B-poort van de PIC is aangesloten op de Data-signalen van het LCD scherm. Bovendien:

RS = A2
R/W = A3
E = A4

en zo ben ik aan de slag gegaan in JAL:

--
-- name    : A_on_screen
-- author  : Jurgen van den Berg
-- date    : 01-may-2007
-- purpose : printing the letter 'A' on an LCD screen
--
-- target configuration: 16f628 with 4 Mhz Xtal

include 16f628_4
include jlib

var volatile byte CMCON at 0x1F = 0x07     -- disable port a analog functions

pin_a2_direction = output                  -- use a2 for RS
pin_a3_direction = output                  -- use a3 for R/W
pin_a4_direction = output                  -- use a4 for E
port_b_direction = all_output              -- use a byte for the data

const byte clear_display   = 0b00000001
const byte cursor_home     = 0b00000010
const byte entry_mode      = 0b00000110
const byte display_control = 0b00001111
const byte function_set    = 0b00111000
const byte cursor_right    = 0b00010100
const byte cursor_left     = 0b00010000

var byte temp_teller = 0

pin_a2 = off
pin_a3 = off

pin_a4 = on                                -- ENABLE DISPLAY

-- ==========================================================================
    port_b = clear_display

    -- check Busy-Flag
    pin_a3 = on
    port_b_direction = all_input
    while pin_b7 == low loop temp_teller = temp_teller + 1 end loop
    port_b_direction = all_output
    pin_a3 = off
-- ===========================================================================

    port_b = cursor_home

    -- check Busy-Flag
    pin_a3 = on
    port_b_direction = all_input
    while pin_b7 == low loop temp_teller = temp_teller + 1 end loop
    port_b_direction = all_output
    pin_a3 = off
-- ===========================================================================

    port_b = entry_mode

    -- check Busy-Flag
    pin_a3 = on
    port_b_direction = all_input
    while pin_b7 == low loop temp_teller = temp_teller + 1 end loop
    port_b_direction = all_output
    pin_a3 = off
-- ===========================================================================

    port_b = function_set

    -- check Busy-Flag
    pin_a3 = on
    port_b_direction = all_input
    while pin_b7 == low loop temp_teller = temp_teller + 1 end loop
    port_b_direction = all_output
    pin_a3 = off
-- ===========================================================================
-- set address to first character:
    port_b = 0b10000000

    -- check Busy-Flag
    pin_a3 = on
    port_b_direction = all_input
    while pin_b7 == low loop temp_teller = temp_teller + 1 end loop
    port_b_direction = all_output
    pin_a3 = off
-- ===========================================================================
-- set character to 'A':
    pin_a2 = on
    port_b = 0b01000001
    pin_a4 = off


forever loop
end loop

heeft iemand enig idee wat ik verkeerd doe? Het schermpje blijft uit, ik zie niets veranderen of ik de voeding nu aan of uit zet.

Alvast hartelijk bedankt, ik ben al de hele dag bezig met dit 'kleinigheidje'... :(

Nou heb ik die ellende met die pic-dingen best vaak voorbij zien komen dus een gokje: Is die pin4 geen open drain uitvoering? Weet de rest van je hardware dat ook?

Een open drain... daar heb ik nog nooit van gehoord :$

Hoe check ik dat / hoe ga je met zo'n ding om? Hoe 'laat ik dat de rest van mn hardware weten' ?

m.v.g. Jurgen van den Berg

open drain werkt hetzelfde als een open collector uitgang. Hij kan dus alleen laag worden. Je kan hem wel als uitgang gebruiken, maar dan moet je er een pull-up weerstand bij plaatsen. De uitgang is dan wel geinverteerd.

Hmm... Pin4 wordt niet gebruikt als uitgang; deze hangt via 33k Ohm aan de +5Volt.

pin_A4 is pinnetje 3 van de PIC zelf, en dat is wel een uitgang (hangt aan de enable van het display).

Hoe dan ook, Pin4 --de E-ingang v/d LCD-module wordt niet gebruikt zoals het hoort:
R/W instellen
RS instellen
E hoog
Data klaarzetten
E laag
...

pin_A4 is pinnetje 3 van de PIC zelf,

Ja, in die is juist OD. pin 4 is RA5 = MCLR. Zie ook de datasheet

Dus iedere keer als ik iets wil veranderen aan het LCD-schermpje moet ik:

R/W instellen
RS instellen
E hoog
Data klaarzetten
E laag

allemaal afwerken? En wat nu als R/W de hele tijd laag blijft (deze blijft vaak achter elkaar laag).

is dit dan de goede volgorde?

- R/W instellen
RS instellen
E hoog
clear display
E laag

- R/W instellen
RS instellen
E hoog
cursor home
E laag

- etc. ?

@ xantus: pin4 = RA5 = MCLR = met 33k aan +5Volt gehangen en wordt verder niet gebruikt... Ik heb de datasheet bekeken, maar ik zie nog niet wat ik nu met de RA4 moet doen? Ik zie idd in de datasheet staan dat het een OPEN DRAIN is, maar nu? :P

m.v.g. Jurgen

[Bericht gewijzigd door Dark_Knight op ]

wat ik altijd doe omdat ik geen icd thuis beschikbaar heb neem een niet gebruikte output en laat een ledje togglen zodat je ziet of je PIC wel loopt.

ik heb van vandaag een werkende source code van HD44780 maar in assembler geschreven en voor pic 16f872 als je ze wilt hebben let me know

datasheet blz 13, 33, 35. Zoek op google ook maar naar PIC16F628A + RA4

Wat een hoop code. En dat enkel voor de letter 'A' op het scherm te krijgen. Mijn code in assembler voor een ganse tekst is zelfs kleiner van omvang.

Begin eens eenvoudiger en laat alle overhead er uit.
Organiseer zo veel mogelijk in subroutines.

Nu ter zake.
Sommige dingen zie je aan de display.

Als je het contrast tamelijk donker zet zie je bij een tweeregelig display dat de bovenste digits iets meer doorkomen dan de onderste. Als hij door zijn initialisatie raakt zal dit verdwijnen.

Je kan ook om te beginnen een knipperende cursor op het display te krijgen natuurlijk voor je er echt karakters naartoe schrijft.

Code ontwikkelen is nu eenmaal stap voor stap met vallen en opstaan.

Haha... ja en ik dacht zelfs simpel te beginnen door EEN letter op het scherm proberen te zetten!

Maargoed, door een weerstand naar +5Volt te laten gaan maak ik dus een soort pull-up weerstand? Maar is die uitgang dan geinverteerd?

Jurgen

Op 1 mei 2007 22:16:40 schreef Dark_Knight:
Dus iedere keer als ik iets wil veranderen aan het LCD-schermpje moet ik:

R/W instellen
RS instellen
E hoog
Data klaarzetten
E laag

allemaal afwerken? En wat nu als R/W de hele tijd laag blijft (deze blijft vaak achter elkaar laag).

Yep! Je kan ook R/W permanent met GND verbinden, en tussen het versturen van een instructie/karakter telkens een gepaste wachttijd in acht nemen. Dat is 1.6mS bij "Clear Display" en "Cursor Home" en 40µS bij de rest.
Vergeet ook de initialisatie niet! En kijk eens in de HD44780-datasheet die je op http://www.eio.com/datashet.htm kan bewonderen.

Op 1 mei 2007 22:42:38 schreef pros:
[...]
Yep! Je kan ook R/W permanent met GND verbinden, en tussen het versturen van een instructie/karakter telkens een gepaste wachttijd in acht nemen.

Ik vindt het mooier met de busy bit te werken.

Maar om te beginnen met LCD's om het niet ingewikkeld te maken kan je met een vaste wachttijd werken en begin ook met de 8-bit interface kwestie van het zo eenvoudig mogelijk te houden.

Ik heb mijn code verandert zodat:
- ik gebruik maak van subroutines
- vaste wachttijden aanhoud
- R/W instellen
RS instellen
E hoog
Data klaarzetten
E laag

aanschouw:

--
-- name    : A_on_screen
-- author  : Jurgen van den Berg
-- date    : 01-may-2007
-- purpose : printing the letter 'A' on an LCD screen
--
-- target configuration: 16f628 with 4 Mhz Xtal

include 16f628_4
include jlib

var volatile byte CMCON at 0x1F = 0x07     -- disable port a analog functions

pin_a2_direction = output                  -- use a2 for RS
pin_a3_direction = output                  -- use a3 for R/W
pin_a4_direction = output                  -- use a4 for E
port_b_direction = all_output              -- use a byte for the data

const byte clear_display   = 0b00000001
const byte cursor_home     = 0b00000010
const byte entry_mode      = 0b00000110
const byte display_control = 0b00001111
const byte function_set    = 0b00111000
const byte cursor_right    = 0b00010100
const byte cursor_left     = 0b00010000

-- ======================================================================

procedure message(byte in DATA) is
    pin_a3 = off
    pin_a2 = off
    pin_a4 = on
    port_b = DATA
    pin_a4 = off
end procedure

procedure character(byte in ADDRESS, byte in DATA) is
    pin_a3 = off
    pin_a2 = off
    pin_a4 = on
    port_b = ADDRESS
    pin_a4 = off
    
    delay_1us(50)
    
    pin_a3 = off
    pin_a2 = on
    pin_a4 = on
    port_b = DATA
    pin_a4 = off
end procedure

-- ======================================================================

delay_100ms(10)                            -- give screen time to wake up

forever loop
    message(clear_display)
        delay_1ms(2)
        
    message(cursor_home)
        delay_1ms(2)
        
    message(entry_mode)
        delay_1us(50)
        
    message(display_control)
        delay_1us(50)
        
    message(cursor_right)
        delay_1us(50)

    message(function_set)
        delay_1us(50)
        
    character(0b10000000,0b01000001)
        delay_1us(50)
        pin_a2 = off

    forever loop
    end loop
end loop

maar hij doet het nog steeds niet!!

Zou iemand deze code misschien na kunnen kijken? Ik zie niet in wat er fout aan is... :( naja, morgen weer een dag! Bedankt voor alle reacties, en alvast bedankt degene die het kan fixen :P

Jurgen

Doet het lcd hetzoiezo wel ? bl gaat wel aan bv ?

Welke taal programmer je de boel in?? C met MPLAB, heb zelf daarvoor een header geschreven. Includen, in je init initlcd() toevoegen en klaar, alles naar je display te schrijven met een simpel comando. Is dus eenmaal programeren en dan veel gebruiken.

Als je wilt kan ik deze wel sturen. Vertel het maar.

Waarom gebruik je de standaard libs van jal niet voor je lcd? Die werken prima.

Je kan al niet beginnen met de display te clearen.
Eerst de display instellen op 8 of 4 bits.
Je schrijft al vanalles naartoe en je display is nog niet ingesteld.

de taal heet JAL, en ik wilde eigenlijk een beetje uitvogelen hoe het allemaal in z'n werk gaat zonder standaard lib's. Maargoed dat valt dus vies tegen :s

wat zou dan de goede volgorde zijn? (haha... beetje knip en plakwerk? (A))

truste...

Op 1 mei 2007 22:10:34 schreef pros:
Hoe dan ook, Pin4 --de E-ingang v/d LCD-module wordt niet gebruikt zoals het hoort:
R/W instellen
RS instellen
E hoog
Data klaarzetten
E laag
...

Geen zin om de datasheet van de 44780 erbij te pakken, maar eh... Was het niet zo dat je data stable moest zijn bij een hoge E? Staat me vaag wat van bij. Controleer het even...

Data mag nog gewijzigd worden terwijl E hoog is, maar moet 195nS stabiel zijn, vóór E van hoog naar laag gaat.

Mijn advies: Gebruik RA4 enkel en alleen als ingang met een pullup weerstand.
Dan heb je nooit een probleem met RA4.

CD :)

Op 2 mei 2007 07:35:58 schreef pros:
Data mag nog gewijzigd worden terwijl E hoog is, maar moet 195nS stabiel zijn, vóór E van hoog naar laag gaat.

Je kent het ding beter uit je hoofd dan ik ;)

Mijn advies: Gebruik RA4 enkel en alleen als ingang met een pullup weerstand.
Dan heb je nooit een probleem met RA4.

Mijn advies: gebruik gewoon een fatsoenlijke μC. Dan heb je die problemen ook niet :+

Op 2 mei 2007 07:35:58 schreef pros:
Data mag nog gewijzigd worden terwijl E hoog is, maar moet 195nS stabiel zijn, vóór E van hoog naar laag gaat.

195 nS is bij een klok van 20 MHz (pic loopt dan op 5) precies één instructie.

Netter is wel om de data eerst aan de bieden en daarna de E-lijn te pulsen.

@marco69: ik dacht dat PIC's heel fatsoenlijke uC's waren.
Maar als jij een voorbeeldje hebt voor een 1802, dan graag ;-)