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 '--------------------------------------------------------------------------




Bookmarks