merkwaardig PIC-probleem

Dec 16, 2004 6 Replies

Dagenlang ben ik aan het zoeken geweest waarom een PIC-schakeling met een LCD niet werkte. Zodra ik er aan kwam wel, maar anders niet. Nu blijkt, dat als ik een Ctje van 22 pF van DB7 (tevens busy-bit van de LCD!) van de LCD-module naar +5V zet, het wel werkt. Iemand enig idee hoe dat komt? Hierna een uitbvoeriger beschrijving voor geinteresseerden. Bij voorbaat dank voor reacties. Jelle Aarnoudse



Beschrijving. Ik werk met een 16F648A, interne clock op 4MHz met clock-out op RA6 (alleen om te kijken of hij loopt). Op RB3 t/m 0 zit RB7 t/m 4 (4-bits mode dus) van een 24x2LCD-module (zie datasheet op

formatting link
Op PORTA zitten de control-signalen van de LCD: RA0=E, RA1=R/W en op RA2 zit RS. Op RB4 zit een pushbutton naar massa met een weerstandje van 47K naar



+5V, die een RB-change-interrupt veroorzaakt, die een bitje zet zodat het hoofdprogramma weet dat er een volgende set regels naar het display moet worden gezonden. RB-weak-pullup weerstanden disabled. Aanvankelijk leek de schakeling niet te werken, maar af en toe wel, als ik bijvoorbeeld met de oscilloscoop-probe aan DB7/RB3 kwam. Daarom geprobeerd een weerstandje van 47K naar de plus en vervolgens naar massa, maar dat hielp niet. Aanraken met een vinger hielp ook niet, maar weer wel als ik het met een pincet deed. Uiteindelijk een Ctje van 22 pF naar de plus gesoldeerd en nu werkt het puik! Maar hoe valt dit te verklaren?????

"Jelle" schreef in bericht news:cpsbll$rfm$ snipped-for-privacy@reader10.wxs.nl...

dat

(alleen

van

zit

het

gesoldeerd

Hoe zet je die output RB3 hoog/laag ? Die malle pics lezen eerst de output en zetten dan de uitgang. Zo kun je RB3 de mist in laten gaan als je een andere pin (op dezelfde 8-bit poort) hoog/laag zet. E.e.a. afhankelijk van de belasting, snelheid e.d. Is de belasting zeer laag, is het meestal geen probleem.

Probeer, voor de aardigheid, eens alle RBx bitjes in een variabele te manipuleren, en na elke verandering van die data het hele byte naar de RB poort te kopieeren.

Voor meer info, zoek op read-modify-write.

Thanks, Frank. (remove 'q' and 'invalid' when replying by email)

Als je hetzelfde C-tje naar massa gebruikt, doet hij het dan ook? Het lijkt er haast op dat de begin- of eindflank van het signaal minuscuul vertraagd moet worden. Heb je RB3-0 constant in output mode staan? Als je de busy bit probeert te lezen (doe ik nooit), is de timing dan goed? Kan haast niet fout met 4 MHz klok zou je denken.

Mat Nieuwenhoven

Mat en Frank bedankt voor jullie reacties. De read-modify-write cyclus moet ik inderdaad nog eens even goed bekijken. Ik heb het low-nibble van PORTB steeds in output-mode staan, behalve als ik het busybit van de LCD moet lezen. Dan maak ik PORTB geheel input, zet de R/W-lijn van de LCD hoog, toggle de E-lijn van de LCD L-H-L, kijk of busy al gecleared is, zoniet opnieuw E-lijn togglen, net zo lang tot busy is gecleared. Volgens de datasheet van de LCD is de executietijd van een 'Read busyflag and address'-instructie 1 microseconde, dus dat moet goed gaan met een instructiecyclus van 1 microsec in de PIC. Ik kwam op het condensatortje omdat het wel werkte als ik de pin van mijn

1:10-oscilloscoopprobe er tegenaan hield. Het lijtk wel of het circuit dusdanig hoogohmig is, dat de lading niet (snel genoeg) weg kan. En dat verbaast me weer, omdat de LCD-poort gedurende het gehele busyflag-pollen als output staat geschakeld. Ik zal in elk geval morgen eens even proberen wat er gebeurt als ik het Ctje naar massa schakel. En als ik er echt niet uitkom kan ik idd ook altijd nog afzien van het busyflag-pollen en gewoon wachtlusjes in het programma bouwen. Nogmaals dank en groeten, ik houd jullie op de hoogte, Jelle

dat

(alleen

van

zit

het

gesoldeerd

ik

al

'Read

met

Ctje

Op welk moment lees jij de busyflag in? Dat moet volgens mij als E nog hoog is. Als E weer laag gaat schakelt de LCD module weer terug om.

Jeroen schreef: "Op welk moment lees jij de busyflag in? Dat moet volgens mij als E nog hoog is. Als E weer laag gaat schakelt de LCD module weer terug om." DAT MOET HET ZIJN! Wat ongelooflijk stom. Ik heb de hele datasheet doorgespit op settling-times etc, maar ben ervan uitgegaan dat de data wordt ingeklokt op de neergaande flank van de E-lijn. En dat is dus niet zo; de data is geldig als E hoog is (eigenlijk 360ns nadat die hoog geworden is, maar dat telt niet in een 1us uCsysteem). Het Ctje van 22pf houdt dus de data net lang genoeg vast om nog gelezen te kunnen worden nadat E laag geworden is. Ik ga het direct proberen! Zeer bedankt Jeroen! Groetjes, Jelle

bekijken.

de

busy

mijn

busyflag-pollen

hoog

Het zat hem dus idd in het moment waarop ik de busy-flag las. Nu ik dat heb gecorrigeerd werkt het als een zonnetje. Pffff! Nogmaals: mijn dank voor jullie meedenken. Gr, Jelle

settling-times

is

nog

als

gaan

dat

het

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required