|
|
View previous topic :: View next topic |
Author |
Message |
ajitmutalik
Joined: 30 Sep 2006 Posts: 5
|
Problem in configuring a 7-Segment LCD with PIC16F913 |
Posted: Sat Sep 30, 2006 1:02 pm |
|
|
Hi,
I am writing a small application using PIC16F913(SSOP package).
The application consists of putting BCD data onto LCD.
I am using CCS C compiler standard function to configure the LCD i.e. SETUP_LCD();
But I am not able to get the desired data pattern on the LCD screen. The data on the screen is always flickering.
I am using 1/4 multiplex and 1/3 bias.
After a few attempts (I have burnt quite a few PIC's in attempt of measuring VLCD), I could observe that the LCD reference voltage at VLCD pins is not remaining constant. I could observe a pattern at VLCD pins which is similar to the segment pins of the LCD.
Could this fluctuation in the voltage be the reason of flicker?
Can anybody suggest me correct LCD configuration?
Are there any limitations for using LCD with the help of CCS C compiler? _________________ Ajit |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Sep 30, 2006 1:22 pm |
|
|
1. Are you using a demo board that you bought, or did you build it
yourself ? If you bought the board, then post the Manufacturer
and part number of the board. Also provide a link to the web page
for the board.
2. What 7-segment LCD are you using ? Post the manufacturer and
part number.
3. What version of the CCS compiler are you using ? (hopefully not
vs. 4.xxx -- it's not really ready yet). You can find the version by
looking at the top of the .LST file for your project. The .LST file is
in your project directory.
4. Can you post a very small test program that shows the problem ?
I think you can do this with less than 30 lines of code. Please don't
post any more than that. These 30 lines should show all #fuses,
#use statements, #include statements, etc. Be sure to show the
code that calls the CCS functions that do the LCD setup. Also show
the code that attempts to write characters to the LCD. (In other
words, a small, but complete little test program).
I have to go away the rest of the day, so I can't work on this until later.
If someone else has an answer, then of course they should reply too. |
|
|
ajitmutalik
Joined: 30 Sep 2006 Posts: 5
|
|
Posted: Sat Sep 30, 2006 1:53 pm |
|
|
hi,
here are the answers,
1. The board which I am using is custom built.
2. I am using 5.1 digits 7-seg LCD display. It is from Truly semiconductors.
3. I am using CCS C version 3.242
4. Test Program:
Please find the LCD mapping as #define for each digit.
#include <16F913.h>
#fuses NOWDT, NOPUT, MCLR, NOCPD, BROWNOUT, IESO, FCMEN, INTRC_IO
#use delay(clock=4000000)
//////////////////////////////////////////////////////////////////////////////////////// LCD Configuration //
/////////////////////////////////////////////////////////////////////////////////////////
// Digit segments A B C D E F G DP
// b7 b6 b5 b4 b3 b2 b1 b0
#define DIGIT6 COM3+11, COM2+11, COM1+11, COM0+11,
COM1+12, COM3+12, COM2+12, COM0+12
#define DIGIT5 COM3+8, COM2+8, COM1+8, COM0+8,
COM1+9, COM3+9, COM2+9, COM0+9
#define DIGIT4 COM3+6, COM2+6, COM1+6, COM0+6,
COM1+7, COM3+7, COM2+7, COM0+7
#define DIGIT3 COM3+4, COM2+4, COM1+4, COM0+4,
COM1+5, COM3+5, COM2+5, COM0+5
#define DIGIT2 COM3+2, COM2+2, COM1+2, COM0+2,
COM1+3, COM3+3, COM2+3, COM0+3
#define DIGIT1 COM3+0, COM2+0, COM1+0, COM0+0,
COM1+1, COM3+1, COM2+1, COM0+1
#define CLOCK COM3+14, COM2+14, COM1+14, COM0+14,
COM1+13, COM3+13, COM2+13, COM0+13
//
#define BLANK 0
#define DOT 1
// character 0 1 2 3 4 5 6 7 8 9
byte const Digit_Map[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xF6}; // for display 0 - 9
byte const Diag_Map[12] = {0x00,0x02,0x0C,0x50,0xA0,0xFE,0x01,0x08,0x02,0x10,0x20,0xFF};
// for diagnostic pattern
//byte Second_Line[7];
/////////////////////////////////////////////////////////////////////////////////////////
void lcd_putc(char c)
{
byte segments;
if((c>=0)&&(c<=9))
segments=Digit_Map[c];
else if (c <16>= 16)
{
lcd_symbol(0x00,DIGIT1);
lcd_symbol(0x00,DIGIT2);
lcd_symbol(0x00,DIGIT3);
lcd_symbol(0x00,DIGIT4);
lcd_symbol(0x00,DIGIT5);
lcd_symbol(0x00,DIGIT6);
lcd_symbol(0x00,CLOCK);
switch(c)
{
case 16:
{
lcd_symbol(DOT,DIGIT1);
break;
}
case 17:
{
lcd_symbol(DOT,DIGIT2);
break;
}
case 18:
{
lcd_symbol(DOT,DIGIT3);
break;
}
case 19:
{
lcd_symbol(DOT,DIGIT4);
break;
}
case 20:
{
lcd_symbol(DOT,DIGIT5);
break;
}
case 21:
{
lcd_symbol(DOT,DIGIT6);
break;
}
case 22:
{
lcd_symbol(Diag_Map[6],CLOCK);
break;
}
case 23:
{
lcd_symbol(Diag_Map[7],CLOCK);
break;
}
case 24:
{
lcd_symbol(Diag_Map[8],CLOCK);
break;
}
case 25:
{
lcd_symbol(Diag_Map[9],CLOCK);
break;
}
case 26:
{
lcd_symbol(Diag_Map[10],CLOCK);
break;
}
default:
{
lcd_symbol(Diag_Map[11],DIGIT1);
lcd_symbol(Diag_Map[11],DIGIT2);
lcd_symbol(Diag_Map[11],DIGIT3);
lcd_symbol(Diag_Map[11],DIGIT4);
lcd_symbol(Diag_Map[11],DIGIT5);
lcd_symbol(Diag_Map[11],DIGIT6);
lcd_symbol(Diag_Map[11],CLOCK);
}
}
}
else
{
if ((c <= 9) || (c == 11) || (c == 15))
{
lcd_symbol((segments+DOT),DIGIT6);
}
else
{
lcd_symbol(segments,DIGIT6);
}
lcd_symbol(segments,DIGIT5);
lcd_symbol(segments,DIGIT4);
lcd_symbol(segments,DIGIT3);
lcd_symbol(segments,DIGIT2);
lcd_symbol(segments,DIGIT1); }
}
void main()
{
byte number = 0;
setup_lcd(LCD_MUX14 | LCD_INTRC,4);
/* Configure LCD - 1. 1/4 Multiplexing
2. LCD clock source is internal oscillataor (31kHz/32) with prescalar of 4.
3. Type A waveform */
for(number = 0; number <= 27; number++ )
{
lcd_putc(number); /* Function call to display the number */
delay_ms(4000);
}
} _________________ Ajit |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Sep 30, 2006 11:24 pm |
|
|
I couldn't find an active website for Truly Semiconductors.
The company may not exist anymore.
Do you have the external bias resistors installed ?
The data sheet shows how to do this. For the mode you have
selected, they say to use three 10K resistors in series for the
1/3 bias mode. |
|
|
ajitmutalik
Joined: 30 Sep 2006 Posts: 5
|
|
Posted: Sun Oct 01, 2006 4:06 am |
|
|
hi,
Yes, I have connected three 10K resistors across the pins 13,12 and 11.
But today when I observed the voltages across VLCD1,2,3 pins ....... I could see pattern similar to the one which is present at the Segment pins.
The voltage at these pins is not at all constant.
Also I measured the resistance values for the 10K resistors and found the resistor connected across pins 11 and 12 to be 350 ohms. I measured with power supply disconnected.
Then removed the controller IC and then measured the resistance again and I found it to be 10K.
I am confused, as to how the reference voltage is not remaining constant. _________________ Ajit |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Oct 01, 2006 12:45 pm |
|
|
I think one of the problems is that the VLCD pins are not enabled.
Look at Microchip appnote AN1013:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1824&appnote=en025460
It shows a project similar to your project. Look in the source code file
called INIT917.ASM (in the zip file).
They setup LCDCON with the VLCDEN bit set = 1. (This is bit 4)
Quote: |
BANKSEL LCDCON
MOVLW B'10010010'
MOVWF LCDCON
|
Here is the .LST file code from your program. Notice that the VLCDEN
bit is = 0. So the VLCD pins are not enabled. The value of 0x8B is
loaded into LCDCON. This is 1000 1101 in binary. Notice that bit 4
is 0. This means the VLCD pins are disabled.
Quote: | ... setup_lcd(LCD_MUX14 | LCD_INTRC, 4);
0689: MOVLW 8B // Value to load into LCDCON
068A: BSF 03.6 // Bank select
068B: MOVWF 07 // LCDCON register
068C: MOVLW 24
068D: MOVWF 08
|
You can fix this by making the following changes to your program.
1. Add the #define statement for VLCD_ENABLE.
2. Add that constant to the setup_lcd() statement.
See the code shown below:
Quote: |
#define VLCD_ENABLE 0x10
setup_lcd(LCD_MUX14 | LCD_INTRC | VLCD_ENABLE , 4);
|
After re-compiling the program with the changes shown above,
we get the following code in the .LST file. Notice that instead of 0x8B,
the value loaded into LCDCON is now 0x9B.
Quote: |
.... setup_lcd(LCD_MUX14 | LCD_INTRC | VLCD_ENABLE , 4);
0689: MOVLW 9B
068A: BSF 03.6
068B: MOVWF 07
068C: MOVLW 24
068D: MOVWF 08
|
This change may not fix all your problems. You may have several
problems. But at least this should help. |
|
|
Guest
|
|
Posted: Tue Oct 03, 2006 1:41 am |
|
|
hi,
thanks for the suggestion.
I tried with enabling the LCDEN bit in LCDCON; but still the problem persists.
I checked the same piece of code with 16F916 and it works
Is there any difference for the LCD configuration in 16F913 and 16F916?
or may be some hardware consideration which I have missed out?
My company wants to use 16F913 due to cost factor :( |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Oct 03, 2006 2:17 am |
|
|
There is no errata document on the silicon for the 16F91x series.
Have you tried another 16F913 ? Maybe the first one was a bad chip. |
|
|
ajitmutalik
Joined: 30 Sep 2006 Posts: 5
|
|
Posted: Tue Oct 03, 2006 2:58 am |
|
|
yes I tried with different 16F913 also.
I tried with almost 10-15 different 16F913 samples.
It worked with only 1 and rest are failing.
but I tried with 2 different 16F916 microcontrollers and the same code worked there.
I am getting confused now. _________________ Ajit |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Oct 03, 2006 1:44 pm |
|
|
1. It could be a problem with the setup of the LCD controller inside
the PIC.
2. There could be some silicon errata that has not been published by
Microchip.
3. It could be a problem with the bias resistor network.
Look at the bias voltages on the VLCD pins with an oscilloscope.
Compare the voltage on the 16F913 with the 16F917. Are there
any differences ?
The Microchip appnote AN658 says this about the resistor values:
Quote: |
The resistance values are determined by two factors:
display quality and power consumption. Display quality
is a function of the LCD drive waveforms.
Since the LCD panel is a capacitive load, the waveform is
distorted due to the charging and discharging currents.
This distortion can be reduced by decreasing the value
of resistance. However this change increases the
power consumption due to the increased current now
flowing through the resistors. As the LCD panel
increases in size, the resistance value must be
decreased to maintain the image quality of the display.
|
So it's possible that changing the bias resistor values could make
a difference.
4. Can you post the exact part number of the LCD that you're using ?
Post a link to the data sheet. If you can do this, then maybe I
can see what are the proper values for the bias resistors.
5. Also post a list of connections between the PIC pins and the LCD pins. |
|
|
ajitmutalik
Joined: 30 Sep 2006 Posts: 5
|
|
Posted: Fri Oct 06, 2006 12:37 am |
|
|
I dont have 16F917, I checked the behaviour with 16F916 and sometimes it worked.
For the failed board I checked the VLCD voltages with 16F916 and 16F913 and found it to be the same.
I disabled the LCD configuration and I get a const voltage 1.6V for all VLCD pins.
Also I tried to reduce the resistance values, from 100K to 10K and then to 7.5K; but no difference.
The surprising part is the same software works with some PCBs but it doesnt work with rest.
This lead my suspect towards soldering.
Another behaviour I observed is that the resistance value doesn't remain constant. Once it dropped till 750ohm (it was 10K). Is lead capacitance of PIC creating problems?
The LCD I am using for the project is a custom made for my company by Truly semiconductors, so no specific part no for the same and I can not share that info out of this ........... very sorry :(
The Pin listing goes like this:
Microcontroller LCD
Segx - Segx
x - 0 to 12(except for Seg10 which is not connected)
I am using all the COM pins that also is one-to-one mapped.
Pin no 27 & 28 of mc i.e. Seg14 & Seg13 resp. are pulled down thru a 10K resistor.
Now, I am suspecting the Pin 17&28 connection too :( _________________ Ajit |
|
|
Tadashi Konno
Joined: 15 Jul 2007 Posts: 1
|
ICSP pin (PICkit2) |
Posted: Mon Jul 16, 2007 8:56 am |
|
|
Hi,
I am studying PIC16F917 to controll 7-seg LCD panel.
But I also found flickering screen in LCD segment.
Today , I can erase this flicker !
I have used PICkit2(ICSP) to program PIC .
The Vdd and GND of PIC is supplised from PICkit2
The ICSP use 39 and 40 pins , so these pin share with seg13 and seg14.
There is no flickering screen when Vdd and GND of PIC is supplised from another switching Voltage. |
|
|
deepakomanna
Joined: 06 Mar 2007 Posts: 92 Location: Pune,India
|
vlcden bit..of 16f913 |
Posted: Tue Nov 20, 2007 6:30 am |
|
|
dear sir,
While searching, I found this thread & little bit confused.
in this thread you told to enable VLCDEN bit.
Quote: | #define VLCD_ENABLE 0x10
setup_lcd(LCD_MUX14 | LCD_INTRC | VLCD_ENABLE , 4);
|
But in data sheet they given VLCDEN == 1 after reset.
Also see this thread:
http://www.ccsinfo.com/forum/viewtopic.php?t=25360&highlight=16f913 _________________ Thank You,
With Best Regards,
Deepak. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue Nov 20, 2007 11:52 am |
|
|
Quote: | but in data sheet they given VLCDEN == 1 after reset. |
I'll show you how to check this.
Make a small test program, like this:
Code: |
#include <16F913.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT
#use delay(clock = 4000000)
//======================================
void main()
{
while(1);
} |
Set the Project Options to make the .LST file in Symbolic format.
Then compile the program and look at the .LST file:
Code: |
... void main()
... {
0004: CLRF FSR
0005: BCF STATUS.IRP
0006: MOVLW 1F
0007: ANDWF STATUS,F
0008: BSF STATUS.RP1
0009: CLRF LCDCON // This sets the VLCDEN bit = 0.
000A: CLRF LCDPS
000B: CLRF LCDSEO
000C: CLRF LCDSE1
000D: CLRF 11E
000E: BCF STATUS.RP1
000F: BCF ADCON0.VCFG0
0010: BCF ADCON0.VCFG1
0011: MOVLW 00
0012: BSF STATUS.RP0
0013: MOVWF ANSEL
0014: CLRF CMCON1
0015: MOVLW 07
0016: MOVWF CMCON0
|
Notice that the startup code inserted by the compiler sets the LCDCON
register to 0x00. The VLCDEN bit is in this register. So it is set = 0.
That's why, if you want to use the LCD module, you need to set the
VLCDEN bit = 1.
CCS normally puts in start-up code to turn Port A into a digital port,
and disable the comparator, and in this case, to disable the LCD module.
They want the PIC to start up in a "safe" condition. |
|
|
deepakomanna
Joined: 06 Mar 2007 Posts: 92 Location: Pune,India
|
vlcden bit..of 16f913 |
Posted: Tue Nov 20, 2007 10:45 pm |
|
|
Thats ok,
but ,
http://www.ccsinfo.com/forum/viewtopic.php?t=25360&highlight=16f913
in this you told as,
Quote: | If you look at the pin diagram in the 16F916 data sheet, you'll see that
those pins are shared with the VLCD module. Then if you look at the
LCDCON register description, you'll see that the VLCDEN bit is set = 1
(i.e., it's enabled) after reset. So those pins are not in digital i/o
mode after reset.
Then if you look at the CCS startup code in the .LST file, you'll see
that they don't turn that bit off. They don't change LCDCON at all.
So to turn off that bit, one quick way is to add the line shown in bold,
to your program, below:
#use fast_io(c)
void main()
{
setup_lcd(LCD_DISABLED);
set_tris_c(0);
while(1);
}
|
See bold letters
And in 16f616 & 16f913 not much difference. _________________ Thank You,
With Best Regards,
Deepak. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|