Shop OBEX P1 Docs P2 Docs Learn Events
Program Doesn't Work When Clock Speed Changed — Parallax Forums

Program Doesn't Work When Clock Speed Changed

pharylonpharylon Posts: 5
edited 2013-06-23 17:08 in General Discussion
A forum member here, __red__, is having a class for a few people on Propeller. We got the chips, built some boards, and built some name badges with a 7 x 8 grid of charliplexed LEDs.

So, I decided to write Snake for our badges. This is literally my first Spin program ever. And it works just fine. But, for various reasons, now I'm trying to turn up the clock speed. I *know* I have the right Crystal speed and everything, because I've loaded another program on my badge that uses these exact settings and *that* program works just fine.

However, I can't for the life of me figure out what's going on with my Snake game. When I add in the higher clockspeed settings in the CON block and flash it to RAM, the program just doesn't work. One single LED flashes once, and then it crashes and goes back to the program in the EEPROM.

Here's the code, with the clock settings I'm trying to use commented out. You can also see some other attempts at using different waitcnt() values in an attempt to fix it. Obviously, none of them have worked. :\

I've also tried removing the waits altogether, and instead of having the game run at a speed far to fast for a human to respond to (which is what I would expect)... it still just crashes.

Anyone have any suggestions? I read the Prop Manual, but there's nothing obvious about why it would cause the program to crash.
CON
'_clkmode=xtal1+pll8x         'Run at 16x5 = 80mhz!
'_xinfreq=5_000_000            'We are using a 5Mhz Crystal  


GameSpeedMultiplier = 4   
StartingPixels = 4
XBounds = 7
YBounds = 6
S2Pin = 17
S3Pin = 18
S4Pin = 19






OBJ
rr: "RealRandom.spin"


VAR
byte SnakePixelsX[56]
byte SnakePixelsY[56]
byte CurrentLength
long DrawStack[20]
long MoveStack[20]
long InputStack[20]
long GraphicsCogID
byte CurrentDirection  ' 0 is up, 1 is right, 2 is down, 3 is left.
long RandomSeed
byte FruitX
byte FruitY
byte FruitExists
byte GameOver
byte TurnQueued


PUB Main | i
initializeSnake
cognew(Graphics, @DrawStack)
cognew(Input, @InputStack)
GenerateFruit 
repeat while GameOver == 0
  Move
waitcnt(clkfreq * 2 + cnt)
'waitcnt(500000 + cnt)
COGSTOP(GraphicsCogID)
repeat
  DrawX




pub Input
repeat
  if ina[S2Pin] == 0 AND TurnQueued == 0 
    TurnQueued := 1 
    TurnCounterClockwise
    waitcnt(clkfreq/5 + cnt)
    'waitcnt(500000 + cnt)
    WatchForButtonRelease(S2PIN)
  elseif ina[S4Pin] == 0 AND TurnQueued == 0
    TurnQueued := 1
    TurnClockwise
    waitcnt(clkfreq/5 + cnt)
    'waitcnt(500000 + cnt)
    WatchForButtonRelease(S4PIN) 


pri WatchForButtonRelease (PIN) | i
repeat while i < 2
  if ina[PIN] == 1
    i++ 
  
pri TurnCounterClockwise
  if CurrentDirection == 0
    CurrentDirection := 3
  else
    CurrentDirection -= 1


pri TurnClockwise
  if CurrentDirection == 3
    CurrentDirection := 0
  else
    CurrentDirection += 1


pri Move | collision,i
waitcnt(clkfreq/GameSpeedMultiplier + cnt)
'waitcnt(500000 + cnt)
collision := DetectFruitCollision
if collision == 1
  eatFruit
repeat i from CurrentLength -1 to 1
  SnakePixelsX[i] := SnakePixelsX[i - 1]
  SnakePixelsY[i] := SnakePixelsY[i - 1]
if CurrentDirection == 0
  SnakePixelsY[0] += 1
elseif CurrentDirection == 1
  SnakePixelsX[0] -= 1
elseif CurrentDirection == 2
  SnakePixelsY[0] -= 1
else
  SnakePixelsX[0] += 1
DetectOutOfBounds
DetectSelfCollision
TurnQueued := 0


pri DetectSelfCollision | i,n
repeat i from 0 to CurrentLength - 1
  repeat n from 0 to CurrentLength - 1
    ifnot i == n
      if SnakePixelsX[i] == SnakePixelsX[n] AND SnakePixelsY[i] == SnakePixelsY[n]
        FruitX := SnakePixelsX[i]
        FruitY := SnakePixelsY[i]
        FruitExists := 1
        GameOver := 1 


