On top I would suggest also these two modifications to your subroutine:
1) Not necessary to serout twice the same code (127)
2) the Goto Skip will take you out of the For/Next loop
Code:'================================================== ================ '************************************************* ******************* '* Name : Syn-Ren50.BAS Author : Bob Wills * '* MCU : PIC 16F84A USE : OLIN FOX LIFT * '* Date : 08/04/2012, Ver. 2.0 PicBasic Pro Compiler * '* Words: 712 Duty Cycle: ~ 0.79 step/1%DC * '* NOTE: This program controls a BDC motor to move a lift up/down * '* with the following features: * '* 1. Increase the motor speed (up/down) from stop to running speed.* '* 2. Decrease the motor speed (up/down) just before the stopping * '* limit switch. * '* 3. Provide various stopping rates for safety purposes. * '* 4. The motor is controlled by a Dimension Engineering * '* Single Channel 50A continuous/100A peak, Brushed motor * '* controller, Model: SyRen50. This contoller containa a MCU. * '* 5. A PIC16F84A interfaces between the lift inputs and the SyRen50 * '* and sends control signals to the SyRen50 using the PBP * '* "SEROUT" statement -- SEROUT mtrdat, T2400, [n] * '* 6. SEROUT mtrdat, T9600, [127] = motor stop, * '* ...[0] = motor full reverse; ...[255] = motor full forward. * '************************************************* ******************** @ DEVICE PIC16F84A, XT_OSC ' 4Mhz @ DEVICE PIC16F84A, WDT_OFF ' Watchdog Timer @ DEVICE PIC16F84A, PWRT_ON ' Power-On Timer @ DEVICE PIC16F84A, PROTECT_OFF ' Program Code Protection stdwnv con 109 'range 127-0: 96~6vdc, 64~12vdc stupv con 145 'range 127-256: 158~6vdc, 190~12vdc upstps con 30 'up dwnstps con 30 'down sloup con 30 'up end speed slodwn con 30 'down end speed i var byte n var BYTE upv var byte dwnv var byte 'pin sss VAR PORTA.0 'Pin 17 'RA0/AN0 input safety switch slo VAR PORTA.1 'Pin 18 'RA1/AN1 input for slow interrupt upstp VAR PORTA.2 'Pin 1 'RA2/AN2/CVREF/VREF- input for up stop dwnstp VAR PORTA.3 'Pin 2 'RA3/AN3/VREF+/C1OUT input for down stop ' VAR PORTA.4 'Pin 3 'RA4/AN4/T0CKI/C2OUT recvr input = down start ' Pin 4 MCLR ' Pin 15 OSC2/CLKOUT ' Pin 16 OSC1/CLKIN syrenpwr VAR PORTB.0 'Pin 6 'RB0/INT/CCP1 output to the syren power relay mtrlp VAR PORTB.1 'Pin 7 'RB1/SDI/SDA output to the motor loop relay mtrdat VAR PORTB.2 'Pin 8 'RB2/SDO/RX/DT output data control for syrenpwr ' VAR PORTB.3 'Pin 9 'RB3/PGM/CCP1 rkrup VAR PORTB.4 'Pin 10 'RB4/SCK/SCL rocker input for up start rcvrdn VAR PORTB.5 'Pin 11 'RB5/SS/TX/CK receiver input for down start rcvrup VAR PORTB.6 'Pin 12 'RB6/AN5/PGC/T1OSO/T1CKI ICSP CLOCK 'rcvr input for up start ' VAR PORTB.7 'Pin 13 'RB7/AN6(6)/PGD/T1OSI ICSP DATA Manual Switch PORTA = 5 'PORTA MEMORY ADDRESS TRISA = 133 'TRISA MEMORY ADDRESS TRISA = %11111111 'SET PORTA DATA DIRECTIONS PORTA = %00000000 'CLEAR PORTA MEMORY PORTB = 6 'PORTB MEMORY ADDRESS TRISB = 134 'TRISB MEMORY ADDRESS TRISB = %11111000 'SET PORTB DATA DIRECTIONS PORTB = %00000000 'CLEAR PORTB MEMORY INCLUDE "modedefs.bas" '-------------------------------------------------------------------------- loopx: if (rcvrup = 0) and (upstp = 1) then gosub pwrup gosub uprcvr else gosub pwrdwn endif if (rcvrdn = 0) and (dwnstp = 1) then gosub pwrup gosub dwnrcvr else gosub pwrdwn endif goto loopx '-------------------------------------------------------------------------- dwnrcvr: 'Increases motor speed from stop to "up speed rate' serout mtrdat, T2400, [stdwnv] pause 1000 dwnv = stdwnv pause 50 for i = 1 to dwnstps step 1 dwnv = dwnv - 1 SEROUT mtrdat, T2400, [dwnv] pause 50 if (rcvrdn = 1) oR (dwnstp = 0) then 'stop & limit sw gosub pwrdwn Goto Skip_01 endif next i Skip_01: pause 1000 return '-------------------------------------------------------------------------- uprcvr: 'Increases motor speed from stop to "up speed rate' serout mtrdat, T2400, [stupv] pause 1000 upv = stupv pause 50 for i = 1 to upstps step 1 upv = upv + 1 SEROUT mtrdat, T2400, [upv] pause 50 if (rcvrup = 1) oR (upstp = 0) then 'stop & limit sw gosub pwrdwn Goto Skip_02 endif next i Skip_02: pause 1000 return '-------------------------------------------------------------------------- pwrup: high syrenpwr pause 500 serout mtrdat, T2400, [127] pause 250 high mtrlp return '-------------------------------------------------------------------------- pwrdwn: serout mtrdat, T2400,[127] pause 50 low syrenpwr pause 10 low mtrlp return '--------------------------------------------------------------------------




Bookmarks