Hi guys,
I'm having a problem with Portc.3 (Pin 18 PIC16F877A). I have it tied to a 4.7k ohm resistor to +5V.
When I pull it (pin 18) to ground and hold it there for more than a few seconds, the pin seems to latch up and stay there (at 0v) when I remove the ground.
Here is the bit of code.
I have re-read the data sheets and I don't see anything special about portc.3 except SPI? Am I missing something?
DEFINE OSC 8' USE 8MHZ CRYSTAL OSC.
DEFINE ADC_BITS 10' Number of bits in Adcin result
' +VREF= 2 VOLTs SO 1 = .00195V OR ~ 2MV
DEFINE CCP1_REG PORTC' Hpwm channel 1 pin port
DEFINE CCP1_BIT 2' Hpwm channel 1 pin bit
DEFINE CCP2_REG PORTC' Hpwm channel 2 pin port
DEFINE CCP2_BIT 1' Hpwm channel 2 pin bit
DEFINE HSER_RCSTA 90h' Set RECIEVE Enabled
DEFINE HSER_TXSTA 24h' Set XMIT Enabled HS
DEFINE HSER_BAUD 4800' BAUD RATE
DEFINE HSER_CLROERR 1' CLEAR OVER RUN ERRORS
DEFINE CHAR_PACING 1000' CHAR PACING(uSEC) TO 1MS
'
'**************** SET UP I/O PORTS ****************************
'
TRISA=%00001111' SET UP PORTA I/O (1=IN,0=OUT)
TRISB=%11001000' SET UP PORTB I/O
TRISC=%10001000' SET UP PORTC I/O
ADCON1=%10100101' USE PORTA.3 PIN5 AS VREF+ @ 2.0VDC
ADCON0=%01000000' A/D OFF -- RIGHT JUSTIFY. 6MSB=0 ADRESH
'
'************* ALLOCATE VARIABLES *******************
'
SWDN VAR PORTC.0' ~SWDN ZEROS INTEGRATE REGISTER'
HIGH SWDN' NOT YET
ZERO VAR PORTB.4' ~ZERO PORT
HIGH ZERO' NOT YET
INTEG VAR PORTC.4' ~INTERGRATE PORT
HIGH INTEG' NOT YET
VACPMP VAR PORTB.5' VACUUM PUMP PORT
LOW VACPMP ' TURN IT OFF
RTS VAR PORTA.5' REQ TO SEND IL1700
BLEDOUT VAR PORTD.1' BLUE LED ENABLE ICD
HIGH BLEDOUT' ENSURE BLUE LED IS OFF
RLEDOUT VAR PORTD.2' RED LED ENABLE ICD
HIGH RLEDOUT' ENSURE RED LED IS OFF
BLUELVL VAR WORD' BLUE LED LEVEL (0-100%)
DISTALCNT VAR BYTE' NUMBER OF TESTS RUN ON BUNDLE
REDLVL VAR WORD' RED LED LEVEL (0-100%)
FLASHED VAR BYTE' USE FOR COUNTING
X VAR BYTE' USE FOR LOOP COUNTING
REDCUR VAR WORD' RED LED DRIVE CURRENT
BLUCUR VAR WORD' BLUE LED DRIVE CURRENT
REDSNS VAR WORD' RED LED SENSE CURRENT
BLUSNS VAR WORD' BLUE LED SENSE CURRENT
BLUPRCNT VAR WORD' ALIAS TO DISPLAY ROUGH PERCENTAGE
REDPRCNT VAR WORD' ""
PROX_IN VAR BIT
REDDONE VAR BIT
BLUEDONE VAR BIT
SERLOOP VAR BYTE
INCOM VAR WORD' SERIAL DATA
'-=-=-=-=-=-=-=-=-=-=-=-=-=-=- MAIN -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
CLEAR' SET ALL VARIABLE LOW
BLUCUR = 242'
REDCUR = 153'
HSERIN [WAIT("*"),INCOM]' COULD BE ANYTHING HERE... USE *START
BLUPRCNT = (BLUCUR-50)/2
REDPRCNT = (REDCUR-50)/2
HSEROUT ["RUNNING",13,10]
HSEROUT ["CURRENT SETTINGS ARE:",13,10]
HSEROUT ["RED IS SET TO:",dec REDPRCNT,"%",13,10]
HSEROUT ["BLUE IS SET TO:",dec BLUPRCNT,"%",13,10]
PAUSE 1000
HSEROUT ["---------------------------------------------------",13,10]
GOSUB BEGIN'
BEGIN:
BLEDOUT = 0' TURN BLUE LED ON
HPWM 2, BLUCUR, 5000' AND SET CURRENT
PAUSE 200' SETTLE 200MS
ADCON0 = %01001101' BLUE ADC
ADCIN 1, BLUELVL' READ IT
PAUSE 10' A/D FOR 10MS
BLEDOUT = 1' TURN BLUE OFF
RLEDOUT = 0' TURN RED ON
HPWM 1, REDCUR, 5000
PAUSE 200' SETTLE 200MS
ADCON0=%01000001' RED A/D
ADCIN 0, REDLVL
PAUSE 10' A/D FOR 10MS
RLEDOUT = 1' TURN RED OFF
hpwm 1, 0, 0' STOP WHINING
HPWM 2, 0, 0
REDLVL=REDLVL/2
BLUELVL=BLUELVL/2
PAUSE 10'
HSEROUT [13,10]'
HSEROUT ["RED LED SETTING =",DEC REDCUR,32,13,10]
HSEROUT ["RED MEASURES: ",dec REDLVL,"MA.",13,10]
HSEROUT ["BLUE LED SETTING =",DEC BLUCUR,32,13,10]
HSEROUT ["BLUE MEASURE: ",DEC BLUELVL,"MA.",13,10]
HSEROUT [13,10]' CR LF *
HSEROUT ["CHANGE LED SETTINGS? (Y/N)"]' PC ADD PREFIX "*"
HSERIN [WAIT("*"),INCOM]'
IF INCOM == "Y" THEN GOSUB RS232LOOP
IF INCOM == "N" THEN
HSEROUT [13,10,"INSERT DISTAL END",13,10]'
GOTO WAIT_PROX
ENDIF
GOTO BEGIN
RETURN
WAIT_PROX:
BLUELVL = BLUCUR '
REDLVL = REDCUR '
HPWM 1, 0,0' NO NEED TO WHINE
HPWM 2, 0,0' TURN BOTH OFF
IF PORTC.3 == 0 THEN GOTO PROX_DET' CHECKing
GOTO WAIT_PROX' TIGHT LOOP
'---------------------------PROX DET---------------------------
PROX_DET:
HSEROUT["DISTAL END DETECTED. TURNING ON PUMP",13,10]
DISTALCNT = DISTALCNT+1'
HSEROUT["TESTING DISTAL END ",DEC DISTALCNT,32,13,10,13,10]
HPWM 1, BLUELVL, 5000' SET BLUE CURRENT LEVEL 5KHZ
HPWM 2, REDLVL, 5000' SET RED CURRENT LEVEL 5KHZ
VACPMP = 1' TURN ON VACUUM PUMP
PAUSE 100' WAIT 100 MSEC
GOTO DO_TESTING
DO_TESTING:
IF REDDONE==0 THEN GOTO RED_LED_LOOP
IF ((REDDONE==1) AND (BLUEDONE ==0)) THEN
GOTO BLUE_LED_LOOP
ELSE
IF ((REDDONE ==1) AND (BLUEDONE==1)) THEN GOTO FINISH
GOTO DO_TESTING
ENDIF
FINISH:
LOW VACPMP' ----- TURN VACUUM PUMP OFF -----------------------
HSEROUT["TURNING PUMP OFF",13,10]
REDDONE=0' GET READY FOR ANOTHER TEST
BLUEDONE=0
HPWM 1,0,0
HPWM 2,0,0
FLASHED = 0
PAUSE 10'
IF PORTC.3 == 1 THEN
HSEROUT [13,10,"INSERT NEXT DISTAL END",13,10]'
GOTO WAIT_PROX
ELSE
HSEROUT ["PLEASE REMOVE DISTAL END ",DEC DISTALCNT,32,13,10]
GOTO FINISH
ENDIF
END
Everything works as it should except for the latching problem of the PORTC.3.
I am using LAB-X1 for the hardware.
Thanks!
Bookmarks