Shop OBEX P1 Docs P2 Docs Learn Events
Calling Variables in Cogs — Parallax Forums

Calling Variables in Cogs

HayONUHayONU Posts: 3
edited 2009-04-14 07:31 in Propeller 1
Are there any limitations to calling methods from one cog to another and are there any limitations to calling variables throughout the program?

We have IR sensors with an ADC that are supposed to be on a separate cog from the rest of the program so we will be able to continuously monitor them. Our main code will determine what to do once the information is gathered from the ADC. We are having trouble getting the value for each sensor variable to transfer to our main program.

Here is our code:

{{

Pin connections:

           P0   Program Switch 0                         P21  7 Segment Display - B                                                                               
           P1   Program Switch 1                         P22  7 Segment Display - A                   
           P2   Program Switch 2                         P23  7 Segment Display - DP
           P3   Program Switch 3                         P24  Spare 
           P4   Program Switch 4                         P25  Relay
           P5   ADC CLOCK                                P26  Relay
           P6   ADC DOUT                                 P27  Relay
           P7   ADC CS  TB1                              P28  SCL EEPROM
           P8   ADC CS  TB2                              P29  SDA EEPROM
           P9   ADC CS  TB3                              P30  Programming Port
           P10  ADC CS  TB4                              P31  Programming Port
           P11  ADC CS  TB5                                          
           P12  ADC CS  TB6                                          
           P13  ADC CS  TB7                                          
           P14  ADC CS  TB8                                         
           P15  Relay                                       
           P16  7 Segment Display - G                                          
           P17  7 Segment Display - F                                         
           P18  7 Segment Display - E                                          
           P19  7 Segment Display - D                                          
           P20  7 Segment Display - C

}}           
CON
  _clkmode = xtal1 + pll16x          ' enable external clock and pll times 16
  _xinfreq = 5_000_000             ' set frequency to 5 MHZ

  ON  = 1
  OFF = 0 

  OUTPUT = 1
  INPUT = 0
        'Seven Segment Display Pin Numbers.
      
  DISA = 22 
  DISB = 21
  DISC = 20
  DISD = 19
  DISE = 18
  DISF = 17
  DISG = 16

        'EEPROM Pin Numbers.   
  SCL = 28      
  SDA = 29
        'Program Switches
  PZERO  = 0
  PONE   = 1
  PTWO   = 2
  PTHREE = 3
  PFOUR  = 4

           'Analog to Digital Converter
                                
  ADC_CLK = 5 
  ADC_DIN = 6                    
  ADC_CS5 = 7                    '
  ADC_CS6 = 8
  ADC_CS7 = 9
  ADC_CS8 = 10
  ADC_CS9 = 11
  ADC_CS10 = 12
  ADC_CS11 = 13
  ADC_CS12 = 14
var

  long front_right
  long front_left
  long back_right   
  long back_left
  long rightside_front
  long rightside_back
  long leftside_front
  long leftside_back
  long inc
  long counter                            
  long stack[noparse][[/noparse]20]
  long sensor
pub main
 i_o_setup
 cognew(Read_IR_Sensor,@stack)
 waitcnt(40_000_000+cnt)
 
REPEAT
            
  IF INA[noparse][[/noparse]PZERO]== 0                         
      Outa[noparse][[/noparse]16..22]:= %0111111
       waitcnt(80_000_000+cnt)   
      HeadtoHead
   

  ELSEIF INA[noparse][[/noparse]PONE]== 0                         
    Outa[noparse][[/noparse]16..22]:= %0000110
     waitcnt(80_000_000+cnt)
    BacktoBack
    

  ELSEIF INA[noparse][[/noparse]PTWO]== 0                                    
    Outa[noparse][[/noparse]16..22]:= %1011011
     waitcnt(80_000_000+cnt)
    SidetoSideOppDir
    

  ELSEIF INA[noparse][[/noparse]PTHREE]== 0                                    
    Outa[noparse][[/noparse]16..22]:= %1001111
     waitcnt(80_000_000+cnt)
    SidetoSideSameDir
                                                                 
  ELSEIF INA[noparse][[/noparse]PFOUR]== 0
    Outa[noparse][[/noparse]16..22]:= %1100110
  
                                             
           
    
    
