Xbee not working in API mode
Nicopowers
Posts: 12
Hello everyone,
I am putting together a wireless XBee communication system where i read a temperature using a TMP36 Analog sensor connected to a MCP3208 (Analog to digital converter) connected to my Propeller Mini (this will be an XBee router), and send that data to a XBee coordinator which is connected to another Propeller Mini. Both Propeller Mini's are connected to a separate computer, so they can be individually accessed through XCTU and Spin programming tool. I have not been able to establish the XBee communication and I must use API mode so I can take advantage of its features.
My first question is, do I have to previously setup the XBee devices in any particular mode (like AT mode or API mode) in XCTU?
My second question is, When i execute the command :
Should I expect that XCTU shows that XBee in API mode? Or it will just do it for that session and return to AT mode?
Below please find both the Coordinators and Router code:
XBee Coordinator Code :
XBee Router Code :
Once again, I only want to use API mode but I have seen examples on the internet where they initialize the XBee communication with AT mode methods and then switch to API mode before sending or receiving data. Please help me get the XBee communication working or reference me a guide involving similar XBee implementation with API mode. I am attaching two separate archives for the XBee router spin code and for the XBee coordinator code.
I am putting together a wireless XBee communication system where i read a temperature using a TMP36 Analog sensor connected to a MCP3208 (Analog to digital converter) connected to my Propeller Mini (this will be an XBee router), and send that data to a XBee coordinator which is connected to another Propeller Mini. Both Propeller Mini's are connected to a separate computer, so they can be individually accessed through XCTU and Spin programming tool. I have not been able to establish the XBee communication and I must use API mode so I can take advantage of its features.
My first question is, do I have to previously setup the XBee devices in any particular mode (like AT mode or API mode) in XCTU?
My second question is, When i execute the command :
XB.AT_Config(string("ATAP 1"))
Should I expect that XCTU shows that XBee in API mode? Or it will just do it for that session and return to AT mode?
Below please find both the Coordinators and Router code:
XBee Coordinator Code :
CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 ' Set pins and Baud rate for XBee comms XB_Rx = 17 XB_Tx = 16 XB_Baud = 9600 ' Set pins and baud rate for PC comms PC_Rx = 31 PC_Tx = 30 PC_Baud = 9600 ' Set address of base unit MY_Addr = 0 OBJ XB : "XBee_Object_2" PC : "FullDuplexSerial" PUB Start ' Configure XBee & PC Comms XB.start(XB_Rx, XB_Tx, 0,9600) PC.start(PC_Rx, PC_Tx, 0, 9600) XB.AT_Init ' fast config XB.AT_ConfigVal(string("ATMY"), MY_Addr) XB.AT_Config(string("ATAP 1"))' Switch to API mode PC.str(string("Coordinator in API mode ready at address:")) PC.dec(MY_Addr) PC.Tx(13) Repeat ProcessFrame Pub ProcessFrame | Temp '' Accepts incoming frame for data and diplay XB.API_Rx ' wait for API data if XB.RxIdent == $81 ' If data identifier is a msg string ' Display source address PC.Str(string(13,"Data Received from address: ")) PC.DEC(XB.srcAddr) ' Display received string PC.Str(string(13,"Message String : ")) PC.str(XB.RxData) ' Pull out 1st dec value ' and display PC.str(string(13,"Remote Temperature : ")) Temp := XB.ParseDEC(XB.RxData,1) PC.DEC(Temp) PC.str(string(13,"RF Signal strength: ")) PC.DEC(-XB.rxRSSI) ' Display RSSI level ControlPin(XB.srcAddr,4,1) ' Call method to turn on LED 4 ' on sending end device XB.Delay(50) ' Delay ControlPin(XB.srcAddr,4,0) ' Call method to turn off LED 4 ' on sending unit PC.str(string(13,"------------------------------------------")) Pub ControlPin(destAddr, pin, state) '' This method accepts address, pin and state for control '' builds a packet to be sent in API mode and transmits '' Data is sent as BYTE values instead of decimal strings. XB.API_NewPacket ' clean out packet of old data XB.API_AddStr(string("i")) ' Add an i to packet XB.API_AddByte(pin) ' Add a byte of pin number XB.API_AddByte(state) ' Add a byte of pin state ' Send the packet to the XB.API_txPacket(destAddr,XB.API_Packet,3)
XBee Router Code :
VAR long tempch2 long stack[50] CON _clkmode = xtal1 + pll16x _xinfreq = 5_000_000 LEDs_START = 16 LEDs_END = 18 ' I/O and Baud rate for XBee comms XB_Rx = 1 XB_Tx = 2 XB_Baud = 9600 ' XBee addresses DL_Addr = 0 ' Send data to this address (base) MY_Addr = $5F77 ' This units address dpin = 15 'both din and dout of the mcp3208 are connected to this pin on the prop demo board. cpin = 14 'the clock pin of the mcp3208 is connected to this pin on the prop demo board. spin = 0 'the chip select pin of the mcp 3208 is connected to this pin on the prop demo board. mcp3208ratio = 0.0008056640625 OBJ adc : "MCP3208" pst : "Parallax Serial Terminal Plus" fstr : "FloatString" f32 : "FloatMath" sd : "PropBOE MicroSD2" XB : "XBee_Object_2" PUB Main pst.start(9600) 'Start the Parallax Serial Terminal object at 115200 baud adc.start(dpin, cpin, spin, 255) 'Start the MCP3208 object and enable all 8 channels as single-ended inputs. XB.Start(XB_RX, XB_TX ,0, XB_Baud) XB.AT_Init XB.AT_ConfigVal(string("ATMY"), MY_Addr) XB.AT_ConfigVal(string("ATDL"), DL_Addr) XB.AT_Config(string("ATAP 1"))' Switch to API mode sd.Mount(0) sd.FileNew(String("Sensordata.txt")) sd.FileOpen(String("Sensordata.txt"), "A") sd.WriteStr(String("CH2 Values", 13, 10)) sd.UnMount cognew (CH2, @stack) sdwriter ' writes to SD Card repeat ' Accept incoming in loop GetData Pub GetData | IO, dataIn, value dataIn := XB.rx ' wait for incoming byte If dataIn == "i" ' i = I/O control IO := XB.rx ' Accept IO number as byte value value := XB.rx ' Accept state (1/0) as byte dira[IO]~~ ' Set direction of pin outa[IO] := value ' Set state of pin PUB CH2 dira[18]~~ outa[18]~ XB.Delay(1000) repeat pst.Str(String(pst#cs, pst#NL, pst#HM, "Temperature value= ")) tempch2 := f32.FFloat(adc.in(2)) tempch2 := f32.FMul((f32.FSub((f32.FMul(tempch2, mcp3208ratio)), 0.50)), 100.0) pst.Str(fstr.FloatToString(tempch2)) if (tempch2 => 20.0) AND (tempch2 < 30.0) !outa[18] waitcnt(clkfreq + cnt) elseif (tempch2 => 18.0) AND (tempch2 < 20.0) !outa[18] waitcnt(clkfreq/2 + cnt) elseif (tempch2 => 16.0) AND (tempch2 < 18.0) !outa[18] waitcnt(clkfreq/4 + cnt) elseif (tempch2 => 14.0) AND (tempch2 < 16.0) !outa[18] waitcnt(clkfreq/8 + cnt) else !outa[18] waitcnt(clkfreq/16 + cnt) tempch2 := fstr.FloatToString(tempch2) XB.str(tempch2) ' send tempch2 XB.Delay(5000) ' wait 5 seconds and send again PUB sdwriter repeat sd.Mount(0) sd.FileOpen(String("Sensordata.txt"), "A") sd.WriteDec(tempch2) sd.WriteByte(13) ' Carriage return sd.WriteByte(10) ' New line waitcnt(clkfreq * 5 + cnt) sd.FileClose sd.Unmount
Once again, I only want to use API mode but I have seen examples on the internet where they initialize the XBee communication with AT mode methods and then switch to API mode before sending or receiving data. Please help me get the XBee communication working or reference me a guide involving similar XBee implementation with API mode. I am attaching two separate archives for the XBee router spin code and for the XBee coordinator code.
Comments
Also, if you would like to use one of the four port serial drivers instead of several single port ones to save some cogs, you may be interested in my modified version of the XBee object that uses any variant of four port FDS instead of standard single port FDS..