pri DetectOutOfBounds | i
repeat i from 0 to CurrentLength - 1
  if SnakePixelsX[i] > XBounds OR SnakePixelsY[i] > YBounds
    GameOver := 1
    FruitX := SnakePixelsX[i+1]
    FruitY := SnakePixelsY[i+1]
  elseif SnakePixelsX[i] < 0 OR SnakePixelsY[i] < 0
    GameOver := 1
    FruitX := SnakePixelsX[i+1]
    FruitY := SnakePixelsY[i+1]
  
pri eatFruit
FruitExists := 0
SnakePixelsX[currentLength] := SnakePixelsX[CurrentLength - 1]
SnakePixelsY[currentLength] := SnakePixelsY[CurrentLength - 1]
GenerateFruit
CurrentLength++  


  
pri clearScreen
dira[20..27] := 0




pri Graphics | i,Counter
GraphicsCogID := COGID
repeat
  if GameOver == 0
    repeat i from 0 to CurrentLength - 1
      lightPixel(SnakePixelsX[i], SnakePixelsY[i])
  elseif GameOver == 1
     repeat i from 1 to CurrentLength - 1
      if SnakePixelsX[i] <> FruitX OR SnakePixelsY[i] <> FruitY
        lightPixel(SnakePixelsX[i], SnakePixelsY[i])
  if FruitExists == 1 AND Counter > 50
    lightPixel(FruitX, FruitY)
    Counter := 0
  Counter++
    
  


pri GenerateFruit | collision
collision := 1
repeat while collision == 1
  fruitX := Roll(0, 7)
  fruitY := Roll(0, 6)
  collision := DetectFruitCollision
FruitExists := 1
  


pri DetectFruitCollision | collision, i
repeat i from 0 to CurrentLength - 1
  if FruitX == SnakePixelsX[i] AND FruitY == SnakePixelsY[i]
    collision := 1
return collision




pri Roll(minValue, maxValue) : returnValue
returnValue := ||(RandomSeed?//256)
repeat while returnValue < minValue OR returnValue > maxValue
  returnValue := ||(RandomSeed?//256)
return returnValue




pri lightPixel(X, Y)
dira[20..27] := 0
dira[X + 20] := 1
outa[X + 20] := 0
if X > Y
  dira[Y + 20] := 1
  outa[Y + 20] := 1
else
  dira[Y + 21] := 1
  outa[Y + 21] := 1


pri DrawX | i
repeat i from 0 to 7
  lightPixel(i, i)
  lightPixel(i, XBounds - (i + 1)) 


Pri initializeSnake
CurrentDirection := 1
CurrentLength := 4
SnakePixelsX[0] := 4
SnakePixelsY[0] := 3
SnakePixelsX[1] := 5
SnakePixelsY[1] := 3
SnakePixelsX[2] := 6
SnakePixelsY[2] := 3
SnakePixelsX[3] := 7
SnakePixelsY[3] := 3
rr.Start
RandomSeed := rr.Random
rr.Stop
dira[S2Pin] := 0
dira[S3Pin] := 0
dira[S4Pin] := 0

Comments

  • MicksterMickster Posts: 2,694
    edited 2013-06-16 11:38
    Top line should be Pll16x ........if the comments reflect what you are attempting.

    Mickster

    P.S. Oh wait. You have "xinfreq" but your prog requires the following, I believe:

    _clkmode = xtal1 + pll16x
    _clkfreq = 80_000_000

    Or maybe not....I see there's both in other sample progs.
  • Cluso99Cluso99 Posts: 18,069
    edited 2013-06-16 14:33
    This is what you want...
      _CLKMODE = XTAL1 + PLL16X     'Set to ext low-speed xtal, 16x PLL
      _XINFREQ = 5_000_000          'Xtal 5MHz
    
  • pharylonpharylon Posts: 5
    edited 2013-06-23 05:03
    Thanks for your help guys. For the record, while I did have the clock speed set wrong, the whole issue was just a battery that wasn't providing enough juice, causing issues with multiple cores (that got worse as I increased the speed).
  • LoopyBytelooseLoopyByteloose Posts: 12,537
    edited 2013-06-23 09:02
    I guess you are saying that in spite of the typo in the clock configuration, it ran... even if not correctly.
  • pharylonpharylon Posts: 5
    edited 2013-06-23 17:08
    More or less. It didn't match the comments, but pll8x is a valid clock speed, and it should have run. I think the battery was just on the edge of dying. So it'd run at the slower clock speeds, but not at either 8x or 16x.
Sign In or Register to comment.