PDA

View Full Version : I can not figure out an LCD issue



lilimike
- 8th March 2010, 19:13
Hi,
I have been trying to figure this out for a couple of days now but no luck.

I am using 16F627A
At first I was using the internal osc with _INTOSC_OSC_NOCLKOUT and I was using the commented section bellow (Daryl's LCD_AnyPin) and I had DEFINE OSC 8 as any other value gave me a blank LCD.
This setup displayed information well on the LCD but at the bottom of my code I have a PAUSE 5000 which I expected the second line to go blank after 5 seconds however it went blank after about 10 secs.

I then added an 4 MHz external resonator, changed the fuse as bellow and tried different values for OSC but same results.

So I restored my pbppic14.lib to its original value commented the LCD_AnyPin section and added the standard way as bellow but now I am just getting question marks on the LCD.

So I guess I have 2 questions;
1 -Why did I get the wrong timing in my first setup?
2 - Why the standard way for LCD is not working whisle LCD_AnyPin did?

If anyone can make my day, that would be great.

Thanks

Mike


@ __config _XT_OSC & _WDT_OFF & _MCLRE_ON & _LVP_OFF & _CP_OFF

DEFINE OSC 4
TRISB = 0 ' Make PORTB all outputs
CMCON = 7 ' Disable comparator

'- - - - LCD_AnyPin.pbp - - - - - - - - - - - - - - - - - -
'LCD_DB4 VAR PORTB.0 ' Set port for 4 bits bus
'LCD_DB5 VAR PORTB.1
'LCD_DB6 VAR PORTB.2
'LCD_DB7 VAR PORTB.3
'LCD_RS VAR PORTB.5 ' Set RS bit port
'LCD_E VAR PORTB.4 ' Set Enable bit port
'LCD_Lines CON 2 ' # of Lines on LCD, 1 or 2 (Note: use 2 for 4 lines)
'LCD_DATAUS CON 50 ' Data delay time in us
'LCD_COMMANDUS CON 2000 ' Command delay time in us
'INCLUDE "LCD_AnyPin.pbp" ' Must go after LCD initialization

'- - - - Standard - - - - - - - - - - - - - - - - - -
define LCD_DREG PORTB ' Define LCD Data Port
Define LCD_DBIT 0 ' Set starting data bit (0 or 4)
Define LCD_RSREG PORTB ' Set Register Select port
Define LCD_RSBIT 5 ' Set RS bit
Define LCD_EREG PORTB ' Set Enable port
Define LCD_EBIT 4 ' Set E bit
Define LCD_BITS 4 ' Set bus size
Define LCD_LINES 2 ' Set number of lines on LCD
Define LCD_COMMANDUS 2000 ' Set command delay time
Define LCD_DATAUS 50 ' Set data delay time

'- - - - start of program - - - - - - - - - - - - - - - - - -
LCDOUT $FE,1 ' clear screen
LCDOUT $FE,$80,"LCD Prototype MJ"

' Use $Fe,$C0 to address the second line
LCDOUT $FE,$C0,"Timer testing"
pause 5000
LCDOUT $FE,$C0," "

Start: ' Program starts here


goto start

end

mackrackit
- 8th March 2010, 19:44
_XT_OSC
should be
_HS_OSC
with a resonator.

LCD_DBIT 0
change to
LCD_DBIT 4

Maybe...

Why AnyPin worked? I have no idea.

lilimike
- 8th March 2010, 19:59
Thanks for the reply Mackrackit,

Based on the datasheet _HS_OSC would be for 8 and 16 MHz but in my case I have 4 MHz.
But I gave it a try and also setting LCD_DBIT 4 but I get no timing difference with the "AnyPin" and still zilch with other setup!

I also tried FLAGS = 0 but still nothing
:rolleyes:

malc-c
- 8th March 2010, 20:44
The following works for me using an EasyPIC5 board with the LCD on PORTB, 18F4550 with 20Mhz xtal (mainly as that's what I'm using for a current project and couldn't be bothered to change the PIC !)



ASM ; 18F2550/4550, 20mhz crystal
__CONFIG _CONFIG1L, _PLLDIV_5_1L & _CPUDIV_OSC1_PLL2_1L & _USBDIV_2_1L
__CONFIG _CONFIG1H, _FOSC_HSPLL_HS_1H
__CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _VREGEN_ON_2L
__CONFIG _CONFIG2H, _WDT_ON_2H & _WDTPS_512_2H
__CONFIG _CONFIG3H, _PBADEN_OFF_3H
__CONFIG _CONFIG4L, _LVP_OFF_4L & _XINST_OFF_4L
ENDASM

DEFINE OSC 48
TRISB = 0 ' Make PORTB all outputs
CMCON = 7 ' Disable comparator


;----[LCD definitions]------------------------------------------------------
DEFINE LCD_DREG PORTB ' LCD Data port
DEFINE LCD_DBIT 0 ' starting Data bit (0 or 4)
DEFINE LCD_EREG PORTB ' LCD Enable port
DEFINE LCD_EBIT 5 ' Enable bit (on EasyPIC 5 LCD)
DEFINE LCD_RSREG PORTB ' LCD Register Select port
DEFINE LCD_RSBIT 4 ' Register Select bit (on EasyPIC 5 LCD)
DEFINE LCD_BITS 4 ' LCD bus size (4 or 8 bits)
DEFINE LCD_LINES 2 ' number of lines on LCD
DEFINE LCD_COMMANDUS 2000 ' Command delay time in us
DEFINE LCD_DATAUS 50 ' Data delay time in us

LCDOUT $FE,1 ' clear screen
LCDOUT $FE,$80,"LCD Prototype MJ"

' Use $Fe,$C0 to address the second line
LCDOUT $FE,$C0,"Timer testing"
pause 5000
LCDOUT $FE,$C0," "

Start: ' Program starts here


goto start

end


Using DEFINE OSC 20 I had erroneous results on the LCD, so it's obviously a timing issue with your 4MHz resonator.

mackrackit
- 8th March 2010, 20:52
When you say resonator I think of a three pin thing with built in caps, HS works for that.
If you are using a crystal then you may want to check the caps.

Forget the LCD for a bit and figure out the timing problem by blinking an LED once per second.

lilimike
- 8th March 2010, 21:30
Thanks Malc-C for the reply but I am not exactly trying to make it work...
Well yes I am trying to make it work but first I am trying to understand what is happening and what is my issue.

Mackrackit,
I am using a resonator (3 pins with caps incorporated) and double checked the datasheet and it does suggest _XT_OSC for a 4 MHz resonator.

I followed your suggestion and I put a LED with puse 1000 and also it is taking 2 secs to blink. Now, I set DEFINE OSC 4 instead of 8 which brought down to 1 sec as I expected so I know that if i am using a 4 MHz crystal, I should be having DEFINE OSC 4. I could be wrong but I think this part is clear to me.

So my questions are changing a bit and now I end up with:

1 - Why does LCD_AnyPin only works with DEFINE OSC 8 although I have a 4 MHz crystal ?

2 - Why the standard way for LCD is not working whisle LCD_AnyPin did even at 8 ?

When I find out, I will never forget it!

Mike

lilimike
- 9th March 2010, 02:04
after reading over the thread I just saw this:

Using DEFINE OSC 20 I had erroneous results on the LCD, so it's obviously a timing issue with your 4MHz resonator

I took out my resonator and used the chips' internal oscillator but I get the same results so this rules out the resonator I was using.

When using LCD_AnyPin it works with 8 MHz but the timing is doubled, if I set to 4 MHz the timing is is ok and LCD is blank.

Furthermore using standard settings for LCD does not work at all settings for OSC.

Help!

mackrackit
- 9th March 2010, 05:23
The only suggestion I have now is to play with these lines.


DEFINE LCD_COMMANDUS 2000 ' Command delay time in us
DEFINE LCD_DATAUS 50 ' Data delay time in us

Use the 4 MHZ OSC
DEFINE OSC 4

malc-c
- 9th March 2010, 07:29
after reading over the thread I just saw this:


I took out my resonator and used the chips' internal oscillator but I get the same results so this rules out the resonator I was using.

When using LCD_AnyPin it works with 8 MHz but the timing is doubled, if I set to 4 MHz the timing is is ok and LCD is blank.

Furthermore using standard settings for LCD does not work at all settings for OSC.

Help!

Mike,

That's why I included the statement. With a 20Mhz xtal and setting the define to 20 I got random parts of the text displayed. When I set the define to 48 it worked - why I don't know (I'm still a newb to a degree :) My guess is that the value is divided internally somewhere to set the timing, which is why in your case setting it to 8 works with a 4Mhz xtal

Acetronics2
- 9th March 2010, 08:08
The following works for me using an EasyPIC5 board with the LCD on PORTB, .


Hi, Lili

Me too with a 16F628 @ 8Mhz ... same board.
"LCD on Anypin" mods implemented ... but not used here.

may be the missing LCD Settling time @beginning of the program ???

Alain

lilimike
- 9th March 2010, 14:27
Dave,
I have tried
DEFINE LCD_COMMANDUS 1000 and 4000
DEFINE LCD_DATAUS 25 and 100
with no aparent changes.

Malcom,
The display does work at 8 MHz with a 4 MHz resonator but the chip's timing is doubled and that is what I am trying to figure out. so a PAUSE 1000 will last 2 seconds instead of 1 second. The timing for this project is important because I want to build an ultrasound distance mesurement and so I have to time the echo received after sending an output burst of 40 KHz. I think I am far from my goal but I can't get started with the fun part untill I have figured out my issue with the timing problem.

Alain,
What did you mean by this?

may be the missing LCD Settling time @beginning of the program ???


For the record this is my hardware configuration and with an oscilloscope I see the 5V as pure DC 5.12V

lilimike
- 9th March 2010, 14:41
Ok so here is a positive update...

I had removed my resonator last night to rule it out and got the same issue with the chip's internal oscilator. Today I just put back the resonator and set _XT_OSC again and now it is working fine at 4 MHz.

Furthermore...! if I remove the LCD_Anypin, it is now still working with the standard version.

So please correct me if I am wrong but I am working with a breadboard and I suspect when I had the resonator at first, there was a bad contact with one of its pin!

Thanks to all for your responses, it kept me going.

Mike

mackrackit
- 9th March 2010, 14:48
Yup
A bad connection will make all kinds of strange things happen.

malc-c
- 9th March 2010, 18:08
Mike,

Not sure if I'm correct, but I seem to remember reading that solder less breadboards can cause issues as they can have a high capacitance. Maybe this was part of the problem causing the timing issue.

Glad to hear you have this part resolved and best of luck with the rest of your project

Acetronics2
- 11th March 2010, 13:54
Alain,
What did you mean by this?

Quote:
may be the missing LCD Settling time @beginning of the program ???


Hi, I just mean place a pause 500 to 700 ms before sending the very first command to the LCD.
just to let it be ready for receiving infos ...

Moreover

DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50

are the correct value for LCDs

in case of using OLEDS ... add 50% to both !!!

Alain