Pub HeadtoHead
  Repeat
    case front_left ' front_right  'If detected stay full speed
      0..440:                    'displays a zero
        outa[noparse][[/noparse]16..22]:= %0111111
        outa[noparse][[/noparse]15]:=0
        outa[noparse][[/noparse]25]:=0
                              
      441..880:                 'displays a one
        Outa[noparse][[/noparse]16..22]:= %0000110
        outa[noparse][[/noparse]15]:=0
        outa[noparse][[/noparse]25]:=0      
      881..1320:                 'displays a two
        Outa[noparse][[/noparse]16..22]:= %1011011
        outa[noparse][[/noparse]15]:=0
        outa[noparse][[/noparse]25]:=0
      1321..1760:                 'displays a three
        Outa[noparse][[/noparse]16..22]:= %1001111
        outa[noparse][[/noparse]15]:=0
        outa[noparse][[/noparse]25]:=0
      1761..4095:                 'displays a four
        Outa[noparse][[/noparse]16..22]:= %1100110
        outa[noparse][[/noparse]15]:=0
        outa[noparse][[/noparse]25]:=0
      other:                      'displays a five            
        Outa[noparse][[/noparse]16..22]:= %1101101'
    
         
return

Pub BacktoBack

  Repeat
    case back_left 'or back_right  'If detected stay full speed
      0..440:                      'displays a zero
        outa[noparse][[/noparse]16..22]:= %0111111
        outa[noparse][[/noparse]27]:=0
        outa[noparse][[/noparse]26]:=0
                              
      441..880:                 'displays a one
        Outa[noparse][[/noparse]16..22]:= %0000110
        outa[noparse][[/noparse]27]:=0
        outa[noparse][[/noparse]26]:=0      
      881..1320:                 'displays a two
        Outa[noparse][[/noparse]16..22]:= %1011011
        outa[noparse][[/noparse]27]:=0
        outa[noparse][[/noparse]26]:=0
      1321..1760:                 'displays a three
        Outa[noparse][[/noparse]16..22]:= %1001111
        outa[noparse][[/noparse]27]:=0
        outa[noparse][[/noparse]26]:=0
      1761..4095:                 'displays a four
        Outa[noparse][[/noparse]16..22]:= %1100110
        outa[noparse][[/noparse]27]:=0
        outa[noparse][[/noparse]26]:=0
      other:                      'displays a five            
        Outa[noparse][[/noparse]16..22]:= %1101101'
       
                                
return

Pub SidetoSideOppDir
  'Repeat
    'Go backward 1 sec                                                                                                                                              
    'Spin to the right 10 degrees
    'If object detected
      'OUTA[noparse][[/noparse]27]:=0     full speed ahead
      'OUTA[noparse][[/noparse]27]:=0
    'elseif spin 10 degrees to the right

return

Pub SidetoSideSameDir
return       

PUB Read_IR_Sensor
dira[noparse][[/noparse]0..4]:= %00000                'Program Switches          Output
 dira:= 1                        'ADC Clock                Output
 dira[noparse][[/noparse]6]:= 0                        'ADC Data IN              Input
 dira[noparse][[/noparse]7..14]:= %11111111            'ADC Converters           Output
 dira[noparse][[/noparse]15]:= 1                       'Relay                    Output  
 dira[noparse][[/noparse]16..23]:= %11111111           'Seven Segment Display    Output
 dira[noparse][[/noparse]25..27]:= %111                'Relays                   Output

 OUTA[noparse][[/noparse]15]:=1
 OUTA[noparse][[/noparse]25..27]:= %111
 OUTA[noparse][[/noparse]ADC_CS5]:=1
 OUTA[noparse][[/noparse]ADC_CS6]:=1
 OUTA[noparse][[/noparse]ADC_CS7]:=1
 OUTA[noparse][[/noparse]ADC_CS8]:=1
 OUTA[noparse][[/noparse]ADC_CS9]:=1
 OUTA[noparse][[/noparse]ADC_CS10]:=1
 OUTA[noparse][[/noparse]ADC_CS11]:=1
 OUTA[noparse][[/noparse]ADC_CS12]:=1
    
  front_right:=0           
  front_left:=0                   
  back_right:=0                   
  back_left:=0                    
  rightside_front:=0              
  rightside_back:=0               
  leftside_front:=0               
  leftside_back:=0       
     
