Shop OBEX P1 Docs P2 Docs Learn Events
Execution dying while scrambling serial debugger — Parallax Forums

Execution dying while scrambling serial debugger

dmwilson86dmwilson86 Posts: 27
edited 2011-04-15 03:37 in Propeller 1
I have some code that calls an object in a new cog, but calling the cog causes the rest of the code in the original cog to halt execution. When I use the serial debugger to try and debug, I get a bunch of nonsense in the output. Here is the code for the calling cog:
con
  _CLKMODE = XTAL1 + PLL16X
  _XINFREQ = 5_000_000
obj
  sinsynth : "sintabsynth"
  sawsynth : "sawtabsynth"
  trisynth : "triangletabsynth"
  squaresynth:"squaretabsynth"
  keyReader:"keyReader"
  DDS      : "DDS_PASM"
  Debug    : "FullDuplexSerial"
var      
  byte cog1   
  long cogStack1[50]  
  long playFreqs[5]
  long playPress[5]
  byte t1
pub main
 
  Debug.start(31,30,0,57600)
  waitcnt(clkfreq*4 + cnt)
  Debug.str(string("trying strings", $D))   
  cog1 := cognew(keyReader.Main(@playFreqs, @playPress), @cogStack1) + 1   
  repeat
   t1 := 0
   repeat while t1 < 6
    Debug.dec(playFreqs[t1])
    t1++
   waitcnt(clkfreq/6 + cnt)  
and here is the code that is causing the problem, which is the code that is loaded in the cog called by the code above:
CON
  _clkmode = xtal1 + pll16x
  _xinfreq = 5_000_000
 
  threshold = 300 
OBJ                         
  AD_DRVR : "MCP3208_DRIVER"
  Debug    : "FullDuplexSerial" 
VAR  'options: long, word or byte 
  byte keyRef
  byte playRef
  byte lowPlayKey    'lowest playset key pointer
  byte t1
  byte t2
  byte t3
  byte t4
  byte t5                            
  byte highestKeyIndex          
  byte adc     
  long keyReadings[24]      
  long cogStack[10]
  byte cog  
  'long highestKeyReading
PUB Main(playFreqs, playPress)
  Debug.start(31,30,0,57600)
  waitcnt(clkfreq*4 + cnt)
  Debug.str(string("trying strings2", $D))                       
  cog := cognew(GetKeyReadings, @cogStack) + 1
  repeat
    keyRef := 0
    repeat while keyRef < 25                        'iterate through key readings
      if keyReadings[keyRef] > threshold             'check if above the threshold
        playref := 0
        t1 := 0
        repeat while playRef < 6                   'now determine if key is already in playset
          if long[@Freqs][keyRef] == long[playFreqs][playRef]
             t1 := 1
             quit
          playRef++ 
        if t1 == 1                                 'if key is already in the playset....
          long[playPress][playRef] := keyReadings[keyRef]  'then update the pressure
        else                                       'if key is not already in the playset
          playRef := 0
          t1 := 0
          repeat while playRef < 6                'determine if there are 6 keys already in the playset
            if long[playFreqs][playRef] == 0
              t1 := 1
              quit
            playRef++
        if t1 == 1                               'if there aren't 6 keys already in the playset..
          long[playFreqs][playRef] := long[@Freqs][keyRef] 'then add the key freq and pressure to the playset
          long[playPress][playRef] := keyReadings[keyRef]  
        else                                     'if there are 6 keys already in the playset...
          playRef := 0                           'then find lowest key in the playset  
          t1 := 0
          t2 := 4095                                      
          repeat while playRef < 6
            t1 := long[playPress][playRef] 
            if t1 < t2
              t2 := t1
              't5 := playRef
            playRef++
          long[playFreqs][t2] := long[@Freqs][keyRef] 't2 now has the lowest key, so replace it using keyRef
          long[playPress][t2] := keyReadings[keyRef]     
      else                                         'keyReading is not above threshold
        playref := 0
        t1 := 0
        repeat while playRef < 6                   'determine if key is already in playset
          if long[@Freqs][keyRef] == long[playFreqs][playRef]
             t1 := 1
             quit
          playRef++
        if t1 == 1                                  'if it's in the playset
           long[playPress][playRef] := 0           'then delete it
           long[playPress][playRef] := 0  
      keyRef++
 
 
 
PUB GetKeyReadings                                
  repeat        
    t3 := 0 'keeps track of the key we're reading
    adc := 0 'keeps track of the adc IC we're reading from
    repeat while adc =< 3
      if adc == 0
        AD_DRVR.start(21,20,19,0)
      elseif adc == 1
        AD_DRVR.start(18,17,16,0)
      elseif adc == 2
        AD_DRVR.start(13,14,15,0)
      elseif adc == 3
        AD_DRVR.start(10,11,12,0)
      t4 := 0 'keeps track of the adc channel we're reading from
      repeat while t4=<7
        if (adc==1 AND t4>3) OR (adc==3 AND t4>4)
          quit
        keyReadings[t3] := AD_DRVR.in(t4)
        t4++
        t3++      
      adc++                   
DAT
'Define the frequencies for the middle octave                                                                 
Freqs   long 523,494,466,440,415,392,369,349,330,311,294,277,262,247,233,220,208,196,185,175,165,156,147,139,131

I tried making cogStack1's length higher in the calling code, but that didn't change anything. Any suggestions? It may be something obvious, I've only been propelling for a couple months now. Thanks for the help.

Comments

  • dmwilson86dmwilson86 Posts: 27
    edited 2011-04-13 12:17
    In the manual it is clearly stated that you cannot launch another object's method in the COGNEW command. So to fix, we create a start function in the external object, and call the cognew command from there. Thanks to all those checking the problem out...I just needed to read the documentation a little more closely.
  • StefanL38StefanL38 Posts: 2,292
    edited 2011-04-13 21:56
    Hi Wilson,

    form a quick look at your code I can say starting the FullDuplexSerial-object in two different cogs must end in mixed up nonsense-output

    the two cogs run independent from each other say both are trying to send characters at the same time which mixes up the output completely.

    for debugging you could use the EZLog-tool from hannoware http://hannoware.com/ezlog/

    It allows to monitor variables while your code is running in the same way as without watching them.
    This is possible beause EZLog starts an independent working cog to transfer the debug-data

    best regards

    Stefan
  • dmwilson86dmwilson86 Posts: 27
    edited 2011-04-15 03:37
    StefanL38 wrote: »
    Hi Wilson,

    form a quick look at your code I can say starting the FullDuplexSerial-object in two different cogs must end in mixed up nonsense-output

    the two cogs run independent from each other say both are trying to send characters at the same time which mixes up the output completely.

    for debugging you could use the EZLog-tool from hannoware http://hannoware.com/ezlog/

    It allows to monitor variables while your code is running in the same way as without watching them.
    This is possible beause EZLog starts an independent working cog to transfer the debug-data

    best regards

    Stefan
    Ooh, yeah....I hadn't thought about that! Great! Thanks so much for the tip, I will try out the ezlog early this afternoon!
Sign In or Register to comment.