Quantcast
Channel: MEL PICBASIC Forum
Viewing all articles
Browse latest Browse all 4746

Multiple IF THEN Statements: PIC16F84A

$
0
0
Forum Members:

I am using PicBasisPro Ver 2.50a, Melabs Programmer Ver. 4.40 and MicroCode Studio Ver. 2.0.0.5 for the following PIC16F84A application.

Even though I have used both the Melabs printer port of the Melabs USB programmers I haven't identified the following problem.

1. Go to the LOOP section.
2. The first IF THEN performs as intended.
3. The second IF THEN does not even execute the "GOSUB pwrup" sub-routine.
4. If I reverse the IF THEN codes, the first IF THEN section always executes.

I’ve read the PIC16F84A data sheet and haven’t found, or have overlooked, any constants of using the following code on the PIC16F84A component.

Perhaps I’m “too close to the trees…”

Any assistance will be appreciated.

Regards,

Bob
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"


'-------------------------------------------------------------------------- 
loop:
 
    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
 
 gosub loop
'--------------------------------------------------------------------------
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
      serout mtrdat, T2400, [127]
      gosub pwrdwn
      else
      endif
    next i
    pause 1000
    gosub loop
 '--------------------------------------------------------------------------
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
      serout mtrdat, T2400, [127]
      gosub pwrdwn
      else
      endif
    next i
    pause 1000
    gosub loop
'--------------------------------------------------------------------------
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
        gosub loop
'--------------------------------------------------------------------------


Viewing all articles
Browse latest Browse all 4746

Trending Articles