1. Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.
    Dismiss Notice

How does one achieve a high baud rate on a micro with an LCD attached?

Discussion in 'Microcontrollers' started by mik3ca, Dec 3, 2017.

  1. mik3ca

    mik3ca Member

    Joined:
    Jun 24, 2017
    Messages:
    376
    Likes:
    1
    I'm making an application that communicates to the world wirelessly over a UART. specifically, I'm using the HM-TRP module with an AT89C4051 micro with a 22Mhz clock and an LCD.

    I'm trying to run the module at 38Kbps and have the results show in 16-byte fragments on an LCD. I tested the modules in other setups and they work correctly, but when I'm trying to record real-time data and display it on the LCD, I run into trouble.

    The best case I had was using a fixed (non-ring) buffer for both transmission and reception, but that caused loss of characters (particularly when printing characters on the LCD). I tried storing a character in the buffer until the buffer has 16 received characters then I disable the reception until I spit them all out on the LCD and start the buffer all over again and re-enable reception.

    I feel that between the buffering, I'm losing characters because what happens in between is that I print the characters to the LCD all at once. This means roughly 57uS per LCD write times 16 = ~900uS. Each byte at 38Kbps takes around 200uS So every now and then I lose a character.

    I was thinking of lowering my buffer size but is that a good idea? I want to avoid lowering the baud rate.
     
  2. Pommie

    Pommie Well-Known Member Most Helpful Member

    Joined:
    Mar 18, 2005
    Messages:
    10,566
    Likes:
    394
    Location:
    Brisbane Australia
    I do all RS232 send and receive using fifo buffers and interrupts.

    Why do you need to write the whole display for every byte received?

    Why can't you send a "frame" 50 times per second therefore knowing that you have time to write to the LCD after the frame is received?

    Mike.
     
  3. Nigel Goodwin

    Nigel Goodwin Super Moderator Most Helpful Member

    Joined:
    Nov 17, 2003
    Messages:
    39,505
    Likes:
    683
    Location:
    Derbyshire, UK
    If the data is coming faster than you can display, then you need to either buffer it (which only helps if it's not continuous), or use handshaking to pause it.

    A lot really depends on what your data is, and how often it's sent.
     
  4. dave miyares

    Dave New Member

    Joined:
    Jan 12, 1997
    Messages:
    2
    Likes:
    -10


     
  5. Ian Rogers

    Ian Rogers User Extraordinaire Forum Supporter Most Helpful Member

    Joined:
    Mar 28, 2011
    Messages:
    9,673
    Likes:
    947
    Location:
    Rochdale UK
    My first thought!! I have recently dabbled in Modbus RTU where data transmission is required every 100mS..

    To prepare the packet, grab data, process data and display data meant no time left.. Here we A) need to go to a faster MPU or B) slow down transmission..

    If the data is being shifted this fast, then how is it being displayed? You wouldn't see the changing data, the screen update will be too fast for the human eye..

    If you need to see real time data, then you need to "graph" the results or log into a large file so the end user can view the results.. How many packets a second are you sending? ( mirroring Nigels question )
     
  6. mik3ca

    mik3ca Member

    Joined:
    Jun 24, 2017
    Messages:
    376
    Likes:
    1
    I am buffering data. I set it so that when 8 bytes are received they are copied to user space. On the micro, that whole copy procedure takes likes roughly 50 uS. I also made it where commands to the LCD don't consume so much time but that didn't help.

    What I did notice is that data reception on the micro side is rather slow. I can tell by the lights on the HM-TRP module. I even tried sending data super slow to the micro wirelessly (at say 1 byte every 1.5 seconds) and still, the HM-TRP module couldn't pick up every character on the micro side yet both modules are roughly 12 inches apart with no obstacles in-between so reception can't be an issue?

    I wonder if there is a setting on the HM-TRP module itself that needs optimizing
     
  7. Pommie

    Pommie Well-Known Member Most Helpful Member

    Joined:
    Mar 18, 2005
    Messages:
    10,566
    Likes:
    394
    Location:
    Brisbane Australia
    Sounds like you have interference. Send your data as packages with a checksum so you can discard corrupt packages.

    Mike.
     
  8. dave miyares

    Dave New Member

    Joined:
    Jan 12, 1997
    Messages:
    2
    Likes:
    -10


     
  9. Ian Rogers

    Ian Rogers User Extraordinaire Forum Supporter Most Helpful Member

    Joined:
    Mar 28, 2011
    Messages:
    9,673
    Likes:
    947
    Location:
    Rochdale UK
    You are not putting the module to sleep are you??
     
  10. ronsimpson

    ronsimpson Well-Known Member Most Helpful Member

    Joined:
    Apr 17, 2007
    Messages:
    7,790
    Likes:
    1,049
    Location:
    Loveland, CO USA
    Now that we know there is "RF" involved, we can work on trouble shooting that.
    Sounds like your software is not the problem.
     
  11. mik3ca

    mik3ca Member

    Joined:
    Jun 24, 2017
    Messages:
    376
    Likes:
    1
    The modules are always in enable mode.

    Based on research, I may have incorrect settngs for frequency deviation or receiving bandwidth, but then I wonder if maximum transmission power to my nearby receiver causes a bad effect.

    When I tried 10Khz deviation The results were substantially worse, so I moved that setting now to 160Khz. I couldn't remember the receive bandwidth setting I used, but I think I selected the max of 620Khz. The minimum is 30Khz

    Now maybe someone is right... because of such large numbers chosen, I'm picking up computer noise.

    Is there a way to calculate optimal values for the above settings for the data rate 38.4kbps?
     
  12. mik3ca

    mik3ca Member

    Joined:
    Jun 24, 2017
    Messages:
    376
    Likes:
    1
    Ok, so I looked at a bunch of code. On http://www.atmel.com/Images/doc4346.pdf, their routine for receiving a byte is like the following:

    Code (text):

    ;get serial data AFTER clearing serial reception flag
    start of ISR:
       clr RI
       mov A,SBUF
     
    Other sites do this:

    Code (text):

    ;get serial data BEFORE clearing serial reception flag
    start of ISR:
       mov A,SBUF
       clr RI
     
    But my code starts as follows (note two sections):

    Code (text):

    ;clear reception flag ASAP
    start of ISR:
    jbc RI,ISR_CONTD
    end_ISR:
     
    ISR_CONTD:
       mov A,SBUF
    sjmp end_ISR
     
    But something makes me thing the order of clearing the receive flag and receiving one byte does not matter provided that everything is done within one bit time (of 260uS at 38400bps if my calculation is right). I calculated the worst case scenario for my interrupts and that clocks in around 40uS so I should still have another 220uS headroom before RI can change by the micro right?

    If my theory here is right, then something is going on with the radios themselves
     
  13. Beau Schwabe

    Beau Schwabe Member

    Joined:
    Jun 4, 2017
    Messages:
    101
    Likes:
    8
  14. Pommie

    Pommie Well-Known Member Most Helpful Member

    Joined:
    Mar 18, 2005
    Messages:
    10,566
    Likes:
    394
    Location:
    Brisbane Australia
    If you clear the flag before reading the byte it may occasionally get overwritten.

    Mike.
     
  15. mik3ca

    mik3ca Member

    Joined:
    Jun 24, 2017
    Messages:
    376
    Likes:
    1
    Beau, I have already done the programming on the HM-TRP.

    You mean the incoming data may get overwritten, or just the flag status itself?
    I'm trying to understand exactly what happens to SBUF and RI behind the scenes
     
  16. Beau Schwabe

    Beau Schwabe Member

    Joined:
    Jun 4, 2017
    Messages:
    101
    Likes:
    8
    Let me ask you this ... Does the communication work as expected if you have a direct connection? IOW if you bypass the RF.
    Another question are you implementing any kind of checksum on your data. If not, it may not be a bad ides to do so. I do this with direct connections all the time between a touch screen display and a micro controller and it's a direct connection. Another thing that might help is to pause just a little bit after every data packet. Asynchronous serial communication has the potential for framing errors if the transmitter and receiver do not sync properly or are sent back-to-back without any delays.

    Edit: The checksum does not need to be complex, a simple BYTE by BYTE XOR is usually enough and simple to decode on both ends.
     
  17. mik3ca

    mik3ca Member

    Joined:
    Jun 24, 2017
    Messages:
    376
    Likes:
    1
    something is weird now. I hooked up TX to RX and RX to TX using jumper leads and half the data being transferred in both directions turn up as corrupted.

    What I did notice with the modules in place is that sending data to the pc is fine and the PC can read it but when sending it to the micro, the micro occassionally skips some characters and this is shown on the receiving module (light blinks slower)

    I will later. Right now I want the modules to work.

    Im using 47nF for decoupling caps. I'm gonna up those values and see if that makes a difference.
     
  18. mik3ca

    mik3ca Member

    Joined:
    Jun 24, 2017
    Messages:
    376
    Likes:
    1
    Ok, I did increase the caps around the LM117-3.3 regulator that powers the radio from two 47nF's to 47uF and 220uF and I noticed significant improvements in data flow, so now my errors are maybe 1 in every 1000 or so bytes as opposed to 1 every 50. I wonder if I should increase the caps more because something makes me think these radio modules suck up alot of power when trying to receive data.
     
  19. Pommie

    Pommie Well-Known Member Most Helpful Member

    Joined:
    Mar 18, 2005
    Messages:
    10,566
    Likes:
    394
    Location:
    Brisbane Australia
    You should have both electrolytic and ceramic capacitors before and after the regulator.

    Mike,
     
  20. mik3ca

    mik3ca Member

    Joined:
    Jun 24, 2017
    Messages:
    376
    Likes:
    1
    Today the errors went up. I'm predicting radio interference. there were people working nearby at the time that may had radio equipment. I should probably use 115200bps speed and have the transmitter transmit the same data 4 times in hopes the receiver can receive it correctly at least 1 of the 4 times. Now I'm wondering if that is guaranteed to work in a noisy environment.
     

Share This Page