SERIN Timeout


Closed Thread
Results 1 to 16 of 16

Thread: SERIN Timeout

  1. #1
    Join Date
    Oct 2005
    Location
    New Zealand
    Posts
    171

    Default SERIN Timeout

    I'm trying to write some code for a receiver which really was just going to be a timing loop - the sender unit sends time and an on or off, the receiver then should start counting down the time if the sender has told it to run - so I was going to do a timeout and a small timing loop outside of the SERIN command - however it seems the timeout isn't working - prolly due to the fact the input from the RF module is constantly sending noise down the line.

    I think my only other way is to interupt out using a timer - but not realy sure how to do it and I have a bit of a phobia about interupts - have done quite a bit of searching on here but still find it a bit of a struggle to understand what everything means -

    Does anyone know a simple way I can do what I'm trying to achieve?

    Thanks

    @ DEVICE PIC16F676, INTRC_OSC_NOCLKOUT, MCLR_OFF, PROTECT_OFF, BOD_ON, CPD_OFF


    Define OSCCAL_1K 1
    DEFINE OSC 4

    TRISA = %001000
    TRISC = %000000


    ANSEL = 0 'disable analog
    T1CON = %00000100
    VRCON = 0 ' A/D Voltage reference disabled
    CMCON = 7 'Disable comparitor

    timesw var PortA.5
    gosw var PortA.3
    stopsw var PortA.4
    timeset var byte
    display var byte
    'time var word
    b0 var byte
    b1 var bit
    b2 var byte

    clear
    timeset = 1
    PortA = 0
    PortC = 0

    Begin: 'start sequence

    display = (1 << b0) - 1
    PORTC = display
    pause 100
    if b0 < 7 then
    b0 = b0 + 1
    goto begin
    Else
    Pause 1000
    b0 = 0
    portC = b0
    Endif

    Start:

    serin PORTA.3,0,100,time,["READY"],timeset,b1 'Read receiver
    gosub disply

    time:
    b2 = b2 + 1
    if b2 > 200 and timeset > 0 and b1 = 1 then
    timeset = timeset - 1
    b2 = 0
    endif
    if timeset = 0 then b1 = 0
    goto start




    disply:

    display = (1 << timeset) 'Set display to be bar type
    PORTC = display 'output LEDs
    PORTA.0 = b1

    return

  2. #2
    Join Date
    Sep 2006
    Location
    Venezuela - Caracas
    Posts
    48


    Did you find this post helpful? Yes | No

    Default

    Code:
    Start:
    
    serin PORTA.3,0,100,time,["READY"],timeset,b1 'Read receiver
    gosub disply
    
    time:
    b2 = b2 + 1
    if b2 > 200 and timeset > 0 and b1 = 1 then
    timeset = timeset - 1
    b2 = 0
    endif
    if timeset = 0 then b1 = 0
    goto start


    try

    Start:

    'serin PORTA.3,0,100,time,["READY"],timeset,b1 'Read receiver
    serin PORTA.3, 0, 100, time, next, ["READY"], timeset, b1 'Read receiver
    gosub disply

    time:
    b2 = b2 + 1
    if b2 > 200 and timeset > 0 and b1 = 1 then
    timeset = timeset - 1
    b2 = 0
    endif
    if timeset = 0 then b1 = 0

    next:
    goto start

  3. #3
    Join Date
    Oct 2005
    Location
    New Zealand
    Posts
    171


    Did you find this post helpful? Yes | No

    Default

    Thanks - but even with the next renamed (cos next is a reserved word) it comes up with compilation errors cos there are 3 things on the timeout label where there should only be 2. The issue is, because it's a radio connection there is static whenever there is not a radio transmission, PBP sees this as potential data, and if not met by the qualifier then it just loops to the beginning of the command again - so long as it's seeing these pin fluctuations and doing this loop, it will not timeout.

    I also figure that I can't use the ON INTERUPT command - because that only works when a PBP statement is complete and the SERIN command will never complete if it doesn't get a qualifier and gets RF staic noise through all the time.

    BTW I forgot to mention the PIC I'm using is a PIC16F676
    Last edited by George; - 19th March 2007 at 23:03.

  4. #4
    Join Date
    Oct 2005
    Location
    New Zealand
    Posts
    171


    Did you find this post helpful? Yes | No

    Default

    I've now tried DT's interupt files - however I get a million errors - ie. not being able to fit variables - sigh
    ERROR: Variable wsave3 position request 416 beyond RAM_END 95.
    ERROR: Variable wsave2 position request 288 beyond RAM_END 95.
    ERROR: Variable wsave1 position request 160 beyond RAM_END 95.
    that sort of thing

    Any advice on how to do this would be greatly appreciated - I've just about pulled all my hair out!

    How do you do an interrupt in ASM for this simply so that it will come out of the serin command - increment a timing incrementation and go back to the serial loop it's stuck in?

    Thanks in advance
    Last edited by George; - 21st March 2007 at 23:05.

  5. #5
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by George View Post
    I also figure that I can't use the ON INTERUPT command - because that only works when a PBP statement is complete and the SERIN command will never complete if it doesn't get a qualifier and gets RF staic noise through all the time.

    BTW I forgot to mention the PIC I'm using is a PIC16F676
    Use a timeout just a bit longer than the length of the start bit at your baud rate and put it in a loop. If you get a SOLID start bit, then all should be well...if the start bit is flakely, it should timeout. That should let you use ON INTERRUPT alright, should is the key word

    Also, can you rewrite the code a bit on the sending unit? I'm thinking maybe some qualifying bytes sent before the actual data is sent might come in handy in a case like this. The qualifying bytes get a short timeout, the data gets a longer timeout, in seperate SERIN statements.

  6. #6
    Join Date
    Oct 2005
    Location
    New Zealand
    Posts
    171


    Did you find this post helpful? Yes | No

    Default

    Hey skimask, Took me a while to understand what you are saying (am a bit slow this far into the week). I think what you are saying would work, tho I'm concerned tho that it would be a bit intermittant as far as timing goes - as your timing may be dependant on what's coming through the airwaves at the time.

    Currently I'm thinking about building a squelch circuit which will no doubt limit my range but should enable the serin timeout to work - tho i do think the ideal would be an assembly interupt.

  7. #7
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by George View Post
    Hey skimask, Took me a while to understand what you are saying (am a bit slow this far into the week). I think what you are saying would work, tho I'm concerned tho that it would be a bit intermittant as far as timing goes - as your timing may be dependant on what's coming through the airwaves at the time.

    Currently I'm thinking about building a squelch circuit which will no doubt limit my range but should enable the serin timeout to work - tho i do think the ideal would be an assembly interupt.
    Again, do you have access to the data sending unit? Can you change the code in that? I'll thinking you could eliminate the squelch circuit by just adding a load of preamble bytes before the data...
    Otherwise...a squelch circuit probably wouldn't work either since you have to break squelch, which takes time, which takes bytes, and so on...
    I'm still thinking on this one...

  8. #8
    Join Date
    Oct 2005
    Location
    New Zealand
    Posts
    171


    Did you find this post helpful? Yes | No

    Default

    Yeah, have written the code for the sender so can change that to whatever, I've got "READY" as my qualifier. I'm going to try your idea about using a very short timeout to see how it works 1-2ms I'm thinking at the moment - will be interesting if nothing else to see what effect it has on the time keeping. Thanks for all yr input so far

  9. #9
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by George View Post
    Yeah, have written the code for the sender so can change that to whatever, I've got "READY" as my qualifier. I'm going to try your idea about using a very short timeout to see how it works 1-2ms I'm thinking at the moment - will be interesting if nothing else to see what effect it has on the time keeping. Thanks for all yr input so far
    I just saw that your baud rate is 2400. That's .416 us per bit, a start bit is generally 1.5 bit lengths, which gives you .625us for a start bit. Timeout is limited to 1 ms minimum, it might work, it might not. You might end up waiting for READY, but only able to receive "EADY". I would think if you sent a string of qualifiers (bunch of $AA55's or the like), say 10 of them, wait until you have a solid 5 received, then you should be able to dispense with any timeouts because you signal is strong enough to get the qual's.

  10. #10
    Join Date
    Oct 2005
    Location
    New Zealand
    Posts
    171


    Did you find this post helpful? Yes | No

    Default

    I've got a string of 5 $AA preceeeding the READY, and haven't seemed to have much of a problem getting the data to the receiver - i send the data 5 times on a transmission to make fairly sure it gets through. I've got the timeout at 1ms toggling an LED to indicate to me when it's exiting out of the serin command - it's way random tho can tripout every half second or every 10 minutes. The issue I have is not so much transmitting the data - it's when no data is being transmitted

  11. #11
    Join Date
    Oct 2005
    Location
    New Zealand
    Posts
    171


    Did you find this post helpful? Yes | No

    Default

    Oh the other thing I forgot to mention is that the RF modules r AM so there is alot of static when there is no carrier

  12. #12
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by George View Post
    Oh the other thing I forgot to mention is that the RF modules r AM so there is alot of static when there is no carrier
    ooofff...AM...that hurts
    Still, send the data multiple times, add a checksum to the data, receive the data successfully X number of times, blah blah blah... Should be too much of a problem even with all that random AM static noise.
    But you're still on the problem of sitting in a SERIN loop waiting for solid data while you still need to do other stuff, correct? How about a 2nd PIC (say a 16F688) that just sits there and waits for data, and when it gets good data, it fires it out a different serial port to the 'real' PIC, which doesn't have to worry about garbage data... Heck, might even be a good spot for a 10F202 to handle that job!!!

  13. #13
    Join Date
    Oct 2005
    Location
    New Zealand
    Posts
    171


    Did you find this post helpful? Yes | No

    Default

    Yah - I wanted to avoid something like that due to complexity - plus haven't had any luck with PBP and 10F202 (PBP uses up too many variables - tho for a simple job like that I'm sure it would work) electronically it's prolly simpler for me to build a squelch. I might do a new post with a title more reflecting ASM interupts - thanks for all yr input

  14. #14
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    unless your module have a RSS output, send it to the trash can.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  15. #15
    Join Date
    Aug 2006
    Location
    Look, behind you.
    Posts
    2,818


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by George View Post
    Oh the other thing I forgot to mention is that the RF modules r AM so there is alot of static when there is no carrier
    Can you not install a squelch circuit on the receiver?
    If you do not believe in MAGIC, Consider how currency has value simply by printing it, and is then traded for real assets.
    .
    Gold is the money of kings, silver is the money of gentlemen, barter is the money of peasants - but debt is the money of slaves
    .
    There simply is no "Happy Spam" If you do it you will disappear from this forum.

  16. #16
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    Or feed it to a PIC comparator input

    Sorry if this sounds like a PMS reply but we still don't know which RF module you're using.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

Similar Threads

  1. Serin timeout not working properly!
    By Megahertz in forum mel PIC BASIC Pro
    Replies: 26
    Last Post: - 1st January 2010, 20:56
  2. SERIN timeout
    By Del Tapparo in forum Serial
    Replies: 3
    Last Post: - 20th November 2007, 04:34
  3. 16F628A Serin timeout and Timer1
    By Rubicon in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 26th March 2006, 23:20
  4. SERIN SERIN2 Timeout
    By markedwards in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 23rd June 2005, 18:59
  5. SERIN & Timeout
    By BigWumpus in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 30th October 2004, 07:33

Members who have read this thread : 1

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