Shop OBEX P1 Docs P2 Docs Learn Events
Hard Reset Problem (Very hard reset) — Parallax Forums

Hard Reset Problem (Very hard reset)

edited 2011-03-04 19:31 in Propeller 1
I would like to pre-thank you guys, I have lurked for quite a while and asked my very first question just a week or so ago. I found friendly people and good answers and I appreciate that. I am running into a weird issue and I hope the same will happen with this problem.

I am running a Gadget Gangster USB prop board on Walter, my robot. Walter is about as big as a dog, weighs about 80 lbs and is super awesome. The major parts (that would have any bearing to this conversation) are the main board, a Arduino-based motor driver board speaking i2c, a second arduino that simply fires off my (4) sonars and sends the data to the prop (UART serial), a thumb-drive mp3 player (speaking serial) and a i2c servo driver board. The 5V regulator (on the prop board itself) has been jumped (per manufacturer's instructions) and 5v power is supplied by an external 5v 3A regulator. Everything else --main drive and servos have their own volt regulators. Juice comes from a big ol' 12V SLA battery. There is more --blinkM's etc. but nothing else worth mentioning.

I am having problems with the chip/board doing it's own "hard reset". This is a new problem, and did not exist in the past using the same hardware and similar code. When I say "hard reset" I mean that the main 5V power supply is being pulled low. I even caught it on a scope. This is a picture of the reset. When this was taken, I had the probe on the main 5V supply (from the 5v regulator and the same supply that feeds everything 5v) and the ground.

Attachment not found.

You can see that "something" is yanking my power down to nothing. It is the same swoop down to low then a square corner and it shoots back to high. The O-scope says that every reset is exactly the same length give or take a few uS. If you have turned the board on for the first time, the reset happens after about 4 minutes. If you let it run from there, the resets come more frequently --sometimes every 15 or 20 seconds. They resets seem to also happen more when more cogs are running. Removing the WiiCamera object and code seems to help but I can't confirm that removing it fixes my problem. I would have thought this was an "overflow" or a "null-style" problem (it feels like that kinda problem), but I don't like the looks of the scope trace --This is not just some kinda internal reset from code that blew-up, something is pulling down hard.

A click to the .spin file is just below.
[PHP]
CON
        _clkmode                =xtal1 + pll16x
        _xinfreq                =5_000_000

        TO_IN                   =73_746   'Conversion needed for SRF-05's
        
        FWTC                    =6   'forward way too close
        FD                      =18  'standard fwd danger
        FTC90                   =14  'too close to do a 90 slide turn
        DT                      =28  'done turning (90 off of sonar)
        WTT                     =30  'Want to start turning
        WSD                     =14  'Wall side danger
        CT                      =2   'Center Threashold
        STTW                    =12  'stop turning this way
        ST                      =18  'Something there side
        OFF                     =100 'motors off
        SpeedUp                 =0   'horrible work-around for dying battery --gotta finish calibration thing
        
        sclpin                  =23  'sda = scl+1
        clockpin                =25  'This is the WiiCamera Stuff
        resetpin                =26
        
OBJ

  i2cMotors      : "i2cObjectarduino"   'i2c lines for the motor driver 
  i2cObject      : "i2cObjectBlinkm"  'all servos, I/O expander,
  i2cObject2      : "i2cObjectBlinkm"  'BlinkM;s
  text           : "ORE_TV_Text_009"   'I guess we are going with Game Boy Text
  Encoder        : "Quadrature Encoder"
  Mp3            : "Simple_Serial"
  Arduino        : "Simple_Serial"
  Numbers        : "Numbers"
  wii            : "wiicamera"
  
VAR

    long Pos[3]              'this is for the encoders
    byte tbuf[20]            'this is for fsrw SD card    ??? I think...
    byte range[5]            'this is for the sonar

    byte FLspeed,FRspeed,BLspeed,BRspeed   'FwdLeft, FwdRight, BackLeft BackRight
    byte FLoff,FRoff,BLoff,BRoff           'These are offsets or "overshoot" numbers when using the encoders to turn and stop
    byte TXmode,DriveMode,TurnMode,OverRideTurn,TurnRequested

    byte Rxleft,Rxright,buttons  'these are X-bee numbers coming in

    byte ServoRequested[11]
    byte ServoCurrent[11]
    byte ServoStatic[4]
    long Seconds

    byte blinkM
    
    byte mp3str[4]
    byte mp3str2[5]
    byte mp3str3[10]
    byte PlayNow
    
    long Stack[600]

    byte BeaconFound,BeaconFollow,GoHome,goingup,PlayingQuirk
    long Width,Height,WiiCenterX,WiiCenterY
    long wiix[5]
    long wiiy[5]
    long wiisize
    long out_data[36]

    byte ArduinoData[5]

    
PUB init  | i

  text.start(12)  
  waitcnt(clkfreq*5 + cnt)    'this is warm-up time for the mp3 player 
  
  'wii.Start (sclpin,clockpin,resetpin)    'fire up the wii camera
  'wii.initcam(3,@level2)  
  
  i2cObject.Init(29,28,true)  'Servo driver, Compass, etc
  i2cObject.Start

  i2cObject2.Init(9,8,true)  'blinkM's  --Gotta desolder pull-ups so  these will play nice with the other i2c stuff --get your pins back
  i2cObject2.Start
  i2cObject2.blinkroutine(10,3)
  
  i:=1
  Repeat 10
    ServoCurrent[i]:=125             'Pre-load all the servo arrays with "centered"
    ServoRequested[i]:=125
    i++
    
  i2cObject.head(125,125,125)        'Center all the servos
  i2cObject.tophat(125)
  i2cObject.sonarservos(125,125) 
  i2cObject.laser(125,125)         
  i2cObject.camera(125,125)
  
  Encoder.Stop
  Encoder.Start(4, 2, 0, @Pos)       'Clear and fire up encoders
 
  Mp3.init(10,11,9600)               'mp3 serial
  Arduino.init(27,22,9600)           'arduino (sensors) serial

  Mp3.str(string("E"))               'are you there? echo
  Mp3.tx(13)
  waitcnt(clkfreq  + cnt)  
  Mp3.str(string("IPA"))             'this is "commands in ASCII", I think
  Mp3.tx(13)
  waitcnt(clkfreq/2  + cnt)
  Mp3.str(string("SCS"))             'shortened command set
  Mp3.tx(13)
  waitcnt(clkfreq*2 + cnt)

    
  FLspeed:=151                       'finish the calibration routine stuff and fix this 
  FRspeed:=160                       'this "slow down as the battery dies" is getting old.
  BLspeed:=52
  BRspeed:=44
  FLoff:=12
  FRoff:=3
  BLoff:=13
  BRoff:=4

  DriveMode:=0       'main drive is off
  BlinkM:=10         'this is the regular loop with all colors
  Overrideturn:=0    'clear override
  BeaconFound:=0     'number of points of IR light found
  BeaconFollow:=0    '1= wiicamera servo will scan (x only) for a beacon -when found, locks on.
  TurnRequested:=0   'used with docking, "beacon follow" and "IR follow-the-leader"

    
  'COGS So Far
  
  'Main loop
  'Servos and "seconds" counter
  'Encoders
  'TV
  'Drive
  'Wiimote
  'Arduino  --this is the arduino doing the sonar, not the motordriver arduino

  
  cognew(Servos,@stack)                   'to try to fix the hard-reset problem, I have tried removing some and all of these 
  cognew(ArduinoListen,@stack[100])       'it does not seem to matter what is running
  cognew(Drive,@stack[200])
  
  Main
    
PUB Main   | x,stoppos,remheadsec,remquirksec,firsttime

  
  DriveMode:=0     '0=Off 1=Reg Auto    2=IR Follow the Leader with no sensors   3=R/C
  OverRideTurn:=0
  TurnRequested:=0
  BeaconFollow:=0   
  GoHome:=0 
  Playmp3(64)                '  "Hello, I am Walter"
  waitcnt(clkfreq*3 + cnt)
  Playmp3(58)                '  "Autonomous Mode"
  RemHeadSec:=seconds        ' timer for head moves
  RemQuirkSec:=seconds       ' timer for all personallity events
   
repeat
       
  Display(2)
   
  if gohome<>1                         'If we are not in "follow the beacon" or "docking" mode
    if seconds=>RemHeadSec+2
      StaticHead(x)                     'x is "randomized" each loop
      RemHeadsec:=seconds               'reset the timer
    
  if seconds=>RemQuirksec+60 and PlayingQuirk==0    '  "personallity" quirk is just docking for now
     StaticHead(1)                                ' center head
     PlayingQuirk:=1                              ' set flag
     Firsttime:=0                                 ' clear "do it once" flag
     gohome:=1                                    ' set "request for docking" flag
     BeaconFollow:=1                              ' request wiicamera scanning and lock-on routine
     BlinkM:=14 'red                              ' eyes to red(s)
                   
  if gohome==1
     ServoRequested[1]:=ServoCurrent[6]           'Head rotate now follows wiicamera rotate --so he looks at the beacon
     CheckForBeacon                               'Duh, its the check-for-beacon routine!      
                                 
     if beaconfound>0                             'If we have found the beacon
        
        if FirstTime==0                         'if we just found it
          FirstTime:=1                          ' set "we did it already" flag
          DriveMode:=0                          ' kill drive and stop
          waitcnt(clkfreq + cnt)
          PlayMp3(79)                           ' "beacon detected"
          waitcnt(clkfreq*2 + cnt)
          PlayMp3(30)                           ' "Starting docking routine"
          waitcnt(clkfreq*2 + cnt)
          DriveMode:=1                          ' Fire up drive again
          
        if wiisize<3
          DriveMode:=1                          'as long as we keep seeing the beam --drive in that direction 
          case ServoCurrent[6]                  'angle of the wiicamera servo tells us which way to steer
            1..52   : TurnRequested :=11        'slight left
            53..105 : TurnRequested :=12        'hard left
            106..145: TurnRequested :=0         'fwd
            146..198: TurnRequested :=13        'hard right
            199..255: TurnRequested :=14        'slight right
              
        if wiisize==3                           'if the blob size is the same as threashold (we are given distance from target)
          OverRideTurn:=9
          DriveMode:=0                          'kill motors
          BlinkM:=13  'blue                     'blue eyes
          waitcnt(clkfreq/4 + cnt)
          PlayMp3(61)                           'I am docked
          waitcnt(clkfreq*4 + cnt)
          PlayMp3(29)                           ' "I am leaving the dock"
          waitcnt(clkfreq*2 + cnt)
          OverRideTurn:=0                       'clear everything
          GoHome:=0
          Beaconfollow:=0            
          TurnRequested:=0
          DriveMode:=1                          'start drive back up
          PlayingQuirk:=0                       'clear the personallity flag
          RemQuirkSec:=seconds                    'restart the personallity timer

  x++       
  if x==25    'this is "random" generator --used to select "random" headmoves during auto mode
    x:=1

PUB Drive  | stoppos

  i2cMotors.init(21,20,true)  'Main Drive  --This is i2c to the arduino slave on the motor driver board
  i2cMotors.Start
  
repeat  
  if DriveMode==0   'this is main drive on/off
    motormath(OFF,OFF)
    
  if DriveMode==1   'this is main drive on/off and "modes" R/C etc.  

    
    turnmode:=TurnRequested   'start with a turn request --if we don't do a sensor-turn, it will be executed.

    if range[1]<FWTC or range[2]<FWTC 'if either fwd is way too close this is WTC routine
      motormath(OFF,OFF)
      stoppos:=-60            
      waitcnt(clkfreq*2 + cnt)
      Encoder.Stop                        'clear encoders
      Encoder.Start(4, 2, 0, @Pos)        'start encoders
         
      repeat until Pos[0]=<stoppos        'backup 6 inches off of left wheel       
        motormath(BLspeed,BRspeed)
        waitcnt(clkfreq/1000*5 + cnt)     ' a little hiccup to keep from fire-hosing my motor driver with data
      
      motormath(OFF,OFF) 
      waitcnt(clkfreq + cnt)
      Encoder.Stop                        'clear the encoders
      Encoder.Start(4, 2, 0, @Pos)
      stoppos:=35
      
      If range[3]>range[4]
        repeat until Pos[1]=>stoppos        'spin to the left away from "way too close" off of encoders     
          motormath(BLspeed,FRspeed)
          waitcnt(clkfreq/1000*5 + cnt)
      else
        repeat until Pos[0]=<stoppos        'spin to the right away from "way too close" off of encoders   
          motormath(FLspeed,BRspeed)
          waitcnt(clkfreq/1000*5 + cnt)
          
      motormath(OFF,OFF)
      waitcnt(clkfreq*2 + cnt)              
      Encoder.Stop                          'we're done --restart the encoders --back to the main routine
      Encoder.Start(4, 2, 0, @Pos)      
      turnmode:=0  
   
    if range[3]<WSD                         'Wall side danger 
      turnmode:=3                           'wall slide to the right  
     
    if range[4]<WSD                         'Wall side danger    
      turnmode:=4                           'wall slide to the left  
     
    if range[1]<WTT and range[2]<WTT        'both forward sonars see something coming up
      if range[3]>Range[4] and Range[3]>ST  'if left is more open  and it is farther than "something there" then turn that way
          turnmode:=1        
      else
        If Range[4]>ST
          turnmode:=2                       'or turn the other way
               
    if range[1]<FD
      turnmode:=5                           'one fwd sonar < forward danger
      
    if range[2]<FD
      turnmode:=6                           'one fwd sonar < forward danger       
               
    if turnmode==1 or turnmode==6
      if range[2]<FTC90
        turnmode:=7                         'slide to left is now a spin  --we got too close
    
    if turnmode==2 or turnmode==5
      if range[1]<FTC90
        turnmode:=8                         'slide right is now a spin    --we got too close

    if overrideturn>0
      turnmode:=overrideturn                'screw the sonar, the main  loop knows better --override turn and do what I say --then clear it
      overrideturn:=0
       
    case turnmode   
      0: motormath(FLspeed,FRspeed)    'Forward
       
      1: 
        repeat
          motormath(OFF,FRspeed)        'slide to left    
       
          if range[2]<FTC90              
            quit 
          if range[2]>DT and range[1]>DT              
            quit
          if range[1]<FWTC or range[2]<FWTC              
            quit
            
      2: 
        repeat 
          motormath(FLspeed,OFF)        'slide to right
       
          if range[1]<FTC90              
            quit
          if range[1]>DT and range[2]>DT              
            quit
          if range[1]<FWTC or range[2]<FWTC              
            quit
                        
      3:        
        motormath(FLspeed,FRspeed-20)   '1/2 power wall slide to right   
                
      4:         
        motormath(FLspeed-15,FRspeed)   '1/2 power wall slide to left     
           
      5: 
        repeat
          motormath(FLspeed,OFF)        'slide around corner 90 right
       
          if range[1]<FTC90
            quit
          if range[1]>DT
            quit
          if range[1]<FWTC or range[2]<FWTC
            quit
                   
      6: 
        repeat
          motormath(OFF,FRspeed)       'slide around corner 90 left
       
          if range[2]<FTC90
            quit
          if range[2]>DT
            quit
          if range[1]<FWTC or range[2]<FWTC
            quit
               
      7: 
        repeat
          motormath(BLspeed,FRspeed)    'left spin
       
          if range[2]>DT and range[1]>DT
            quit
          if range[1]<FWTC or range[2]<FWTC
            quit
                          
      8: 
        repeat
          motormath(FLspeed,BRspeed)     'right spin
       
          if range[2]>DT and range[1]>DT
            quit
          if range[1]<FWTC or range[2]<FWTC
            quit
            
      9: motormath(OFF,OFF) 'this is allstop because of WTC  ***Remember to deal with this in main loop   
       
      10: motormath(OFF,OFF) 'get around to making this a ramped stop
       
      11:  motormath(FLspeed-20,FRspeed) 'Hard left wii IR     
          
      12:  motormath(FLspeed-10,FRspeed)'Soft Left Wii IR   
       
      13:  motormath(FLspeed,FRspeed-10) 'Soft Right Wii IR    
       
      14:  motormath(FLspeed,FRspeed-20) 'Hard right wii IR
               
      15: 'fwd off encoders
       
      16: 'rev off encoders       
        
      17: 'encoder spin left
       
      18: 'encoder spin right
    
PUB CheckForBeacon  | requesttemp,requesttemp2

  
  wii.getblobs (@out_data)
  wiix[1]:=wii.getx(@out_data,3,0)
  wiiy[1]:=wii.gety(@out_data,3,0)

  wiisize:=wii.getsize(@out_data,3,0)
  
  wiix[2]:=wii.getx(@out_data,3,1)
  wiiy[2]:=wii.gety(@out_data,3,1)
  wiix[3]:=wii.getx(@out_data,3,2)
  wiiy[3]:=wii.gety(@out_data,3,2)
  wiix[4]:=wii.getx(@out_data,3,3)
  wiiy[4]:=wii.gety(@out_data,3,3)

  beaconfound:=0
  if wiix[1]<>1023 
    beaconfound:=1
  if wiix[1]<>1023 and wiix[2]<>1023 
    beaconfound:=2
  if wiix[1]<>1023 and wiix[2]<>1023 and wiix[3]<>1023
    beaconfound:=3
  if wiix[1]<>1023 and wiix[2]<>1023 and wiix[3]<>1023 and wiix[4]<>1023
    beaconfound:=4

if beaconfollow==1    
  case beaconfound

    0:
      if goingup==1
        Servocurrent[6]:=Servocurrent[6]+2        
      if goingup==0
        Servocurrent[6]:=Servocurrent[6]-2
        
      if Servocurrent[6]>245
        goingup:=0
      if Servocurrent[6]<10
        goingup:=1

      ServoCurrent[7]:=100
          Width:=0
          
    1:
      Width:=0
      if Wiix[1]<400
        requesttemp:=Servocurrent[6]+20        
        requesttemp:=requesttemp<#250 #>1
        ServoCurrent[6]:=requesttemp
              
      if Wiix[1]>600
        requesttemp:=Servocurrent[6]-20        
        requesttemp:=requesttemp<#250 #>1
        ServoCurrent[6]:=requesttemp 
       
      if WiiY[1]<300
        requesttemp2:=Servocurrent[7]+10        
        requesttemp2:=requesttemp2<#250 #>1
        ServoCurrent[7]:=requesttemp2
              
      if WiiY[1]>700
        requesttemp2:=Servocurrent[7]-10        
        requesttemp2:=requesttemp2<#250 #>1
        ServoCurrent[7]:=requesttemp2   
    2:
      Width:=||(wiix[2]-wiix[1])
      WiiCenterY:=(wiiy[1]+wiiy[2])/2
      
      if wiix[1]<wiix[2]
        WiicenterX:=Wiix[1]+(width/2)
      else
        WiicenterX:=Wiix[2]+(width/2)
            
      
      if BeaconFollow:=1
        if WiicenterX<400
          requesttemp:=Servocurrent[6]+20        
          requesttemp:=requesttemp<#250 #>1
          ServoCurrent[6]:=requesttemp
                
        if WiicenterX>600
          requesttemp:=Servocurrent[6]-20        
          requesttemp:=requesttemp<#250 #>1
          ServoCurrent[6]:=requesttemp   
         
        if WiiCenterY<300
          requesttemp2:=Servocurrent[7]+10        
          requesttemp2:=requesttemp2<#250 #>1
          ServoCurrent[7]:=requesttemp2
                
        if WiiCenterY>700
          requesttemp2:=Servocurrent[7]-10        
          requesttemp2:=requesttemp2<#250 #>1
          ServoCurrent[7]:=requesttemp2    
   
else
  ServoRequested[6]:=125
  ServoRequested[7]:=100
  Width:=0    
             
PUB Display(Data)  | temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8,c,d,e

  c:=$07 'white 
  d:=$78 'blue
  e:=$78 'blue
    
  case Data
  
    1:
      text.cls
      drawbox(0,0,20,24,d,d,d) 'main border      
      drawbox(1,1,18,3,d,d,d)  'top title box
      text.str(2,2,string("   Stand By "))
      text.updatescreen


    2:                    ''this is auto 
      temp3:=20
      temp1:=range[1]
      temp1:=temp1<#30
      temp1:=temp1#>1
      temp1:=temp1/2
      
      temp4:=20
      temp2:=range[2]
      temp2:=temp2<#30
      temp2:=temp2#>1
      temp2:=temp2/2    
   
      temp6:=10
      temp5:=range[4]-4
      temp5:=temp5<#15
      temp5:=temp5#>1
      temp5:=temp5/3 #>1
   
      temp8:=9
      temp7:=range[3]
      temp7:=temp7<#15
      temp7:=temp7#>1
      temp7:=temp7/3 #>1
       
      text.cls
      drawbox(0,0,20,24,d,d,d) 'main border
      drawbox(1,4,3,19,d,d,d)  'fwd sonar L
      drawbox(16,4,3,19,d,d,d)  'fwd sonar R
      drawbox(4,20,12,3,d,d,d)  'side sonar
      drawbox(1,1,18,3,d,d,d)  'top title box
          
      repeat temp1 
        text.PokeChar(2,temp3,c,c,c,$0F)
        temp3--
      repeat temp2 
        text.PokeChar(17,temp4,c,c,c,$0F)
        temp4--
      repeat temp5
        text.PokeChar(temp6,21,c,c,c,$0F)
        temp6++
      repeat temp7
        text.PokeChar(temp8,21,c,c,c,$0F)
        temp8--
         
      text.str(2,2,string("Autonomous  Mode"))
      text.str(4,5,string("In/Sec"))
      text.dec(11,5,9)                  'place keepre
      text.str(4,7,string("LWheel"))
      text.dec(11,7,Pos[0])
      text.str(4,9,string("RWheel"))
      text.dec(11,9,Pos[1])
      text.str(4,11,string("LSpeed"))
      text.dec(11,11,FLspeed)           'this is a place keeper
      text.str(4,13,string("RSpeed"))
      text.dec(11,13,FRspeed)      
      text.str(4,15,string("T.Mode"))   
      text.dec(11,15,turnmode)     
      text.str(4,17,string("Second"))   'this is a place keeper
      text.dec(11,17,seconds)   
      text.updatescreen  

      
    3:
      text.cls
      drawbox(0,0,20,24,d,d,d) 'main border      
      drawbox(1,1,18,3,d,d,d)  'top title box
      text.str(2,2,string(" X-Bee Watching "))
      text.str(4,7,string("Left"))
      text.dec(12,7,Rxleft)
      text.str(4,9,string("Right"))
      text.dec(12,9,Rxright)
      text.str(4,15,string("Buttons"))
      text.dec(12,15,buttons)
      text.str(4,17,string("Seconds"))
      text.dec(12,17,Seconds)         
      text.updatescreen        
      text.updatescreen

    4:    'this is mp3 playback
      text.cls
      drawbox(0,0,20,24,d,d,d) 'main border      
      drawbox(1,1,18,3,d,d,d)  'top title box
      text.str(2,2,string("  Mp3 Player  "))      
      text.str(5,8,string("Playing Track"))
      text.str(5,10,string(" Place Keeper "))         
      text.UpdateScreen

    5:
      text.cls
      drawbox(0,0,20,24,d,d,d) 'main border      
      drawbox(1,1,18,3,d,d,d)  'top title box    
      text.str(2,2,string("Wii Camera Watch"))
      text.str(3,6,string("WiiX"))
      text.dec(13,6,wiix[1])
      text.str(3,8,string("WiiY"))
      text.dec(13,8,wiiy[1])
      text.str(3,10,string("WiiX2"))
      text.dec(13,10,wiix[2])
      text.str(3,12,string("WiiY2"))
      text.dec(13,12,wiiy[2])     
      text.str(3,14,string("Size"))
      text.dec(13,14,WiiSize)
      text.str(3,16,string("Beacons"))   
      text.dec(13,16,beaconfound)
      text.str(3,18,string("Seconds"))   
      text.dec(13,18,seconds)           
      text.UpdateScreen 
      
    6:
      text.updatescreen     
      temp3:=20
      temp1:=range[1]
      temp1:=temp1<#30
      temp1:=temp1#>1
      temp1:=temp1/2
      
      temp4:=20
      temp2:=range[2]
      temp2:=temp2<#30
      temp2:=temp2#>1
      temp2:=temp2/2    
   
      temp6:=10
      temp5:=range[4]-4
      temp5:=temp5<#15
      temp5:=temp5#>1
      temp5:=temp5/3 #>1
   
      temp8:=9
      temp7:=range[3]
      temp7:=temp7<#15
      temp7:=temp7#>1
      temp7:=temp7/3 #>1
       
      text.cls
      drawbox(0,0,20,24,d,d,d) 'main border
      drawbox(1,4,3,19,d,d,d)  'fwd sonar L
      drawbox(16,4,3,19,d,d,d)  'fwd sonar R
      drawbox(4,20,12,3,d,d,d)  'side sonar
      drawbox(1,1,18,3,d,d,d)  'top title box
          
      repeat temp1 
        text.PokeChar(2,temp3,c,c,c,$0F)
        temp3--
      repeat temp2 
        text.PokeChar(17,temp4,c,c,c,$0F)
        temp4--
      repeat temp5
        text.PokeChar(temp6,21,c,c,c,$0F)
        temp6++
      repeat temp7
        text.PokeChar(temp8,21,c,c,c,$0F)
        temp8--
         
      text.str(2,2,string("Auto/Wii  Mode"))
      if beaconfound<2
        text.str(4,5,string("TargetX"))
        text.dec(12,5,Wiix[1])
        text.str(4,7,string("TargetY"))
        text.dec(12,7,WiiY[1])
        
      if beaconfound=>2
        text.str(4,5,string("TargetX"))
        text.dec(12,5,WiiCenterX)
        text.str(4,7,string("TargetY"))
        text.dec(12,7,WiiCenterY)
        
      text.str(4,9,string("Size"))
      text.dec(12,9,WiiSize)
      text.str(4,11,string("Beacons"))
      text.dec(12,11,BeaconFound)     'this is a place keeper
      text.str(4,13,string("Request"))
      text.dec(12,13,TurnRequested)      
      text.str(4,15,string("T.Mode"))   'this is a place keeper
      text.dec(12,15,TurnMode)     
      text.str(4,17,string("Seconds"))   'this is a place keeper
      text.dec(12,17,Seconds)   
      text.updatescreen

    7:
      text.cls
      drawbox(0,0,20,24,d,d,d) 'main border      
      drawbox(1,1,18,3,d,d,d)  'top title box    
      text.str(2,2,string(" Arduino Watch"))
      text.str(3,6,string("One"))
      text.dec(13,6,Range[1])
      text.str(3,8,string("Two"))
      text.dec(13,8,Range[2])
      text.str(3,10,string("Three"))
      text.dec(13,10,Range[3])
      text.str(3,12,string("Four"))
      text.dec(13,12,Range[4])
      text.str(3,16,string("Seconds"))   
      text.dec(13,16,seconds)      
      text.updatescreen
      
PUB drawbox (x1,y1,w,h,c,d,e) | i

    w--
    h--
    text.PokeChar(x1,y1,c,d,e,$10) 'upper left
    text.PokeChar(x1+w,y1,c,d,e,$12) 'upper right
    text.PokeChar(x1,y1+h,c,d,e,$13) 'lower left
    text.PokeChar(x1+w,y1+h,c,d,e,$15) 'lower right

    i:=x1+1  
    repeat w-1

      if i>x1 and i<x1+w
      text.PokeChar(i,y1,c,d,e,$11)  'Hort. 
      text.PokeChar(i,y1+h,c,d,e,$11)  'Hort. 
      i++
      
    i:=y1+1
    repeat h-1

      if i>y1 and i<i+h
      text.PokeChar(x1,i,c,d,e,$16)  'vert
      text.PokeChar(x1+w,i,c,d,e,$16)  'vert       
      i++ 

PUB Servos  | i,RemTime   'this is all servos, time and 29/28 i2c

  RemTime := ( clkfreq / 1000 ) * 1000 + cnt
  
  Repeat
 
    if (RemTime - cnt) < 0        'this is my poor-man's "second"  timer --not very accurate but fine for timing "personallity" changes
      seconds++
      RemTime := ( clkfreq / 1000 ) * 1000 + cnt  'leave in /1000 vs. *1000 thing to be able to adjust
      
    i:=1
    Repeat 10
      if i<>6 and i<>7
        if ServoRequested[i]>ServoCurrent[i]
          ServoCurrent[i]++
          ServoCurrent[i]:=ServoCurrent[i]<#ServoRequested[i]
          
        if ServoRequested[i]<ServoCurrent[i]
          ServoCurrent[i]--
          ServoCurrent[i]:=ServoCurrent[i]#>ServoRequested[i]
      
      i++
   ServosOut

PUB motormath  (rcleft,rcright) | sendl,sendr,lmode,rmode

  ' this simply translates numbers so they will talk to my main loop, my RC transmitter and my motordriver
  
  case rcleft
    0 : sendl := 0
      lmode := 1      
    98..102 : sendl := 0
      lmode := 2
    103..200 : sendl := (rcleft-103)+speedup 'convert and fwd
      lmode := 2  
    1..97 : sendl := (97-rcleft)+speedup 'convert and add reverse
      lmode := 0
    255 : sendl := 0
      lmode := 1 
        
  case rcright
    0 : sendr := 0
      rmode := 1
    98..102 : sendr := 0    
      rmode := 2
    103..200 : sendr := (rcright-103)+speedup  'convert and fwd 
      rmode := 2
    1..97 : sendr := (97-rcright)+speedup'convert and add reverse
      rmode := 0
    255 : sendr := 0
      rmode := 1

  i2cMotors.sendmotors(lmode,sendl,rmode,sendr)

PUB ArduinoListen  | firstbyte,Arduinoecho

  'this is an arduino slave that takes care of all my sonar and spits out serial data 
  
  repeat
    firstbyte := Arduino.rx
    if firstbyte==254
      Range[2]:= Arduino.rx 
      Range[1]:= Arduino.rx 
      Range[3]:= Arduino.rx 
      Range[4]:= Arduino.rx 
      Arduinoecho:=Arduino.rx     'I have no idea what this extra byte is

PUB Playmp3 (playit) | x  

    ' this takes a track number, stringifies it, builds it up with the  rest of what we need for the "command" and sends it off to
    ' the mp3 player
    
    x:=Numbers.ToStr(playit,%1010)
    SetString(@mp3str, (x)) 
    SetString( @mp3str2, String(".mp3"))
    AddString ( @mp3str3,@mp3str,@mp3str2) ' 
     
    Mp3.tx(29)          'this is the play command
    Mp3.str(@mp3str3)   'what track to play 
    Mp3.tx(13)          'end send

PUB statichead (Index)     'this is a list of head positions for the 3 servos that move the head

ServoRequested[1] := lookup(Index:125,125,125,125,125,190,255,90,10,190,255,90,10,190,255,90,10,190,255,90,10,190,255,90,10)
ServoRequested[2] := lookup(Index:125,95,10,190,250,125,125,125,125,95,95,95,95,10,10,10,10,190,190,190,190,250,250,250,250)
ServoRequested[3] := lookup(Index:125,160,250,65,10,125,125,125,125,160,160,160,160,250,250,250,250,65,65,65,65,10,10,10,10) 
         
PRI AddString( dstStrPtr, srcStrPtr1, srcStrPtr2 ) | len
  len := StrSize(srcStrPtr1)
  ByteMove(dstStrPtr, srcStrPtr1, len)
  ByteMove(dstStrPtr += len, srcStrPtr2, StrSize(srcStrPtr2))   '+1 for zero termination
  
PRI SetString( dstStrPtr, srcStrPtr )
  ByteMove(dstStrPtr, srcStrPtr, StrSize(srcStrPtr))  '+1 for zero termination

PRI ServosOut

  'the main servos routine calls on this --I don't know why I don't just add it to the servos routine  --Hmmm....
  i2cObject.start
  i2cObject.writeLocation($C2,10,ServoCurrent[1], 8, 8) 'head rotate
  i2cObject.writeLocation($C2,11,ServoCurrent[2], 8, 8) 'left tilt
  i2cObject.writeLocation($C2,12,ServoCurrent[3], 8, 8) 'right tilt

  i2cObject.writeLocation($C2,3,ServoCurrent[4], 8, 8)  'laser rot
  i2cObject.writeLocation($C2,4,ServoCurrent[5], 8, 8)  'laser tilt

  i2cObject.writeLocation($C2,20,ServoCurrent[6], 8, 8)  'camera rot
  i2cObject.writeLocation($C2,19,ServoCurrent[7], 8, 8)  'camera tilt
  
  i2cObject.writeLocation($C2,13,ServoCurrent[8], 8, 8)  'Tophat

  i2cObject.writeLocation($C2,1,ServoCurrent[9], 8, 8)   'Lsonar
  i2cObject.writeLocation($C2,2,ServoCurrent[10], 8, 8)  'Rsonar
  i2cObject.stop

DAT

  ''Bunch of Smile that makes the WiiCamera Go
  
custom_settings        byte       $00
                       byte       $00
                       byte       $00
                       byte       $00
                       byte       $00
                       byte       $00
                       byte       $90     ' Max blob size
                       byte       $00
                       byte       $41     ' Gain
                       byte       $40     ' Gain limit
                       byte       $03     ' Min blob size 

                       ' Some settings used by wii and suggested by others, from http://wiibrew.org/wiki/Wiimote

Marcan                 byte       $00,$00,$00,$00,$00,$00,$90,$00,$C0,$40,$00   ' Suggested by Marcan
Cliff                  byte       $02,$00,$00,$71,$01,$00,$AA,$00,$64,$63,$03   ' Suggested by Cliff
inio                   byte       $00,$00,$00,$00,$00,$00,$90,$00,$41,$40,$00   ' Suggested by inio
level1                 byte       $02,$00,$00,$71,$01,$00,$64,$00,$FE,$FD,$05   ' Wii level 1
level2                 byte       $02,$00,$00,$71,$01,$00,$96,$00,$B4,$B3,$04   ' Wii level 2
level3                 byte       $02,$00,$00,$71,$01,$00,$AA,$00,$64,$63,$03   ' Wii level 3 (as per Cliff)
level4                 byte       $02,$00,$00,$71,$01,$00,$C8,$00,$36,$35,$03   ' Wii level 4
level5                 byte       $07,$00,$00,$71,$01,$00,$72,$00,$20,$1F,$03   ' Wii level 5 

Here is the code I am running. I did a tidy-up and a bunch of comments.
(Don't click the big button when you get there--it is an ad)
Look for "Navigation 20 --Reset Problem"
Code is Here

I thank you all in advance for your time.
Sign In or Register to comment.