Shop OBEX P1 Docs P2 Docs Learn Events
Addressing issue with xbee — Parallax Forums

Addressing issue with xbee

lrtnorfolklrtnorfolk Posts: 19
edited 2012-03-05 14:35 in Accessories
Good morning All,
Hope you are having a good weekend. I have a question regarding addressing the xbee. I have 2 xbee pro's (802.15.4) connected to 2 propellers. They work great. I download several examples of code and have not experienced any problems. However, I decided to write some spin code on my own (base on example code and documentation). I want the remote unit to wake up for 10 seconds and simply "sniff", or stay in the receive mode until it receives a signal ("A"). Then reply with a signal ("B"). After 10 seconds, it goes to sleep for 10 seconds, then repeat the process.
The base unit simply transmits a signal ("A") once a second. When it receives a response ("B"), it lights an LED. The code works fine if I declare the remotes address in the base code (XB.AT_Config(string("ATDL 2")) ). But if I try and use the remote's address as a variable, it does not associate. Is there a way to get the base unit to force an address variable before it receives a signal? Below code is what I am currently working with. The first is the base code. The second is the remote code.
Any assistance would be greatly appreciated.


[PHP]CON
_clkmode = xtal1 + pll16x
_xinfreq = 5_000_000

XB_Rt = 8 ' XBee out
XB_Tt = 10 ' XBee in
XB_Baud = 9600 ' XBee Baud Rate
LED = 0 ' led light
CR = 13
OBJ
XB : "XBee_Object"
VAR
Long DL_Addr, stack[100]
Pub Start | cog
XB.start(XB_Rt, XB_Tt, 0, XB_Baud) ' comms for XBee
XB.AT_Init ' fast Command Mode
XB.AT_Config(string("ATMY 0")) ' base
XB.AT_Config(string("ATDL 2")) ' remote
cognew(indata,@stack)

repeat
xb.tx("A")
xb.cr
xb.delay(1000)
pub indata | input
dira[LED]~~
repeat

input := XB.rx ' incoming byte
If input == "B" ' If command

input := XB.RxDecTime(500) ' remote address
xb.delay(1000)
XB.AT_ConfigVal(string("ATDL"),input) ' remote varible
!outa[LED] ' led on off[/PHP]

[PHP]CON
_clkmode = xtal1 + pll16x
_xinfreq = 5_000_000
XB_Rt = 20 ' out
XB_Tt = 21 ' in
XB_Baud = 9600 ' baud rate
SLP = 19
my_addr = 2 ' remote address
CR = 13
OBJ
XB : "XBee_Object"
VAR
Long stack[100]
Pub Start | DataIn, cog
XB.start(XB_Rt, XB_Tt, 0, XB_Baud) ' comms for XBee
XB.AT_Init ' fast Command mode
XB.AT_ConfigVal(string("ATMY "),MY_Addr) ' remote
XB.AT_Config(string("ATDL 0")) ' base
XB.AT_Config(string("ATSM 1")) ' sleep mode

dira[SLP]~~
repeat
outa[SLP]~
XB.Delay(20)
cog:=cognew(xb_xb, @stack)
xb.delay(10000)
cogstop(cog)
XB.Delay(50)
outa[SLP]~~
XB.Delay(10000)

pub xb_xb | datain
repeat

DataIn := XB.rx ' wait
If DataIn == "A"
xb.tx("B")
xb.dec(my_addr)
xb.cr
[/PHP]