repeat     
  outa[noparse][[/noparse]23]:=1
  waitcnt(80_000_000+cnt)
       
  leftside_front:=read_adc(ADC_CS5)
  front_left:=read_adc(ADC_CS6)
  leftside_back:=read_adc(ADC_CS7)
  back_left:=read_adc(ADC_CS8)
  back_right:=read_adc(ADC_CS9)
  rightside_back:=read_adc(ADC_CS10)
  rightside_front:=read_adc(ADC_CS11)
  front_right:=read_adc(ADC_CS12)
  
  outa[noparse][[/noparse]23]:=0
  waitcnt(80_000_000 + cnt)

  
  
  

PUB read_adc(CS_PIN)  
      'All IR Sensors
  OUTA[noparse][[/noparse]ADC_CLK]:=0             'ADC Clock off
  OUTA[noparse][[/noparse]CS_PIN]:=0              'Bring Chip Select low (active)

  repeat 5
     counter:=cnt           'just a delay, no other purpose
     OUTA[noparse][[/noparse]ADC_CLK]:=!OUTA[noparse][[/noparse]ADC_CLK]         'ADC Clock on
  counter:=cnt           'just a delay, no other purpose  
  
  inc:=11                  'start at 11 and go to 0, 12 bits
  sensor:=0               'initialize the variable
  repeat 12                'repeating 12 times because there are 12 bits that we are shifting in                 
    OUTA[noparse][[/noparse]ADC_CLK]:=0         'ADC Clock off
    counter:=cnt           'just a delay, no other purpose 
    if (INA[noparse][[/noparse]ADC_DIN]==1)   'if the bit is a one
      sensor:=(sensor+(1<<inc))   'adds the decimal value of the binary bit using <<inc (first bit is 2048, second 1024, etc)   
    inc:=inc-1             'decrement the inc variable
    OUTA[noparse][[/noparse]ADC_CLK]:=1         'ADC Clock on           
    counter:=cnt           'just a delay, no other purpose
    'OUTA[noparse][[/noparse]ADC_CLK]:=1          'ADC Clock off
  OUTA[noparse][[/noparse]CS_PIN]:=1             'Bring Chip Select high (inactive)

return sensor
                                                
PUB i_o_setup

 dira[noparse][[/noparse]0..4]:= %00000                'Program Switches         Output
 dira:= 1                        'ADC Clock                Output
 dira[noparse][[/noparse]6]:= 0                        'ADC Data IN              Input
 dira[noparse][[/noparse]7..14]:= %11111111            'ADC Converters           Output
 dira[noparse][[/noparse]15]:= 1                       'Relay                    Output  
 dira[noparse][[/noparse]16..23]:= %11111111           'Seven Segment Display    Output
 dira[noparse][[/noparse]25..27]:= %111                'Relays                   Output

 OUTA[noparse][[/noparse]15]:=1
 OUTA[noparse][[/noparse]25..27]:= %111
 OUTA[noparse][[/noparse]ADC_CS5]:=1
 OUTA[noparse][[/noparse]ADC_CS6]:=1
 OUTA[noparse][[/noparse]ADC_CS7]:=1
 OUTA[noparse][[/noparse]ADC_CS8]:=1
 OUTA[noparse][[/noparse]ADC_CS9]:=1
 OUTA[noparse][[/noparse]ADC_CS10]:=1
 OUTA[noparse][[/noparse]ADC_CS11]:=1
 OUTA[noparse][[/noparse]ADC_CS12]:=1

return


Post Edited (HayONU) : 4/13/2009 10:54:21 PM GMT

