CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

Using Printf to RS232/LCD display

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Anobium



Joined: 05 Jun 2012
Posts: 4

View user's profile Send private message

Using Printf to RS232/LCD display
PostPosted: Sun Jun 10, 2012 5:55 am     Reply with quote

I am new to the software, so, for this first posting be patience....

16F88 (the primary PIC) connected to a LCD driver PIC (also 16F88) using RS232, this PIC is then connected to the LCD driver (6 wire connection). The LCD driver is based on the good work in 'flex_lcd.c'. I am running the 16F88 at max freq.

The flex_lcd.c works very well. Thank you.

Background. The primary PIC operates via RS232 to the LCD driver, this enables me to use EEPROM stored messages, and lots of additional functionality with the modified flex_lcd driver.

My issue. When I use 'printf' I get data overruns in the LCD driver pic, the example below does not display correctly on the LCD.
Code:

printf("%c,%cReset",254,1);

This code does work correct on the LCD. (I have used this method to demonstrate/show the issue... this is NOT my function!)
Code:

printf("%c",254);delay_ms(1);
printf("%c",1);delay_ms(3);
printf("R");delay_ms(1);
printf("e");;delay_ms(1);
printf("s");;delay_ms(1);
printf("e");;delay_ms(1);
printf("t");;delay_ms(1);


To prevent the overruns I have created a function, where I have a delay of 2ms between each character - this give the LCD driver and the LCD to work correctly.

What are my options? Can I change the intercharacter timing of the printf? Stick with my function?

I want to use printf... it is the easy option.

Any thoughts?
ezflyr



Joined: 25 Oct 2010
Posts: 1019
Location: Tewksbury, MA

View user's profile Send private message

PostPosted: Sun Jun 10, 2012 9:37 am     Reply with quote

Hi,

Using printf to send diagnostic messages from your code is a totally standard practice, and I've been doing it for years. I'm 100% sure that the problem is in the code you are using to receive and display the data, so please post that code. Make sure you post a complete, compilable example of what you are currently using.

Also, before we dig into this, are we talking "real" hardware, or a Proteus simulation?

John
Ttelmah



Joined: 11 Mar 2010
Posts: 19539

View user's profile Send private message

PostPosted: Sun Jun 10, 2012 10:32 am     Reply with quote

Keyword _modified_.
Flex LCD, depending on whether you use the read/write line or not, _always_ either waits longer than a byte will take to write, or tests for the LCD being busy. It won't return until it has written the character to the display. I'd guess one of the modifications has either removed the read status functionality, or has shortened one of the critical delays.

Best Wishes
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sun Jun 10, 2012 11:53 am     Reply with quote

I think the problem is that he has two PICs. One is essentially the same
as the Seetron "Backpack" PIC, which turns an ordinary 2x16 LCD into a
serial LCD.

So I believe his problem is that:

1. He probably doesn't have an interrupt-driven receive fifo buffer
in the LCD PIC (similar to Ex_Sisr.c). Therefore he easily overruns
the 2-byte receive buffer in the UART and loses commands.

2. He doesn't have any handshaking between the master PIC and the
LCD PIC. So he overruns the buffer and loses commands when the
LCD can't respond to commands as quickly as he sends them.
Anobium



Joined: 05 Jun 2012
Posts: 4

View user's profile Send private message

PostPosted: Sun Jun 10, 2012 1:10 pm     Reply with quote

@ezflyr. It is real hardware not a sim. However, it does works fine within a sim. :-)

@Ttelmah. Great points. I have do have R/W disconnected. The flex_lcd code has an option to not use R/W. I have revert the code shown below and make the appropiate connection.
Code:
// #define USE_LCD_RW   1 


@PCM programmer. I am stunned. You are good.

I have not come acros the Seetron "Backpack" PIC but I have now. I have just build the same using a 16F88. My solution, of course, uses the same protocols but it would as the LCD have the same control set. The version I have also supports the FLEX_CD control controls plus direct control of the A1/A2 & A3 ports as I need to control these ports.

Now you mention the Seetron... I guess this has been done before using CCS?

I do not have an interrupt-driven receive fifo buffer. But, I can understand the principles. Via interrupts load a buffer with a buffer pointer and then consume the buffer in slow order which would resolve the loss of data stream issue.

Does this code exist? How should I look for code?

Re handshaking. Again, you correct. None. I am using a single serial connection (plus 0V) between the devices. Any thoughts?

Last thought... I am currently running at 9600, I want to get to the faster speed possible. 2400 is a tad to slow!

I am grateful for the response. I am most grateful as I am changing my project from a Picaxe solution, and, I have hunted around for a long time for a good compiler/IDE and a great user forum - I hope this is the right group.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sun Jun 10, 2012 7:54 pm     Reply with quote

Quote:

I do not have an interrupt-driven receive fifo buffer.
Does this code exist? How should I look for code?

Look in this directory:
Quote:

c:\program files\picc\examples\ex_sisr.c

For best results, make the buffer size be a power of 2.
Example: 64
Anobium



Joined: 05 Jun 2012
Posts: 4

View user's profile Send private message

PostPosted: Tue Jun 12, 2012 3:38 am     Reply with quote

A few follow-on questions.

A) When using ex_sisr.c I am assuming that the interrupt routine is only executed when the 16f88 hardware UART is in use. Is this correct?

B) When using ex_sisr.c I am assuming that the interrupt routine is NOT executed when the 16f88 FORCE_SW UART option is in use. Is this correct?

C) As the FORCE_SW option uses software to drive the comms protocol why does this the software comms protocol support not interrupts?
Ttelmah



Joined: 11 Mar 2010
Posts: 19539

View user's profile Send private message

PostPosted: Fri Jun 15, 2012 2:59 pm     Reply with quote

Because the hardware is needed to generate the interrupt.......

As a reply to your other question, trying to use the timer to handle this:

It is never going to work.
At 9600bps, a 'bit', is just 104uSec long. You _must_ sample within a relatively small percentage of the centre of this. So your allowable sampling error, is probably something like +/-20uSec. Your interrupt at 8MHz, is called every 128uSec. Long enough to completely miss a bit, let alone miss the centre. There is just not time to do this like this. To have any hope, your timer interrupt would have to be being called perhaps every 30uSec, and at 8MHz, this is just 60 instructions. Since it takes about 60 instructions to get into and out of an interrupt, nothing else would work at all....
You could potentially get this to perhaps work, by using the hardware EXT_INT pin instead, and triggering the receive code (with 'sample early' selected), in this interrupt. However it is still not a great solution.
Best, by a factor of perhaps 1000000*, is to redesign your hardware so you can use the hardware UART, or add an external UART, perhaps using I2C.

Best Wishes
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
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