Passing variables between cogs - Need Help Please
                    Resident Spin Experts....
I am trying to pass one variable generated in one cog to another and am having trouble compiling and running my code. In short, I have one object that reads in and displays GPS data, while the other reads several "one wire" temperature sensors. I want to pass the temperature variable from the one-wire section of code/cog to the GPS read and display cog. If I run both on the same cog, I get too much of a delay in the output speed (I need 10Hz speed readings from my 10Hz GPS).
I have looked over the forum, the user guide, and the Propeller Spin Code examples book, but I find nothing wrong. If anyone could please look over my code and comment, I would appreciate it. I am sure it is something easy I have missed, but I have spent way too much time on this already and am completely frustrated.
Thanks for your help in advance!!!
Joe
                            I am trying to pass one variable generated in one cog to another and am having trouble compiling and running my code. In short, I have one object that reads in and displays GPS data, while the other reads several "one wire" temperature sensors. I want to pass the temperature variable from the one-wire section of code/cog to the GPS read and display cog. If I run both on the same cog, I get too much of a delay in the output speed (I need 10Hz speed readings from my 10Hz GPS).
I have looked over the forum, the user guide, and the Propeller Spin Code examples book, but I find nothing wrong. If anyone could please look over my code and comment, I would appreciate it. I am sure it is something easy I have missed, but I have spent way too much time on this already and am completely frustrated.
Thanks for your help in advance!!!
Joe
CON
  _clkmode = xtal1 + pll16x
  _xinfreq = 5_000_000
  MAX_DEVICES = 4
  
OBJ
  debug   : "pc_text"
  ow      : "SpinOneWire"
  f       : "FloatMath"
  fp      : "FloatString"
  gps     : "GPS_IO_mini2"
  
VAR
  long addrs[noparse][[/noparse]2 * MAX_DEVICES]
  Long Stack0[noparse][[/noparse]20]
  Long Stack1[noparse][[/noparse]20]   
PUB start 
'cognew(readtemperature(@addr), @wire)
CogNew (GPSread, @Stack0)
CogNew (OnewireData, @Stack1)
 
PUB GPSread | i, numDevices, addr, main, gmt
  gps.start
  debug.start(12) 
  repeat
     
      
      debug.str((string("Latitude")))
      debug.str(gps.latitude)  
      debug.str((string(",Longitude")))
      debug.str(gps.longitude)
      debug.str((string(",GPS_Altitude")))
      debug.str(gps.GPSaltitude)      
      debug.str((string(",GPS_Speed")))
      debug.str(gps.speed)     
      debug.str((string(",Time GMT")))                                                                                                                                                                                                                                                                                                                                                    
      debug.str(gps.time)      
      debug.str((string(",Date")))
      debug.str(gps.date)
      debug.str((string(",Temp ")))
      fp.SetPrecision(4)
      'debug.str(fp.FloatToString(readtemperature.degF))
      debug.str(degF)
PUB OnewireData | i, numDevices, addr
  ow.start(24)
  repeat
    numDevices := ow.search(ow#REQUIRE_CRC, MAX_DEVICES, @addrs)
    'debug.str(string($01, "── SpinOneWire Test ──", 13, 13, "Devices:"))
    repeat i from 0 to MAX_DEVICES-1
      'debug.out(13)
    
      if i => numDevices
        ' No device: Blank line
        repeat 39
          'debug.out(" ")
      else
        addr := @addrs + (i << 3)
        ' Display the 64-bit address        
        'debug.hex(LONG[noparse][[/noparse]addr + 4], 8)
        'debug.hex(LONG[noparse][[/noparse]addr], 8)
        'debug.str(string("  "))
        if BYTE[noparse][[/noparse]addr] == ow#FAMILY_DS18B20
          ' It's a DS18B20 temperature sensor. Read it.
          readTemperature(addr)
        'else
          ' Nothing else to show...
          'debug.str(string(9,9))
PUB readTemperature(addr) | temp, degC, degF
  '' Read the temperature from a DS18B20 sensor, and display it.
  '' Blocks while the conversion is taking place.
  ow.reset
  ow.writeByte(ow#MATCH_ROM)
  ow.writeAddress(addr)
  ow.writeByte(ow#CONVERT_T)
  ' Wait for the conversion
  repeat
    waitcnt(clkfreq/100 + cnt)
    if ow.readBits(1)
      ' Have a reading! Read it from the scratchpad.
      ow.reset
      ow.writeByte(ow#MATCH_ROM)
      ow.writeAddress(addr)
      ow.writeByte(ow#READ_SCRATCHPAD)
      temp := ow.readBits(16)
      ' Convert from fixed point to floating point
      degC := f.FDiv(f.FFloat(temp), 16.0)
      ' Convert celsius to fahrenheit
      degF := f.FAdd(f.FMul(degC, 1.8), 32.0)
      'fp.SetPrecision(4)
      'debug.str(fp.FloatToString(degF))
      'debug.str(string("°F    "))
      return
                
 
                            
Comments
When I compile, I get "Expected an expresssion term" highlighting the degF variable in the GPSRead section of code. That variable is generated in the readtemperature section of code at the bottom of the page.
Thanks!
By the way, why does your "start" method just call COGNEW a couple of times, then quit? That's your main program. It can call other methods and normally organizes the whole shebang.
Post Edited (Mike Green) : 1/5/2010 7:29:59 PM GMT