Comments

  • Tracy AllenTracy Allen Posts: 6,662
    edited 2012-03-04 10:14
    The address has to be an ascii character. One way to do this would be
    [COLOR=#000000][COLOR=#DD0000]  [s]my_addr   = 2    '  [/s][/COLOR][s][COLOR=#0000BB]remote address[/COLOR][/s][COLOR=#0000BB]
    [/COLOR][/COLOR][COLOR=#000000][COLOR=#DD0000]  my_addr   = "2"    '  [/COLOR][COLOR=#0000BB]remote address as ascii[/COLOR][/COLOR][COLOR=#000000][COLOR=#0000BB]
    [/COLOR][/COLOR]
    
  • Martin HebelMartin Hebel Posts: 1,239
    edited 2012-03-04 15:39
    Tracy,
    .AT_ConfigVal(string, val) accepts a value, so that doesn't seem to be the issue.... looking this over..
  • Martin HebelMartin Hebel Posts: 1,239
    edited 2012-03-04 15:58
    Irtnorfolk,
    You say "But if I try and use the remote's address as a variable, it does not associate. Is there a way to get the base unit to force an address variable before it receives a signal? "

    I'm not sure what you mean by associate. Is the remote not getting an "A" or is the base not getting the replied "B"? It does work perfectly if you use the "ATMY 2" code? Can you light a remote indicator to see if it gets the "A"?

    Also, I am unclear on what you mean in the second sentence. Have the base to force an address before it receives a signal? What do you mean?

    I pretty positive the AT_ConfigVal() code does it's job as it's used in examples.

    It looks like you start a 2nd cog to receive/send data... Seems like you need to be careful with that, Declaring objects in one cog and using them from another cog can sometimes cause problems. I've been away from heavy Propeller programming for a couple years now, so some things are cloudy. There's no real good reason to use another cog to do that.

    -Martin
  • lrtnorfolklrtnorfolk Posts: 19
    edited 2012-03-05 07:37
    Martin,
    Thank you Sir for replying!!! Your code is what I based my code on. Sorry if I was not clear with my post. I have a tendency to write before I think. Anyway, I would like to remove the following line from the base code...
    XB.AT_Config(string("ATDL 2")) ' remote.

    The program works perfectly with this line include. But I would like to remove it and simply read the address of the remote unit using the following code...
    input := XB.RxDecTime(500) ' remote address

    XB.AT_ConfigVal(string("ATDL"),input) '
    remote variable




    When I remove the line XB.AT_Config(string("ATDL 2")) ' remote...
    The remote units TX and RX lights on the Adapter board do not illuminate and the 2 xbees don't "associate". Not sure if "associate" is the proper word, but it seems that the remote unit does not RX, thus, will not TX. If I keep XB.AT_Config(string("ATDL 2")) ' remote

    the lights blink off and on as expected (on the remote unit), and the LED (connected to the base unit) blinks off and on as expected.
    I can have the remote unit initiate the conversation (vice the base), and it works fine. I would prefer not to do this as the remote unit will run on batteries, thus I am trying to conserve power anywhere I can. Thank you for your time Sir. Have a good one.
    Renee
  • Tracy AllenTracy Allen Posts: 6,662
    edited 2012-03-05 09:12
    Why do you want to read back the MY address of the remote XBee? You already know that it is 2. I can see it, if the base sends a broadcast address, and then needs to extract information about who responded. If you use API mode, the MY or the 64 bit MAC address is embedded in every packet.

    For troubleshooting, it might help if you start up a debugging serial port on the base end, so that you can look at what is actually being received.

    I, too, see a potential conflicts with running this in two cogs. As far as I know, Martin's object does not use locks, and your program is asking the XB object to transmit data in one cog while the other cog is potentially trying to put the XB into command mode to change the configuration--well--that could mess things up. For starters, just run the receiver in one cog, alternating between sending and receiving in one loop, and add another serial port for debugging.
  • lrtnorfolklrtnorfolk Posts: 19
    edited 2012-03-05 09:44
    Tracy,
    Thanks for replying. I need the base unit to read the MY address of the remote units. In the future, I will have multiple remote units, thus I will need to distinguish between them. I will re-write my code so everything is done in one cog. Thanks for the advice. It is greatly appreciated.
    Renee
  • Martin HebelMartin Hebel Posts: 1,239
    edited 2012-03-05 14:29
    I'm still befuddled over why AT_ConfigVal is not working, but for knowing which unit sent data my text gives examples on sending the address in AT mode and using it API to automatically obtain the address. API mode is probably your best bet, and I recommend switching over.

    Martin
  • Martin HebelMartin Hebel Posts: 1,239
    edited 2012-03-05 14:35
    And Associate does have a specific meaning with these units, when a unit wakes, it can be configured to join an existing network, mainly used on the Zigbee versions. Once accepted into the network, it is associated. With your use, it's more of an ad hoc network.
Sign In or Register to comment.