top bar
PPF09L.BAS


'**************************************************************
'
'  Fish Robot Control Program for PPF-09
'
'    2002/7/9 by Koichi Hirata
'
'    ppf09l.bas
'
'**************************************************************
'
' for AT90S8535-8PC
' Futaba, T4VF, SKYSPORT4
'
'*********************
' Initial set
'*********************
'
'
Config Adc = Single , Prescaler = Auto                        'For A/D conv.
Config Pinb.0 = Output                                        'For Pulse Output
Dim Vv0 As Word
Dim Vv1 As Word
Dim Vv2 As Word
Dim Vv3 As Word
Dim V0 As Single
Dim V1 As Single
Dim V2 As Single
Dim V3 As Single
Dim I As Integer
Dim Ontime1 As Integer
Dim Ontime2 As Integer
Dim Ontime3 As Integer
Dim Speedstep As Integer
Dim Amplitude As Integer
Dim T1 As Integer
Dim T2 As Integer
Dim T3 As Integer
'
'*********************
' Main Routine (Loop)
'*********************
'
Do
'
' Read A/D value
'
Start Adc
   Vv0 = Getadc(0)
   V0 = Vv0 * 5
   V0 = V0 / 1024
   Vv1 = Getadc(1)
   V1 = Vv1 * 5
   V1 = V1 / 1024                                             'Voltage (V)
   Vv2 = Getadc(2)
   V2 = Vv2 * 5
   V2 = V2 / 1024                                             'Voltage (V)
   Vv3 = Getadc(3)
   V3 = Vv3 * 5
   V3 = V3 / 1024                                             'Voltage (V)
Stop Adc
'
' Up-down Motion
'
Ontime3 = Vv2 / 6
Ontime3 = 198 - Ontime3
'
' Stationary or Moving
'
If Vv1 > 690 Then
  Goto Stationary
Else
  Goto Moving
End If
'
'**********************
' Moving Mode
'**********************
'
Moving:
'
' Set to Frequency
'
Speedstep = Vv1 * 7
Speedstep = Speedstep / 400
Speedstep = 13 - Speedstep
If Speedstep < 1 Then Speedstep = 1
'
' Set to Amplitude
'
Amplitude = Vv3 / 25
'Amplitude = Vv3 / 16
'Amplitude = Amplitude - 12
'
' Straight or Turn
'
If Vv0 > 600 Then                                             'Right side
  Goto Turningmov1
End If
If Vv0 < 480 Then                                             'Left side
  Goto Turningmov2
End If
T1 = 108 - Amplitude
T2 = 108 + Amplitude
Goto Outputmov                                                'Central posision
'
Turningmov1:                                                  'Right side
T2 = Vv0 / 6
T2 = T2 + 18
T1 = T2 - Amplitude
T1 = T1 - Amplitude
Goto Outputmov
'
Turningmov2:                                                  'Left side
T1 = Vv0 / 8
T1 = T1 + 41
T2 = T1 + Amplitude
T2 = T2 + Amplitude
Goto Outputmov
'
Outputmov:
T3 = T1 + T2                                                  'Data Number of 1/2 cycle
T3 = T3 / 2                                                   'Locayion of 1/4 cycle
'
Ontime1 = T1
Move1:
  If Ontime1 > T3 Then
    Goto Nextontime2
  End If
Nextontime1:                                                  '0-90deg
  Ontime2 = T3 - Ontime1
  Ontime2 = Ontime2 + T1                                      'Oposite motion
  Goto Nextontime3
Nextontime2:                                                  '90-180deg
  Ontime2 = Ontime1 - T3
  Ontime2 = Ontime2 + T1                                      '1/4 cycle of phase
Nextontime3:
  Portb.0 = 0
  Waitus 200 : Waitus 200                                     'OFF time(0.4msec)
  Portb.0 = 1
  Waitms 10 : Waitus 200 : Waitus 200 : Waitus 200            'ON time(10.6msec)
  Portb.0 = 0
  Waitus 200 : Waitus 200                                     'OFF time(0.4msec)
  Portb.0 = 1
  For I = 0 To Ontime1
    Waitus 4                                                  'For ch1
  Next I
  Portb.0 = 0
  Waitus 200 : Waitus 200                                     'OFF time(0.4msec)
  Portb.0 = 1
  For I = 0 To Ontime2
    Waitus 4                                                  'For ch2
  Next I
  Portb.0 = 0
  Waitus 200 : Waitus 200                                     'OFF time(0.4msec)
  Portb.0 = 1
  For I = 0 To Ontime3
    Waitus 4                                                  'For ch3
  Next I
  Portb.0 = 0
  Waitus 200 : Waitus 200                                     'OFF time(0.4msec)
  Portb.0 = 1
  Waitms 1 : Waitus 100                                       'ch4(1.1msec)
  Portb.0 = 0
  Waitus 200 : Waitus 200                                     'OFF time(0.4msec)
  Portb.0 = 1
  Waitus 200 : Waitus 200 : Waitus 200                        'ON time(0.6msec)
