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 loopheeft 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).
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
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? 
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
Peter Claus
It is so simple to be happy, but it is so difficult to be simple
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
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
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 laagallemaal 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.
Peter Claus
It is so simple to be happy, but it is so difficult to be simple
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 loopmaar 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 
Jurgen
treinfreak
Look at me, I can't fly.....
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.
Erik
In order to succeed you must fail, so that you know what not to do the next time.
Peter Claus
It is so simple to be happy, but it is so difficult to be simple
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...
pros
Prosper, yop la boum, c'est le roi du macadam (aldus Maurice Chevalier)
Data mag nog gewijzigd worden terwijl E hoog is, maar moet 195nS stabiel zijn, vóór E van hoog naar laag gaat.
Turbokeu
Golden Member
I love watching conspiracy theorists use the airtight logic of the argument from incredulity: "Well I don't understand how it works so it can't be real!!!"
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 