Help with serin, serout, Manchester encoding


Closed Thread
Results 1 to 31 of 31

Hybrid View

  1. #1
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by oneohthree View Post
    This is a part of the 2 way paging system that I am doing for a project. Basically what I am trying to do is take 4 bits from the transmitter that I get at the receiver end and do some operations on it. I am assuming that the first two bits are the address and the last two bits are the mode. There are two modes tracking and finding. In each case, I am first checking the last two bits to see which mode it is. After I do that, I am checking if the first two bits of address matches. If the address matches, it will change the third bit (kind of like an acknowledgement) and output the result somewhere. If it does not match it will not change the code and output it back. In the find mode, it does the same thing except it will make a pin high in order to set off an alert like a LED. Is this making any sense?
    Ok, that makes a bit more sense....
    A bit (pun intended) simpler, maybe????......
    Take a sent byte...invert it and send it back as some sort of acknowledge.
    For instance: (using 4 bits, $5, $A, $0, $F, are already taken, so can't use those)
    Send $1, return $E, acknowledged
    Send $2, return $D, and so on...
    Anything else returned would be 'not' acknowledged...
    Leaves you with $1,2,3,4,6,7 for send codes ($E,D,C,B,9,8 for returned codes).... if 6 codes is enough for you...
    That way you could set the 'address' for each pager/receiver with 3 DIP switches (with 2 unused combo's)...

  2. #2
    Join Date
    Mar 2007
    Posts
    42


    Did you find this post helpful? Yes | No

    Default

    Would it matter if I used t2400 or n2400 in my code for serin/serout? I used n2400 in my code and everything is encoding and decoding correctly. I know this because the number at the receiver checks when I write the result into EEPROM and convert the hexadecimal to binary. Also, it seems like the receiver code does not go to the if statements at the end. For example, if I receive 1100 it serout something to pin 1. When I put a LED at pin 1 I don't see anything. Is there anyway I can fix it? Would I have to change my decoded message from hexadecimal to binary in order to allow me to manipulate the bits?

    'Transmitter Code
    'Transmitter Code
    Include "Modedefs.bas"
    main:
    v var byte : counter var byte : encoded var byte : v = %1100
    'Manchester encoding
    For counter = 0 to 3
    If v.0[counter]=0 Then
    encoded.0[counter*2]=0 : encoded.0[counter*2+1]=1 'If it is a zero make the first bit 0 and second bit 1
    Else
    encoded.0[counter*2]=1 : encoded.0[counter*2+1]=0 'If not then make first bit 1 and second bit 0
    EndIf
    Next counter : serout PORTB.0, n2400, [ $55 , $55 ,$aa , encoded ] 'send out code
    write 0, encoded
    High 1
    Pause 1000
    Low 1
    goto main


    'Receiver Code
    Include "Modedefs.bas"
    s var byte : B0 var byte : B1 var byte : 's is byte to be encoded, B0 and B1 is byte
    counter var byte : cnt55 var byte: 'counter is byte and cnt55 is byte
    encoded1 var byte : action var byte : alert var byte : B0=1 : B1=1
    'encoded1 word sized variable that holds encoded byte v, alert variable, action variable, B0 and B1 hardwired address
    s=0: encoded1=0
    main:
    cnt55 = 0 'counter for $55 is zero

    waitfor55:
    serin PORTB.0, t2400, encoded1 'take in data at pin 0 and place in encoded1
    if encoded1 = $55 then
    cnt55 = cnt55 + 1 '$55 read, increase cnt55 by 1
    if cnt55 = 2 then goto waitforaa 'if $55 occurs 3 times in a row check for $aa
    else
    goto main 'if not $55, reset counter at main and restart
    endif
    goto waitfor55

    waitforaa:
    serin PORTB.0, n2400, encoded1
    if encoded1 <> $aa then goto main 'restart, incorrect leader bit

    serin PORTB.0, n2400, encoded1 : serout PORTB.4, n2400, [encoded1] 'take in from pin 0 to encoded 1 output to pin 3 contens in encoded1
    write 0,encoded1
    High 7
    Pause 10000
    Low 7


    'Decoding
    For counter=0 to 3:s.0[counter]=encoded1.0[counter*2]:Next counter
    serout PORTB.3, n2400, [s] 'Ouptut decoded message
    write 1, s
    High 6
    Pause 10000
    Low 6

    'Tracking code
    If (s.2==0) & (s.3==0) Then 'if the code matches 00
    If (s.0==B0) & (s.1==B1) Then 'if the address matches then
    s.2=1: action = s.2: 'set the third bit to 1 and send it back
    alert = 0:
    serout PORTB.1, n2400, [s] 'output to pin 1 value in s
    Else
    s.2=0: action = s.2: 'do not change anything and send back
    alert = 0:
    serout PORTB.2, n2400, [s] 'output to pin 1 value in s
    Endif
    Endif

    'Tracking and Finding code
    If (s.2==0) & (s.3==1) Then 'if code matches 01 then
    If (s.0==B0) & (s.1==B1) Then 'If the address matches then
    s.2=1: action=s.2: 'set the third bit to 1 and send back
    alert=1:
    serout PORTB.6, n2400, [s]: 'output to pin 1 value in s
    High 2 'set alert to 1 and make pin 2 high.
    Else
    s.2=0: action=s.2: 'do not change anything and send back
    alert=0:
    serout PORTB.5, n2400, [s] 'output to pin 1 value in s
    Endif
    Endif
    Last edited by oneohthree; - 4th April 2007 at 06:49.

  3. #3
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by oneohthree View Post
    'Transmitter Code
    Include "Modedefs.bas"
    main:
    v var byte : counter var byte : encoded var byte : v = %1100
    'Manchester encoding
    For counter = 0 to 3
    If v.0[counter]=0 Then
    encoded.0[counter*2]=0 : encoded.0[counter*2+1]=1 'If it is a zero make the first bit 0 and second bit 1
    Else
    encoded.0[counter*2]=1 : encoded.0[counter*2+1]=0 'If not then make first bit 1 and second bit 0
    EndIf
    Next counter : serout PORTB.0, n2400, [ $55 , $55 , $55 , $55 , $55 , $55 ,$aa , encoded ] 'send out code
    write 0, encoded
    High 1
    Pause 1000
    Low 1
    goto main


    'Receiver Code
    Include "Modedefs.bas"
    s var byte : B0 var byte : B1 var byte : 's is byte to be encoded, B0 and B1 is byte
    counter var byte : cnt55 var byte : cntaa var byte 'counter is byte and cnt55 is byte
    encoded1 var byte : action var byte : alert var byte : B0=1 : B1=1
    'encoded1 word sized variable that holds encoded byte v, alert variable, action variable, B0 and B1 hardwired address
    s=0: encoded1=0
    main:
    cnt55 = 0 : cntaa = 0 'counter for $55 & $aa is zero

    waitfor55:
    serin PORTB.0, t2400, encoded1 'take in data at pin 0 and place in encoded1
    if encoded1 = $55 then
    cnt55 = cnt55 + 1 '$55 read, increase cnt55 by 1
    if cnt55 > 3 then goto waitforaa 'if $55 occurs more than 3 times in a row check for $aa
    else
    goto main 'if not $55, reset counter at main and restart
    endif
    goto waitfor55

    waitforaa:
    serin PORTB.0, n2400, encoded1
    if encoded1 <> $aa then
    cntaa = cntaa + 1
    if cntaa > 5 then goto main 'restart, incorrect leader bit
    endif
    serin PORTB.0, n2400, encoded1 : serout PORTB.4, n2400, [encoded1] 'take in from pin 0 to encoded 1 output to pin 3 contens in encoded1
    write 0,encoded1
    High 7
    Pause 10000
    Low 7


    'Decoding
    For counter=0 to 3:s.0[counter]=encoded1.0[counter*2]:Next counter
    serout PORTB.3, n2400, [s] 'Ouptut decoded message
    write 1, s
    High 6
    Pause 10000
    Low 6

    'Tracking code
    If (s.2==0) & (s.3==0) Then 'if the code matches 00
    If (s.0==B0) & (s.1==B1) Then 'if the address matches then
    s.2=1: action = s.2: 'set the third bit to 1 and send it back
    alert = 0:
    serout PORTB.1, n2400, [s] 'output to pin 1 value in s
    Else
    s.2=0: action = s.2: 'do not change anything and send back
    alert = 0:
    serout PORTB.2, n2400, [s] 'output to pin 1 value in s
    Endif
    Endif

    'Tracking and Finding code
    If (s.2==0) & (s.3==1) Then 'if code matches 01 then
    If (s.0==B0) & (s.1==B1) Then 'If the address matches then
    s.2=1: action=s.2: 'set the third bit to 1 and send back
    alert=1:
    serout PORTB.6, n2400, [s]: 'output to pin 1 value in s
    High 2 'set alert to 1 and make pin 2 high.
    Else
    s.2=0: action=s.2: 'do not change anything and send back
    alert=0:
    serout PORTB.5, n2400, [s] 'output to pin 1 value in s
    Endif
    Endif

    Try that out. Send more $55's for the leader (more time for RX to sync up), wait for at least 3 of them. When you get 3, start watching for an $AA. If you don't get an $AA within 5 bytes, restart the process.

    As far as changing hex to binary...PBP doesn't care one way or the other. You are working with a byte. PBP can work on bytes, bits, hex, binary, doesn't matter. Just a matter of looking up the right math operator and using it.

  4. #4
    Join Date
    Mar 2007
    Posts
    42


    Did you find this post helpful? Yes | No

    Default

    The encoding and decoding works properly, I have 4 $55's now. I also changed my logic around in my receiver code so that it checks the address (check the first two bits) then determines the mode (checks the last two bits). But, I discover that my microcontroller repeatedly doesn't execute the logic correctly. Even if the first two bits match it always jumps to the statement (indicated by the **** in my code) where it writes to the third memory location in the EEPROM.
    I do not understand why it does that.

    Receiver code:

    Include "Modedefs.bas"
    s var byte : B0 var bit : B1 var bit : 's is byte to be encoded, B0 and B1 is byte
    counter var byte : cnt55 var byte: 'counter is byte and cnt55 is byte
    encoded1 var byte : action var byte : alert var byte : B0=1 : B1=1
    'encoded1 word sized variable that holds encoded byte v, alert variable, action variable, B0 and B1 hardwired address
    s=0: encoded1=0

    main:
    cnt55 = 0 'counter for $55 is zero

    waitfor55:
    serin PORTB.0, t2400, encoded1 'take in data at pin 0 and place in encoded1
    if encoded1 = $55 then
    cnt55 = cnt55 + 1 '$55 read, increase cnt55 by 1
    if cnt55 = 4 then goto waitforaa 'if $55 occurs 4 times in a row check for $aa
    else
    goto main 'if not $55, reset counter at main and restart
    endif
    goto waitfor55

    waitforaa:
    serin PORTB.0, n2400, encoded1
    if encoded1 <> $aa then goto main 'restart, incorrect leader bit

    serin PORTB.0, n2400, encoded1 : 'serout PORTB.4, n2400, [encoded1] take in from pin 0 to encoded 1 output to pin 3 contens in encoded1
    write 0,encoded1
    High 7
    Pause 2000
    Low 7


    'Decoding
    For counter=0 to 3:s.0[counter]=encoded1.0[counter*2]:Next counter
    serout PORTB.3, n2400, [s] 'Ouptut decoded message
    write 1, s
    High 6
    Pause 2000
    Low 6


    if (s.0=1) AND (s.1=1) then 'Check if address matches
    goto L2
    else *****
    write 3, s
    High 2
    Pause 2000
    Low 2
    End
    endif


    L2:
    if (s.2=0) And (s.3=0) then 'if the address Tracking then
    s.2=1: action = s 'set the third bit to 1 and send it back
    alert = 0: serout PORTB.1, n2400, [action] 'output to pin 1 value in s
    write 2, action
    High 1
    Pause 2000
    Low 1
    endif

    if (s.2=0) AND (s.3=1) then 'If the address Tracking and Finding then
    s.2=1: action=s 'set the third bit to 1 and send back
    alert=1: serout PORTB.4, n2400, [action]: 'output to pin 1 value in s
    write 4, action
    High 4
    Pause 2000
    Low 4
    endif

    End

  5. #5
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    if (s.0=1) AND (s.1=1) then 'Check if address matches
    goto L2
    else *****
    write 3, s
    High 2
    Pause 2000
    Low 2
    End
    endif



    Why is there an 'End' in the middle of your code?

  6. #6
    Join Date
    Mar 2007
    Posts
    42


    Did you find this post helpful? Yes | No

    Default

    If the address (first two bits) don't match then I would end the program. I took that out but it seems like it is not advancing towards the correct loop. When my decoded data is stored in the byte s the first bit of my sequence should be coded a s.0 or do I have to define something else before doing s.0?

    Include "Modedefs.bas"
    s var byte : B0 var bit : B1 var bit : 's is byte to be encoded, B0 and B1 is byte
    counter var byte : cnt55 var byte: 'counter is byte and cnt55 is byte
    encoded1 var byte : action var byte : alert var byte : B0=1 : B1=1
    'encoded1 word sized variable that holds encoded byte v, alert variable, action variable, B0 and B1 hardwired address
    s=0: encoded1=0

    main:
    cnt55 = 0 'counter for $55 is zero

    waitfor55:
    serin PORTB.0, n2400, encoded1 'take in data at pin 0 and place in encoded1
    if encoded1 = $55 then
    cnt55 = cnt55 + 1 '$55 read, increase cnt55 by 1
    if cnt55 = 4 then goto waitforaa 'if $55 occurs 4 times in a row check for $aa
    else
    goto main 'if not $55, reset counter at main and restart
    endif
    goto waitfor55

    waitforaa:
    serin PORTB.0, n2400, encoded1
    if encoded1 <> $aa then goto main 'restart, incorrect leader bit

    serin PORTB.0, n2400, encoded1 : 'serout PORTB.4, n2400, [encoded1] take in from pin 0 to encoded 1 output to pin 3 contens in encoded1
    write 0,encoded1
    High 7
    Pause 2000
    Low 7


    'Decoding
    For counter=0 to 3:s.0[counter]=encoded1.0[counter*2]:Next counter
    'serout PORTB.3, n2400, [s] 'Ouptut decoded message
    write 1, s
    High 6
    Pause 2000
    Low 6


    if (s.bit0=0) AND (s.bit1=1) then 'Check if address matches
    goto L3
    else
    write 2,s
    High 2
    Pause 2000
    Low 2
    endif


    L3:
    if (s.bit2=0) And (s.bit3=0) then 'if the address Tracking then
    s.bit2=1: action = s 'set the third bit to 1 and send it back
    alert = 0: 'serout PORTB.1, n2400, [action] 'output to pin 1 value in s
    write 3, action
    High 1
    Pause 2000
    Low 1
    endif

    if (s.bit2=0) AND (s.bit3=1) then 'If the address Tracking and Finding then
    s.bit2=1: action=s 'set the third bit to 1 and send back
    alert=1: 'serout PORTB.4, n2400, [action]: 'output to pin 1 value in s
    write 4, action
    High 4
    Pause 2000
    Low 4
    endif

    End
    Last edited by oneohthree; - 4th April 2007 at 22:16.

  7. #7
    skimask's Avatar
    skimask Guest


    Did you find this post helpful? Yes | No

    Default

    Are you sure that you are receiving at the RX the same thing you are sending at the TX?


    'Decoding
    For counter = 0 to 3 : s.0[counter] = encoded1.0[counter * 2 + 1] : Next counter

    Try that and see what happens...for grins...

Similar Threads

  1. A Serial GLCD 128x64 Simple Project
    By Oldspring in forum Off Topic
    Replies: 0
    Last Post: - 8th March 2010, 20:58
  2. Serout to serial servo
    By azmax100 in forum mel PIC BASIC Pro
    Replies: 20
    Last Post: - 12th August 2009, 16:46
  3. PIC16f877 code crosses boundary @800h
    By inventosrl in forum mel PIC BASIC Pro
    Replies: 7
    Last Post: - 6th April 2009, 22:03
  4. Advice-scrutiny for my serial controller
    By kevlar129bp in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 13th December 2008, 17:11
  5. SerIn and SerOut
    By Dwayne in forum FAQ - Frequently Asked Questions
    Replies: 0
    Last Post: - 21st July 2004, 15:54

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