'
If Ontime1 > T2 Then
  Goto Move2
End If
Ontime1 = Ontime1 + Speedstep
Goto Move1
'
Move2:
  If Ontime1 < T3 Then
    Goto Nextontime5
  End If
Nextontime4:                                                  '180-270deg
  Ontime2 = T2 - Ontime1
  Ontime2 = Ontime2 + T3                                      '1/4 cycle of phase
  Goto Nextontime6
Nextontime5:                                                  '270-360deg
  Ontime2 = Ontime1 + T2
  Ontime2 = Ontime2 - T3
Nextontime6:
  Portb.0 = 0
  Waitus 200 : Waitus 200                                     'OFF time(0.4msec)
  Portb.0 = 1
  Waitms 10 : Waitus 200 : Waitus 200 : Waitus 200            'ON time(10.6msec)
  Portb.0 = 0
  Waitus 200 : Waitus 200                                     'OFF time(0.4msec)
  Portb.0 = 1
  For I = 0 To Ontime1
    Waitus 4                                                  'For ch1
  Next I
  Portb.0 = 0
  Waitus 200 : Waitus 200                                     'OFF time(0.4msec)
  Portb.0 = 1
  For I = 0 To Ontime2
    Waitus 4                                                  'For ch2
  Next I
  Portb.0 = 0
  Waitus 200 : Waitus 200                                     'OFF time(0.4msec)
  Portb.0 = 1
  For I = 0 To Ontime3
    Waitus 4                                                  'For ch3
  Next I
  Portb.0 = 0
  Waitus 200 : Waitus 200                                     'OFF time(0.4msec)
  Portb.0 = 1
  Waitms 1 : Waitus 100                                       'ch4(1.1msec)
  Portb.0 = 0
  Waitus 200 : Waitus 200                                     'OFF time(0.4msec)
  Portb.0 = 1
  Waitus 200 : Waitus 200 : Waitus 200                        'ON time(0.6msec)
'
If Ontime1 < T1 Then
  Goto Loopend
End If
Ontime1 = Ontime1 - Speedstep
Goto Move2
'
'**********************
' Stationary Mode
'**********************
'
Stationary:
If Vv0 > 600 Then                                             'Right side
  Goto Turningpos
End If
If Vv0 < 480 Then                                             'Left side
  Goto Turningpos
End If
Ontime1 = 108                                                 'Central Position
Goto Outputpos:
'
Turningpos:
Ontime1 = Vv0 / 8
Ontime1 = Ontime1 + 41
'
Outputpos:
Portb.0 = 0
Waitus 200 : Waitus 200                                       'OFF time(0.4msec)
Portb.0 = 1
Waitms 10 : Waitus 200 : Waitus 200 : Waitus 200              'ON time(10.6msec)
Portb.0 = 0
Waitus 200 : Waitus 200                                       'OFF time(0.4msec)
Portb.0 = 1
For I = 0 To Ontime1
  Waitus 4                                                    'For ch1
Next I
Portb.0 = 0
Waitus 200 : Waitus 200                                       'OFF time(0.4msec)
Portb.0 = 1
For I = 0 To Ontime1
  Waitus 4                                                    'For ch2
Next I
Portb.0 = 0
Waitus 200 : Waitus 200                                       'OFF time(0.4msec)
Portb.0 = 1
  For I = 0 To Ontime3
    Waitus 4                                                  'For ch3
  Next I
Portb.0 = 0
Waitus 200 : Waitus 200                                       'OFF time(0.4msec)
Portb.0 = 1
Waitms 1 : Waitus 100                                         'ON time(1.1msec)
Portb.0 = 0
Waitus 200 : Waitus 200                                       'OFF time(0.4msec)
Portb.0 = 1
Waitus 200 : Waitus 200 : Waitus 200                          'ON time(0.6msec)
'
Loopend:
Loop

End

[ BACK ]
bottom bar