Comments

  • Phil Pilgrim (PhiPi)Phil Pilgrim (PhiPi) Posts: 23,514
    edited 2009-04-13 22:38
    Since Spin is indent-sensitive, please enclose your program between [noparse][[/noparse]code] [noparse][[/noparse]/code] tags to preserve indentation. You can also format your program for posting here: www.phipi.com/format.

    -Phil
  • Mike GreenMike Green Posts: 23,101
    edited 2009-04-13 22:41
    1) Please do not cut and paste a long program like yours. Use the Attachment Manager for the forum. When you cut and paste, you lose the formatting which is crucial for understanding your program.

    2) There are no limits that I know of regarding calling methods within one object (file). There are also no limits regarding the use of global variables throughout one object (file). The only limitations have to do with calling from one object to another. There is no direct means to access variables in one object from another. You can access named constants and PUBlic methods from another object using the name of the object (object#constant and object.method).

    3) In an example as long and complex as yours, you really have to be much more specific about what's happening or not happening. It helps a lot, if possible, to shorten your program by eliminating things not necessary to illustrate what's happening.
  • StefanL38StefanL38 Posts: 2,292
    edited 2009-04-14 07:20
    Hello HayONU,

    two things:

    1.) the codeline DIRA := 1 seems strange to me
    there is no IO-Pin specified like DIRA[noparse][[/noparse]17] := 1

    2.) to test if the VARIABLES work OK modify your read_adc-method
    that it returns a HARDCODED value
    f.e. simple the adc_channel-number which is the parameter

    so ONLY for this debugging add a line of code

      sensor := CS_PIN
      'right before
      return sensor
    
    



    If this is working properly you know it is NOT the variable

    As you are working with 80MHz
    a delay of 80_000_000 means 1 second

    replace the codelines

      waitcnt(40_000_000+cnt)
      waitcnt(80_000_000+cnt)
    
    



    with

      waitcnt(ClkFreq / 2 + cnt) 'wait 0.5 seconds
      waitcnt(ClkFreq + cnt)    'wait 1 second
    
    



    best regards

    Stefan
  • MagIO2MagIO2 Posts: 2,243
    edited 2009-04-14 07:31
    DIRA := 1 if fine! (if the poster did it knowing what he did ;o)
    It's the same as
    DIRA[noparse][[/noparse]0] := 1
    But I guess here it is simply the formatting-problem "[noparse][[/noparse] 5 ]" is taken as font-size, if you don't have spaces between [noparse][[/noparse] and 5 and ].

    For better reading it's of course OK to have several dira assignments, but you can do it readable in one command-line as well:
    '        222 2 22221111 1 11111000 0 0 00000
    '        765 4 32109876 5 43210987 6 5 43210
    '
    DIRA := %111_0_11111111_1_11111111_0_1_00000
    '        ^   ^ 7 segm.  ^ ^        ^ ^ Program Switches
    '        |   N/A        | |        | ADC clock
    '        Relays         | |        ADC data in
    '                       | ADC converters
    '                       Relay
    

    That's readable and does not need as much memory.

    Why don't you call the i_o_setup in Read_IR_Sensor as well? At a first glance, the setup-code in Read_IR_Sensor is doing the same.

    In your original post you state: "Are there any limitations to calling methods from one cog to another ..."
    If your program is running in COG 1 you can't call methods in COG 2 from there. If you call a method in COG 1 it will also run in COG 1. If you want to run functions in COG 2 triggered by COG 1 you need a variable that both use. COG 1 writes the number of the command into it and COG 2 polls the variable to see if it should do something setting the value to 0 when it's done. So, COG 1 can wait for it or at leas wait until writing the next command value.

    What do you mean with 'calling variables'?

    All the methods like BackToBack, HeadToHead ... are endless loops. As they all run in one single COG, this COG will be blocked. Maybe what you intented to do was:
    Main program in COG 1
    Start sensor reading in COG 2
    repeat reading the·program switches
    ->·· if program switches·set,·start the·according method in COG 3 (using COGINIT)

    Problem here might be that COGINIT will stop the previous method wherever it was. Depending on the functionality, there might be a need to synchronize that, so that the method is stopped at a known place.


    Post Edited (MagIO2) : 4/14/2009 8:15:12 AM GMT
Sign In or Register to comment.