PDA

View Full Version : 16F88 code problem.....I think



pinworm21
- 6th March 2012, 18:05
Hello everyone !

First time poster.......have only worked with PIC's for a few years. So go easy on me. LOL

16F88
PBP 2.60c
PORTB.3 (wired to a LED)
PORTA.0 (wired to one side of a bi-color led)
PORTA.1 (wired to one side of a bi-color led)


now I can write a simple routine to turn portb.3 on and off with no problems.

But if I have it in my code it turns on for a split second and then back off. I added the bi-color led everywhere I have portb.3 to debug and the bi-color led works as I intended portb.3 to work.

6327

Kinda stumped ! Any help would be appreciated.......


Thanks,

David Polakiewicz Jr


DEFINE OSC 20

OSCCON = %01011100
TRISA = %11101100
TRISB = %11010111
CCP1CON = %00000000 'DISABLE THE CCP1 ON PORTB.3
ANSEL = %00001100 'MAKES A2 AND A3 ANALOG
ADCON0 = %10000001 'SET ANALOG CLOCK SOURCE
ADCON1 = %11000000 'RIGHT JUSTIFY THE 10BIT RESULTS
OPTION_REG.7 = 0 'CLEAR THE PORTB PULL-UP RESISTORS
DEFINE ADC_BITS 10 'SET ADC TO 10BIT
DEFINE ADC_SAMPLEUS 50 'SET SAMPLE TIME
'ANALOG CHANNEL VARIABLES
TRIMPOT1 VAR WORD 'ANALOG TRIMPOT #1
TRIMPOT2 VAR WORD 'ANALOG TRIMPOT #2
'OUTPUT TIME VARIABLES
RAWRANDOM VAR WORD 'RAW RANDOM 16 BIT NUMBER
ONTIME VAR WORD 'CONVERTED ON TIME
OFFTIME VAR WORD 'CONVERTED OFF TIME
ONCOUNT VAR WORD 'ON COUNT
ONTOTAL VAR WORD 'TOTAL ON TIME LEFT
OFFTOTAL VAR WORD 'TOTAL OFF TIME LEFT
TIMELEFTRESULT VAR WORD 'TIME LEFT RESULT
OFFLEFTRESULT VAR WORD 'OFF TIME LEFT RESULT
'COUNT VARIABLES
A VAR WORD 'ON TIME COUNT VARIABLE (COUNTS SECONDS)
B VAR WORD 'OFF TIME COUNT VARIABLE (COUNTS SECONDS)
C VAR WORD 'OFF TIME COUNT VARIABLE (COUNTS SECONDS)
'HOLDING BITS
ONREMAINDER VAR BIT 'ON FOR REMAINDER OF HR

HIGH PORTA.1
LOW PORTA.0
HIGH PORTB.3
PAUSE 2000
LOW PORTA.1
HIGH PORTA.0
LOW PORTB.3

:RESETVARIABLES
serout PORTB.5,6,["*****VARIABLES RESET*****",13]
ONTOTAL = 60 'PRESET WITH 60 SECONDS
OFFTOTAL = 3540 'PRESET WITH 59 MIN (60 SEC ARE USED FOR ON TIME)
A = 0
B = 0
C = 0
:BEGIN
:OFFCALC
RANDOM RAWRANDOM 'GET RANDOM 16 BIT
OFFTIME = RAWRANDOM / 218 'CONVERT TO A 0-300 SECOND NUMBER
TIMELEFTRESULT = OFFTOTAL - OFFTIME 'CALC THE TIME LEFT AFTER NEW RANDOM OFF
serout PORTB.5,6,["ON TOTAL=",#ONTOTAL,13]
serout PORTB.5,6,["OFF TOTAL=",#OFFTOTAL,13]
serout PORTB.5,6,["OFFTIME=",#OFFTIME,13]
serout PORTB.5,6,["TIME LEFT RESULT=",#TIMELEFTRESULT,13]
serout PORTB.5,6,["______________________________",13]

IF (TIMELEFTRESULT > 3540) | (TIMELEFTRESULT < ontOTAL) then 'CHECK TO SEE IF THE ONTIME ID GREATER THAN THE TIMELEFT RESULT
OFFLEFTRESULT = OFFTOTAL - ONTOTAL 'IF IT IS THEN SUBTRACT THE ON TOTAL FROM THE OFF TOTAL

high PORTB.3 'TURN ON THE OUTPUT FOR ONTIME REMAINDER

HIGH PORTA.1
LOW PORTA.0
FOR a = 0 TO ONTOTAL
PAUSE 1000
serout PORTB.5,6,["1"]
NEXT a
LOW PORTB.3
LOW PORTA.1
HIGH PORTA.0
for B = 0 TO OFFTOTAL 'TURN OFF OUTPUT FOR THE OFF REMAINDER
PAUSE 10
serout PORTB.5,6,["2"]
NEXT B
serout PORTB.5,6,[,13]
GOTO RESETVARIABLES
ENDIF
HIGH PORTB.3 'TURN ON THE OUTPUT
HIGH PORTA.1
LOW PORTA.0
serout PORTB.5,6,["ON NORMAL XXXXXX",13]
PAUSE 1000 '1 SECOND ON TIME
LOW PORTB.3
LOW PORTA.1
HIGH PORTA.0
serout PORTB.5,6,["OFF NORMAL OOOOOO",13]
FOR C = 0 TO OFFTIME
serout PORTB.5,6,["."]
PAUSE 10
NEXT C
serout PORTB.5,6,[".",13]
C = 0


ONTOTAL = ONTOTAL - 1
OFFTOTAL = OFFTOTAL - OFFTIME

:ONTIMECHECK




goto BEGIN