|
|
View previous topic :: View next topic |
Author |
Message |
Ventouza
Joined: 21 Apr 2014 Posts: 12 Location: Kefalonia, Greece
|
16f628a + lcd |
Posted: Sat Sep 24, 2016 11:54 am |
|
|
Hi there,
I'm trying to display a string into the lcd2x16 via Bluetooth HC-06. I use the pic 16f628a and the compiler version 5.008. But i have no success. Here is the code:
Code: | #include "16f628a.h"
#INCLUDE <stdlib.h>
#fuses XT, NOWDT, NOPROTECT
#use delay (clock=4000000)
#include "flex_lcd.c"
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1,bits=8)
char input_str[10];
void main ()
{
lcd_init();
while (True)
{
gets(input_str);
lcd_gotoxy(1,1);
printf(lcd_putc,"%s",input_str);
}
} |
Can you help me? |
|
|
guy
Joined: 21 Oct 2005 Posts: 297
|
|
Posted: Sat Sep 24, 2016 12:47 pm |
|
|
Hi!
Here are some tips:
First divide the system into 2. Does the receiver receive the data? If you don't have a 'scope or logic analyzer a crude way is to send a string every 1 second and place a digital voltmeter on the receiving side. It should show a slight change every second.
Next check that you are using correct voltages. If you use a Bluetooth module I assume you use 3.3V. Does the LCD also work with 3.3V ?
What is flex_lcd.c ?
How about trying to receive characters instead of strings, and see if you are getting ANYTHING? |
|
|
Ventouza
Joined: 21 Apr 2014 Posts: 12 Location: Kefalonia, Greece
|
|
Posted: Sat Sep 24, 2016 1:24 pm |
|
|
Yes the system works i think because if i change the follow
Code: |
char input_str[10]; -> char input_str;
gets(input_str); -> input_str = getc();
printf(lcd_putc,"%s", input_str); -> printf(lcd_putc,"%c", input_str);
|
Now with these changes if i send a character from my phone the lcd displays the character.
The flex_lcd is thishttps://www.ccsinfo.com/forum/viewtopic.php?t=24661. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Sep 24, 2016 3:48 pm |
|
|
What are the exact keys that you are typing into gets() ? List them all. |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9241 Location: Greensville,Ontario
|
|
Posted: Sat Sep 24, 2016 4:11 pm |
|
|
from the CCS manual...
GETS().....Reads characters (using getc()) into the string until a RETURN (value 13) is encountered. The string is terminated with a 0.
I betting whatever is sending the 'string' to the PIC is NOT sending a RETURN ( value 13) so the GETS function is never fulfilled ??
Jay |
|
|
Ventouza
Joined: 21 Apr 2014 Posts: 12 Location: Kefalonia, Greece
|
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9241 Location: Greensville,Ontario
|
|
Posted: Sat Sep 24, 2016 4:52 pm |
|
|
Modify your simple program to send a 13 ( that's decimal 13 NOT 0x13 BTW) as the LAST character of the 'string'.
Most, if not all 'terminal programs' have an option to to this.
Jay |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Sep 24, 2016 5:10 pm |
|
|
Your link doesn't work. It says:
Quote: |
You are not logged in or do not have permission to access this page.
This may be due to one of the following reasons: |
How to post an image on the CCS forum:
Go to this website: http://postimage.org/
Upload your image. Select family safe. Then click the first button for
"Hotlink to Forum" to get a link to the image.
Then go to the CCS forum and type Ctrl-V to paste the link into a post.
If postimage.org doesn't work in your country, then use Google to find
another free image hosting site for forums. |
|
|
Ventouza
Joined: 21 Apr 2014 Posts: 12 Location: Kefalonia, Greece
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Sep 24, 2016 8:39 pm |
|
|
I'm not familiar with that program, but it looks like you should be able
to append a carriage return byte (13 or 0x0D) to the slider text that
is sent out. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19537
|
|
Posted: Sun Sep 25, 2016 3:44 am |
|
|
As a general slightly further comment, gets, is a routine that can have very significant problems.
As you have already had pointed out, it 'needs' the line feed terminator, but worse than this, there is no form of limiting to deal with this not arriving. If you have a 'receive' space set up to take 16 characters, and then somebody types 20, the code will keep writing into places it shouldn't, and overwrite other variables. Ugh...
There is a slightly 'improved' version of gets, which ensures that if a user just keeps typing, it'll exit anyway when the end of space is reached, called 'get_string', supplied in input.c.
So:
Code: |
#include "16f628a.h"
#fuses XT, NOWDT, NOPROTECT
#use delay (clock=4000000)
#use rs232(UART1, baud=9600, parity=N, bits=8, ERRORS)
//end of chip setup
#INCLUDE <stdlib.h>
#include <input.c>
#include "flex_lcd.c"
//end of includes
char input_str[10];
void main (void)
{
delay_ms(500);
lcd_init();
while (TRUE)
{
get_string(input_str, strlen(input_str));
lcd_gotoxy(1,1);
printf(lcd_putc,"%s",input_str);
}
}
|
Generally you should avoid using gets, except for 'fixed length' strings, where you know that there should be a line feed automatically send by the code at the other end. Otherwise it is potentially a very dangerous tool.
As another comment, don't include things till _after_ the chip is set-up. Look at the order I have used. Some functions in the libraries _require_ parts of the chip configuration to be finished first. The compiler has got better at dealing with this on recent versions (it treats the fuse, and clock lines as if they has a #PRAGMA), but it is still safer to endure that everything is configured before loading other code.
Then, if using the hardware UART, you should always have 'ERRORS' in the #USE RS232. It should only be omitted, if _you_ are adding your own code to handle errors. The errors do need handling (or the UART can become locked). Note also how I have just used the UART name (this is a 'shorthand' saying to select the UART pins, and use the hardware UART - this syntax is 'required' on later chips with selectable pins - on these you select the pins, then tell the code to talk to the already setup UART), so it is easier and safer to get into the habit of using this...
Finally, I have added a delay before initialising the LCD. Most PIC's start to wake up before LCD's do. Many will not work reliably is you try to wake them immediately the PIC wakes. Much better to have a little pause. Lcd_init has a small pause but for something in excess of perhaps 75% of LCD's/PIC's....
As an 'extra' comment, 5.008, was still a little bit 'beta'. Not like the early V4 compilers where a lot didn't work, but you will find if you start to write more complex code, that there are things in this compiler that do not function correctly.... |
|
|
Ventouza
Joined: 21 Apr 2014 Posts: 12 Location: Kefalonia, Greece
|
|
Posted: Sun Sep 25, 2016 8:15 am |
|
|
PCM programmer wrote: | I'm not familiar with that program, but it looks like you should be able
to append a carriage return byte (13 or 0x0D) to the slider text that
is sent out. |
Thanks PCM Programmer i add into the phone program to send a return byte and now the display print the string. |
|
|
Ventouza
Joined: 21 Apr 2014 Posts: 12 Location: Kefalonia, Greece
|
|
Posted: Sun Sep 25, 2016 8:27 am |
|
|
Ttelmah wrote: | As a general slightly further comment, gets, is a routine that can have very significant problems.
As you have already had pointed out, it 'needs' the line feed terminator, but worse than this, there is no form of limiting to deal with this not arriving. If you have a 'receive' space set up to take 16 characters, and then somebody types 20, the code will keep writing into places it shouldn't, and overwrite other variables. Ugh...
There is a slightly 'improved' version of gets, which ensures that if a user just keeps typing, it'll exit anyway when the end of space is reached, called 'get_string', supplied in input.c.
So:
Code: |
#include "16f628a.h"
#fuses XT, NOWDT, NOPROTECT
#use delay (clock=4000000)
#use rs232(UART1, baud=9600, parity=N, bits=8, ERRORS)
//end of chip setup
#INCLUDE <stdlib.h>
#include <input.c>
#include "flex_lcd.c"
//end of includes
char input_str[10];
void main (void)
{
delay_ms(500);
lcd_init();
while (TRUE)
{
get_string(input_str, strlen(input_str));
lcd_gotoxy(1,1);
printf(lcd_putc,"%s",input_str);
}
}
|
Generally you should avoid using gets, except for 'fixed length' strings, where you know that there should be a line feed automatically send by the code at the other end. Otherwise it is potentially a very dangerous tool.
As another comment, don't include things till _after_ the chip is set-up. Look at the order I have used. Some functions in the libraries _require_ parts of the chip configuration to be finished first. The compiler has got better at dealing with this on recent versions (it treats the fuse, and clock lines as if they has a #PRAGMA), but it is still safer to endure that everything is configured before loading other code.
Then, if using the hardware UART, you should always have 'ERRORS' in the #USE RS232. It should only be omitted, if _you_ are adding your own code to handle errors. The errors do need handling (or the UART can become locked). Note also how I have just used the UART name (this is a 'shorthand' saying to select the UART pins, and use the hardware UART - this syntax is 'required' on later chips with selectable pins - on these you select the pins, then tell the code to talk to the already setup UART), so it is easier and safer to get into the habit of using this...
Finally, I have added a delay before initialising the LCD. Most PIC's start to wake up before LCD's do. Many will not work reliably is you try to wake them immediately the PIC wakes. Much better to have a little pause. Lcd_init has a small pause but for something in excess of perhaps 75% of LCD's/PIC's....
As an 'extra' comment, 5.008, was still a little bit 'beta'. Not like the early V4 compilers where a lot didn't work, but you will find if you start to write more complex code, that there are things in this compiler that do not function correctly.... |
Thanks Ttelmah for your reply and for your tips. I'm gonna keep your routine and i build my program base on your tips and your upgrade routine. |
|
|
|
|
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
|