Instant Interrupts and HSERIN


Closed Thread
Results 1 to 27 of 27

Hybrid View

  1. #1
    Join Date
    Feb 2005
    Location
    Essex, UK
    Posts
    94

    Question Instant Interrupts and HSERIN

    Hi,

    I've been struggling with this for around a week so I thought I'd check here to see if anyone's got any pointers.

    I am collecting some data sent once per minute serially at 9600 baud. A startbyte is sent as $FD followed by 6 bytes representing SS:MM:HH DD:MM:YY

    The following code works right at the start of my program
    Code:
    hserin [wait ($FD), str databyte\6]
    but implementing Darrel's Instant Interrupts and the RX_INT I only seem to capture 2 of the bytes of data being the MM and HH so if write:

    Code:
    @   INT_DISABLE  RX_INT                                ; Disable RX Interrupt 
    hserin 100,timeout [databyte(1), databyte(2)]
    @   INT_ENABLE  RX_INT                                 ; Enable RX Interrupt
    @   INT_RETURN
    where timeout just re-enables the RX_INT and then returns. I would have expected the above snippet to save the $FD and then the SS data packet so I'm not sure why it skips these two and saves the MM and HH data bytes


    If I try to capture more than two bytes:

    Code:
    hserin 100,timeout, [databyte(1), databyte(2), databyte(3)]
    the hserin just jumps to timeout every time. I am ONLY enabling RX_INT at the moment so that I could eliminate interference by any other Interrupt but this has made no difference.

    Any help would be greatly appreciated

    Thanks in advance

    Rob
    Last edited by Rob; - 10th March 2008 at 19:47. Reason: Spelling mistake - I blame the keyboard!

  2. #2
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Code:
    @   INT_DISABLE  RX_INT                                ; Disable RX Interrupt 
    hserin 100,timeout [databyte[1], databyte[2]]
    @   INT_ENABLE  RX_INT                                 ; Enable RX Interrupt
    @   INT_RETURN
    Take a quick look around the 1 and 2

  3. #3
    Join Date
    Feb 2005
    Location
    Essex, UK
    Posts
    94


    Did you find this post helpful? Yes | No

    Default Will give it a go

    Quote Originally Posted by skimask View Post
    Code:
    @   INT_DISABLE  RX_INT                                ; Disable RX Interrupt 
    hserin 100,timeout [databyte[1], databyte[2]]
    @   INT_ENABLE  RX_INT                                 ; Enable RX Interrupt
    @   INT_RETURN
    Take a quick look around the 1 and 2
    Hi Skimask,

    thanks for the reply. I will try with square brackets tomorrow. I started using round brackets for array addressing when inside a square bracket statement, like HSERIN, a short while ago after reading a post by Darrel. I will try the square brackets tomorrow and let you know if it makes any difference

    Cheers

    Rob

  4. #4
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Rob View Post
    Hi Skimask,
    thanks for the reply. I will try with square brackets tomorrow. I started using round brackets for array addressing when inside a square bracket statement, like HSERIN, a short while ago after reading a post by Darrel. I will try the square brackets tomorrow and let you know if it makes any difference
    Cheers
    Rob
    I just found that post myself. Weird...
    The ONLY time I use round brackets is when define precedence.

  5. #5
    Join Date
    Feb 2005
    Location
    Essex, UK
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by skimask View Post
    I just found that post myself. Weird...
    The ONLY time I use round brackets is when define precedence.
    Yeah, I thought it was weird myself! I hope it is as simple as this but Darrel's not normally wrong.

    I will update this thread tomorrow - I have to say it's frustrated me more than a rubik's cube!

    Rob

  6. #6
    Join Date
    Feb 2005
    Location
    Essex, UK
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    Oops - my post just crossed with Darrel's - thanks for the replies - I will try your example tomorrow Darrel and see what's occurring (hopefully!)

    Cheers

    Rob
    Last edited by Rob; - 10th March 2008 at 20:40. Reason: Removed Quote

  7. #7
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Yup, Square brackets will cause an error when they are inside other square brackets.

    There's no need to DISABLE/ENABLE inside the handler. An interrupt source can't interrupt itself like it would in ON INTERRUPT.

    But I think what's happening is that the handler is being called multiple times before the rest of the program see's the data.

    As a test, try something like this ...
    Code:
    hserin 100,timeout [databyte(1), databyte(2)]
    @   INT_DISABLE  RX_INT                                ; Disable RX Interrupt 
    @   INT_RETURN
    This should return the first 2 bytes then disable the RX_INT.
    The USART will overflow and stop working after that unless it is re-enabled quickly.

    I'm not saying this is the way to properly receive data in an interrupt.
    It's just a test to help understand what's going wrong.
    <br>
    DT

  8. #8
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by Darrel Taylor View Post
    Yup, Square brackets will cause an error when they are inside other square brackets.
    Obviously, haven't checked all cases, but I've got this line with square-in-square and works ok:
    Code:
    lcdchardata[ lcdcharloop + 1 ] = font [ ( lcdchardata[0] * 5 ) + lcdcharloop ]
    But it's also got a variable inside parenthesis...maybe that's the kicker...

  9. #9
    Join Date
    Jul 2003
    Location
    Colorado Springs
    Posts
    4,959


    Did you find this post helpful? Yes | No

    Default

    Following up on the Square brackets vs Round brackets ...

    I honestly thought it was a PBP problem.
    But with further investigation, I've found it to be a MicroCode Studio problem that only happens during an ICD compile.

    Possibly first discovered by Bruce.
    http://www.picbasic.co.uk/forum/showthread.php?p=23772

    Which means that it only comes into play with HSEROUT/IN statements.

    So I guess it's still a good idea to use Round brackets inside Square brackets, in case you ever plan on using the ICD.
    But it also looks better for the programs that won't.

    HTH,

    EDIT: Good timing ski.
    Last edited by Darrel Taylor; - 10th March 2008 at 23:53. Reason: ski's timing
    DT

  10. #10
    Join Date
    Feb 2005
    Location
    Essex, UK
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    Hi Darrel,

    thanks for your help on this one - it really had me stumped!

    There's no need to DISABLE/ENABLE inside the handler. An interrupt source can't interrupt itself like it would in ON INTERRUPT.
    Cool - I didn't realise that!


    But I think what's happening is that the handler is being called multiple times before the rest of the program see's the data.

    As a test, try something like this ...
    Code:
    hserin 100,timeout [databyte(1), databyte(2)]
    @   INT_DISABLE  RX_INT                                ; Disable RX Interrupt 
    @   INT_RETURN
    This should return the first 2 bytes then disable the RX_INT.
    The USART will overflow and stop working after that unless it is re-enabled quickly.
    I have tried what you asked me to above and it works every time! I've got it capturing all the bytes now by:
    Code:
    hserin 100,timeout, [databyte(0), databyte(0), databyte(1), databyte(2), databyte(3), databyte(4), databyte(5)]
    @   INT_DISABLE  RX_INT
    (the duplicate; databyte(0), databyte(0), just removes the $FD as I don't need it)


    I'm not saying this is the way to properly receive data in an interrupt.
    It's just a test to help understand what's going wrong.
    <br>
    I'm now trying to re-enable the interrupt at some point after the data has been read by the rest of the program but it's not working at the moment. I will keep trying and update this thread later.

    Cheers to all

    Rob

  11. #11
    Join Date
    Feb 2005
    Location
    Essex, UK
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    Right, I was definitely being stupid!

    There were actually 8 bytes of data being sent (the colons aren't sent nor are the spaces or slashes);

    $FD SS:MM:HH DD/MM/YYYY

    This meant that RCIF was being set again by the extra YY before I was doing anything with the data in my program. Thanks very much Darrel, I wouldn't have found this if you hadn't pointed me in the right direction.


    Darrel, this is for a small project for my work and I was wondering if you would allow me to include your code in the finished item please? I know you've said to people in the past that they could but I thought I had better ask out of courtesy. I know you say keep the internet free, but obviously hosting your webpage costs YOU money so I wondered if you had anywhere to donate to help with these costs? I can't find anywhere on your webpage.

    Cheers

    Rob

Similar Threads

  1. Hserin with Instant Interrupts.
    By ronjodu in forum Serial
    Replies: 17
    Last Post: - 30th December 2014, 20:17
  2. HSerin problems on power up
    By Luckyborg in forum Serial
    Replies: 8
    Last Post: - 21st April 2009, 19:49
  3. TMR0 interrupt and HSERIN
    By boban in forum mel PIC BASIC Pro
    Replies: 2
    Last Post: - 2nd September 2008, 11:48
  4. Usbin and hserin
    By mpardinho in forum mel PIC BASIC Pro
    Replies: 0
    Last Post: - 27th October 2007, 15:26
  5. HserIn and Interrupts
    By rwskinner in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 5th December 2006, 07:15

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts