Simple Prop to Prop Communication with Xbee
Botulism
Posts: 18
I have two identical devices consisting of 1 Prop Mini, red/blue LEDs, 1 button, and one standard/unchanged Xbee. This is baby steps for a larger project. One Prop starts blue, the other red. If the red Prop button is pressed, the blue Prop blinks Red and vice versa. I thought I would start be sending a simple number between props like the number 1. Turns out there is more to communicating than I thought. I can get one Prop to talk to my PC through the serial interface of the Xbee XCTU software, but I am clearly missing something when it comes to the second Prop receiving the information. (I have third Xbee connected to my PC to make sure data is being sent). I am aware of this document, but I am not finding anything about Prop to Prop communication in it. https://www.parallax.com/sites/default/files/downloads/122-32450-XBeeTutorial-v1.0.1.pdf
CON
_clkmode = xtal1 + pll2x
_xinfreq = 5_000_000
OBJ
XB : "XBee_Object" 'XB Communication Port
VAR
byte LocalButton, RemoteButton
byte BlueLED, RedLED, XB_Rx_Pin, XB_Tx_Pin
long Stack[40]
PUB Main
BlueLED := 16 'LED Pins
RedLED := 17
dira[BlueLED]~~ 'Sets LED pin as output line with ~~
outa[BlueLED]~ 'Sets LED pin LOW or OFF with ~
dira[RedLED]~~ 'Sets LED pin as output line with ~~
outa[RedLED]~ 'Sets LED pin OFF with ~
XB_Rx_Pin := 0 'Xbee pins
XB_Tx_Pin := 1
LocalButton := 15 'Local Button Pin
dira[LocalButton] := 0 'Set as INPUT
RemoteButton := 0 'RemoteButton value
XB.start(XB_Rx_Pin, XB_Tx_Pin, 0, 9600) 'Initialize the XBee
waitcnt(clkfreq/2 + cnt) 'Pause for 1/2 sec for XB to initialize
cognew (XB_Rx, @Stack) 'Cog for Rx
outa[RedLED]~~ 'Start with Red LEDs on
repeat 'Look for local button press, transmit a 1, and blink red LEDs
if ina[LocalButton] == 1
XB.Dec(1)
XB.CR
BlinkRed
PUB XB_Rx
repeat 'Look for a remote button press and blink ble LEDs
RemoteButton := XB.RxDec
if RemoteButton == 1
BlinkBlue
RemoteButton := 0
PUB BlinkRed 'Blink Red LEDs then keep red LEDs on
outa[BlueLED]~
repeat 30
!outa[RedLED]
waitcnt(clkfreq/10 + cnt)
outa[RedLED]~~
PUB BlinkBlue 'Blink Blue LEDs then keep red LEDs on
outa[RedLED]~
repeat 30
!outa[BlueLED]
waitcnt(clkfreq/10 + cnt)
outa[RedLED]~~

Comments
It's generally a good idea to only have one cog interact with individual IO pins. Whichever cog sets the red LED pin as an output should also be the cog to set the pin high or low. The same is true for the green LED.
Are you running the Propeller at 10 MHz? You likely know it can run 8 times faster.
I added a couple variables to the VAR section:
Here's the other code I changed.
repeat 'Look for local button press, transmit a 1, and blink red LEDs if ina[LocalButton] == 1 XB.Dec(1) XB.CR RedState := true if RedState BlinkRed RedState := false if BlueState BlinkBlue BlueState := false PUB XB_Rx repeat 'Look for a remote button press and blink ble LEDs RemoteButton := XB.RxDec if RemoteButton == 1 BlueState := true RemoteButton := 0I have not tested this.
Edit: If you're going to use "true" as a possible variable value, make sure you use a long. "true" equals negative one. Only longs can equal negative one.
The code blocks below will produce the same comparison. RedState doesn't have to be "true" or -1 to satisfy the condition. RedState just needs to be not zero (aka false).
The "true" and "false" conditions confused me when I first started programming the Propeller. Hopefully these values are not confusing to you.