|
|
View previous topic :: View next topic |
Author |
Message |
mars79
Joined: 19 Jun 2013 Posts: 6 Location: Bulgaria, Plovdiv
|
Problem with PIC16f886 and 16x2 Lcd |
Posted: Wed Jun 19, 2013 1:37 am |
|
|
Hello everyone. I read some similar topics in the forum but I could not find solution to my problem. Use 4-bit mode.
For some time I have a problem with the operation of this display. Sometimes it is activated without a problem sometimes shows squares on the first row and nothing else.
The display driver using flex lcd. Define pins as follows:
Code: | #define LCD_DB4 PIN_B3
#define LCD_DB5 PIN_B2
#define LCD_DB6 PIN_B1
#define LCD_DB7 PIN_B0
#define LCD_E PIN_B5
#define LCD_RS PIN_B7
//#define LCD_RW PIN_B6
//#define USE_LCD_RW 1
|
This is the program:
Code: | #include <16F886.H>
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP, NOMCLR
#use delay(clock = 4000000)
#include "Flex_LCD.c"
//============================
void main()
{
setup_adc_ports(NO_ANALOGS);
setup_comparator(NC_NC_NC_NC);
lcd_init(); // Initialize the LCD
lcd_putc("\fLine 1");
lcd_putc("\nLine 2");
while(1);
} |
This is the connection diagram:
Thanks! |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9245 Location: Greensville,Ontario
|
|
Posted: Wed Jun 19, 2013 5:36 am |
|
|
Please add
delay_ms(1000);
before and after the
lcd_init();
line.
The first delay of 1 second allows the LCD module to 'powerup' correctly.
They require this time to 'get organized'(it's a spec often overlooked).
The second delay allows the lcd_init() to 'configure' the LCD_module.
The module needs a little bit of time to reconfigure from 8bit mode to 4bit.
You should be able to reduce the delays to less than 500ms.All LCD modules have different 'powerup' and 'write' times, so I start with 1 second and confirm they work THEN reduce if I can.
Most will work with 500/250 timings.
hth
jay |
|
|
RF_Developer
Joined: 07 Feb 2011 Posts: 839
|
|
Posted: Wed Jun 19, 2013 7:52 am |
|
|
How are you programming this? What debugger/programmer are you using? I ask because you've used ICSP programming pins for general IO, so you can't do any in-circuit debugging. Then again, clearly a LCD display and a PIC on their own isn't going to be able to do very much, so what about the other connections that you will need at sometime to make this do anything useful?
Also, you've not connected MCLR to anything so if this really is your circuit then it will stop and restart at more or less anytime it feels like it due to noise.
Then again, where is the decoupling?
All this is basic hardware stuff and should be sorted out before going any further. And in-circuit debugging really is useful. I always make sure I can debug in-circuit. |
|
|
oxo
Joined: 13 Nov 2012 Posts: 219 Location: France
|
|
Posted: Wed Jun 19, 2013 8:05 am |
|
|
RF_Developer wrote: | How are you programming this? What debugger/programmer are you using? I ask because you've used ICSP programming pins for general IO, so you can't do any in-circuit debugging. Then again, clearly a LCD display and a PIC on their own isn't going to be able to do very much, so what about the other connections that you will need at sometime to make this do anything useful?
Also, you've not connected MCLR to anything so if this really is your circuit then it will stop and restart at more or less anytime it feels like it due to noise.
Then again, where is the decoupling?
All this is basic hardware stuff and should be sorted out before going any further. And in-circuit debugging really is useful. I always make sure I can debug in-circuit. |
He has #fuses NOMCLR |
|
|
mars79
Joined: 19 Jun 2013 Posts: 6 Location: Bulgaria, Plovdiv
|
|
Posted: Wed Jun 19, 2013 10:32 am |
|
|
This is the wiring diagram that I made today. The problem came after I changed the board. Before I used the pin RB5 for RS and RB4 for E. I also had an external reset and then pushing his programs work. A moment ago I made the following change: RS to RB5 and E to RB4. Also changed the program:
Code: |
#include <16F886.H>
#Fuses XT, NOWDT, PUT, NOMCLR, NOBROWNOUT, NOLVP, NOPROTECT
#use delay(clock = 4000000)
#include "Flex_LCD.c"
#byte pA =0xFF
#byte pB =0
#byte pC =0
#byte pE =0xFF
VOID MAIN (VOID)
{
setup_adc_ports(NO_ANALOGS);
setup_comparator(NC_NC_NC_NC);
lcd_init();
delay_ms(150);
printf(lcd_putc,"\fTest");
do {
}while(1);
}
|
also made the changes in flex_lcd.c
... and everything works.
Thanks for your help! |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
|
mars79
Joined: 19 Jun 2013 Posts: 6 Location: Bulgaria, Plovdiv
|
|
Posted: Thu Jun 20, 2013 12:42 am |
|
|
Thanks for the useful information! I do not have much experience with CCS compiler. More I worked with Mikroc.
The program is uart communication between microcontroller and bluetooth module.
I do not know whether I should use:
Code: |
porta = 0;
portb = 0;
portc = 0;
porte = 0;
|
after:
Code: |
Set_tris_a(0b00000001);
Set_tris_b(0b00000000);
Set_tris_c(0b10000000);
Set_tris_e(0b11111111);
|
This is the code:
Code: |
#include <16f886.h>
#Fuses XT, NOWDT, PUT, NOMCLR, NOBROWNOUT, NOLVP, NOPROTECT
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,FORCE_SW,bits=8,parity=N,TIMEOUT=300,STOP=1)
#include "flex_lcd.c"
#byte porta = getenv("SFR:PORTA")
#byte portb = getenv("SFR:PORTB")
#byte portc = getenv("SFR:PORTC")
#byte porte = getenv("SFR:PORTE")
int reply;
VOID MAIN (VOID)
{
Set_tris_a(0b00000001);
Set_tris_b(0b00000000);
Set_tris_c(0b10000000);
Set_tris_e(0b11111111);
delay_ms(150);
setup_adc_ports(NO_ANALOGS);
setup_comparator(NC_NC_NC_NC);
lcd_init();
delay_ms(150);
do{
putc( "...a request" );
reply = getc();
printf(lcd_putc,"\f", reply);
delay_ms(50);
}while (true);
}
|
|
|
|
|
|
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
|