Hi, Marcus
this one should work as desired ...
Code:
'****************************************************************
'* Name : GrassBurner.BAS *
'* Author : Acetronics *
'* Notice : Copyright (c) 2010 *
'* : All Rights Reserved *
'* Date : 23/12/2010 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
'
@ __config _CONFIG1, _INTRC_IO & _WDT_ON & _LVP_OFF & _CP_OFF
' DEFINES
Define OSC 8
Define BUTTON_PAUSE 0
' Internal Osc 8Mhz
OSCCON = %01110010
' Turn off A/D conversion - Digital Inputs
ADCON0 = 0
ANSEL = 0
' Comparators Off
CMCON = 7
'Define variables and pins
I VAR BYTE
Position var WORD
Delay var Byte
OldButton var bit
PORTA = 0
TRISA = %11111101
BUTTON_ VAR PORTA.0
SERVO VAR PORTA.1
buttonloop: ' Button check loop
OldButton = 0
LOW Servo
Pulsout SERVO, 300 ' pulse to place servo to neutral
Pause 19
BUTTON BUTTON_,1,255,0,Delay,0,Buttonloop
OldButton = 1 ' Launched ... We've pressed it !!!
'******************************************************************************
positionloop: 'Servo position control loop
I = 0 ' Reset time counter
While ( OldButton AND ( I < 75 )) ' if button has been pushed and time < 1.5s
IF I >= 50 THEN ' 1 second is ... 50 x 20 ms !
position = 300
ELSE
POSITION = 200
ENDIF
LOW Servo
Pulsout SERVO, Position ' pulse to servo
PAUSEUs 19813 - ( Position * 5 ) ' time between pulses
I = I+1 'Increase Time counter
Wend ' go for seeking a new button push ...
goto buttonloop
End 'end of program supposed never reached
may be you'll have to modify a bit the " @ __config ......" line if you use PM as an assembler.
Also correct " IF I >= 50 ..." to i.e. " IF I >= 55 " to take servo positionning time into account ... knowing 1 unit is 20 ms.
Alain
Bookmarks