PDA

View Full Version : Back again... 'lil help with ADC settings



kevlar129bp
- 17th July 2010, 20:31
Hello all,

This post is somewhat related to my "ADC lcd display help" post.
I guess I kinda put the cart ahead of the horse, so to speak. Can one of you fine folks take
a peek at my code (be gentle, it's my first "live" app on chip). The problem I seem to
be having is, when I un-comment the ADC portion of my code, it trashes everything else?
Any thoughts or guidance wound be great!

'************************************************* ***************
'* Name : UNTITLED.BAS *
'* Author : Me, Silly *
'* Notice : Copyright (c) 2009 None *
'* : All Rights Reserved *
'* Date : 11/19/2009 *
'* Version : 1.0 *
'* Notes : PIC16F886 *
'* : *
'************************************************* ***************
INCLUDE "DT_INTS-14-MOD.bas"
INCLUDE "ReEnterPBP.bas"

'Clock setup
Define OSC 8 'Set PicBasic Pro processor speed to 8 Mhz (Must match oscillator value)
OSCCON = %01110001 'Internal 8 mhz Osc
'Comparator setup
CM1CON0 = 0 'Comparator Off
CM2CON0 = 0 'Comparator Off
'ADC setups
' DEFINE ADC_BITS 10
' DEFINE ADC_SAMPLEUS 50
' ADCON0 = %10001001 'Fosc / 32, Select ch.2, enable ADC
' ADCON1 = %10010000 'Right Justify, VRef = VDD
'Pin setups
ANSEL = %00000110 'PortA: 0,1,2 = analog input
ANSELH= %00000000
TRISA = %00001111 'PortA: 0,1,2,3 = input, 4,5 = output
TRISB = %00000000 'PortB: 0-7 = output
TRISC = %10000000 'PortC: 0-6 = output, 7 = input
TRISE = %00001111
OPTION_REG.7 = 1 'Disable PORTB weak pull-ups
'LCD setup (20 x 4 lines)
DEFINE LCD_LINES 4
Define LCD_BITS 4 '4 data interface lines
Define LCD_DREG PORTC 'LCD data port
Define LCD_DBIT 0 'LCD data bits, pic starting pin 0 or 4
Define LCD_RSREG PORTC 'LCD register select port
Define LCD_RSBIT 4 'LCD register select bit
Define LCD_EREG PORTA 'LCD enable port
Define LCD_EBIT 6 'LCD enable bit
'Usart setups
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
DEFINE HSER_SPBRG 51 ' 9600 Baud @ 8MHz, 0.16%
SPBRGH = 0
BAUDCTL.3 = 1 ' Enable 16 bit baudrate generator
'----------------------------------------------------------------------------
ASM
INT_LIST macro ; IntSource, Label, Type, ResetFlag?
INT_Handler RX_INT, _NewSerial, PBP, yes
endm
INT_CREATE ; Creates the interrupt processor

INT_ENABLE RX_INT ; enable RX interrupt
ENDASM

'Variable setups
SerBuff var BYTE
SerInRX var PIR1.5
SerInTX var PIR1.4
Cmd var byte
CmdValBuff var word
TVal var word
HVal var word
OVal var word
ADCFlag var PIR1.6
ADCInt var PIE1.6
ADCGo var ADCON0.2
FirstStandby var bit
FirstSuspend var bit
FirstWait var bit
FirstTrack var bit
LoopCnt VAR BYTE
TorchVNow var word
TorchVAve var word
NewSerFlag var BYTE
SerGarbage var byte
ADVal VAR WORD
Quanta CON 489 'VREF/1024 = 5/1024 = .00488 = 489
VoltageDivider CON 70
ADCVolts VAR BYTE
LCDVolts VAR WORD
ADCCntTarget VAR WORD
ADCHystTarget var BYTE
TValMult CON 2926
cmdCommVal var word
OutStatus var BIT
OutNumb var BYTE
OutputMSG var bit
LCDCnt VAR BYTE

'Ports and Pins Aliases
InEnable var PORTA.0
InIsMoving var PORTA.3
InAnaTorch var PORTA.2
InAna1 var PORTA.1
OutUp var PORTA.4
OutDn var PORTA.5
Out8 var PORTB.7
Out7 var PORTB.6
Out6 var PORTB.5
Out5 var PORTB.4
Out4 var PORTB.3
Out3 var PORTB.2
Out2 var PORTB.1
Out1 var PORTB.0

'Initial variable values
TVal = 120
HVal = 1
LOW Out1
LOW Out2
LOW Out3
LOW Out4
LOW Out5
LOW Out6
LOW Out7
LOW Out8
FirstStandby =1
FirstSuspend =1
FirstWait =1
FirstTrack =1
NewSerFlag = 0
ADCCntTarget=(tval*TValMult)/1000
ADCHystTarget=(Hval*TValMult)/1000

pause 500 'Uncomment this line for real-world operation
LCDout $fe, 1
LCDout $fe, 2, " DOWN BY FIVE "
Lcdout $fe, $C0, "********************"
Lcdout $fe, $94, "TORCH HEIGHT CONTROL"
Lcdout $fe, $D4, " FIRMWARE v1.00 "
pause 5000 'Uncomment this line for real-world operation
hserout ["All powered up",13,10]
LCDout $fe, 1
LCDout $fe, 2, "LOADING DEFAULTS...."
Lcdout $fe, $C0, "LOCK TO VALUE: ",#TVal
Lcdout $fe, $94, "DEADBAND VALUE: +/-",#hVal
Lcdout $fe, $D4, "OUTS:",DEC PORTB.0,"-",DEC PORTB.1,"-",DEC PORTB.2,"-",DEC PORTB.3,"-",_
DEC PORTB.4,"-",DEC PORTB.5,"-",DEC PORTB.6,"-",DEC PORTB.7
pause 5000


'------------------PROGRAM---------------------

Start:
if InEnable THEN
gosub EnableHigh
else
gosub EnableLow
endif
SELECT CASE NewSerFlag
CASE 1 'T or H was received
GOSUB CmdCommOut
NewSerFlag = 0
CASE 2 'O was received
gosub CmdOutput
NewSerFlag = 0
CASE 3 'A was received
GOSUB AboutDTHC
NewSerFlag = 0
CASE 4 'ERROR was received
GOSUB CMDERR
NewSerFlag = 0
END SELECT
goto Start

'------------------PROGRAM---------------------

EnableHigh:
IF InIsMoving then '(OFF)
FirstSuspend =1
FirstWait =1
FirstTrack =1
if firststandby = 1 then
LCDout $fe, 1
LCDout $fe, 2, "STATUS: STANDBY"
Lcdout $fe, $C0, "WAITING FOR A SETUP "
LCDout $fe, $94, " COMMAND FROM MACH3 "
LCDout $fe, $D4, "********************"
firststandby = 0
ENDIF
else
FirstStandby =1
FirstWait =1
FirstTrack =1
if firstsuspend = 1 then
LCDout $fe, 1
LCDout $fe, 2, "STATUS: SUSPENDED"
Lcdout $fe, $C0, "TORCH VOLTS: XXX"
LCDout $fe, $94, "LOCK TO VALUE: ",#TVal
Lcdout $fe, $D4, "DEADBAND VALUE: +/-",#hVal
FIRSTSUSPEND = 0
ENDIF
endif
return

EnableLow:
IF InIsMoving then '(OFF)
FirstStandby =1
FirstSuspend =1
FirstTrack =1
if firstwait = 1 then
LCDout $fe, 1
LCDout $fe, 2, "STATUS: PAUSED"
Lcdout $fe, $C0, "CONTROLLER: ENABLED"
LCDout $fe, $94, "WAITING FOR ARC XFER"
Lcdout $fe, $D4, "SIGNAL FROM PLASMA "
FIRSTWAIT = 0
ENDIF
else
FirstStandby =1
FirstSuspend =1
FirstWait =1
'--------CONVERSION-------
' TorchVave = 0
' for loopcnt = 1 to 15
' ADCGo = 1 'Start ADC conversion
' Not_Done:
' if adcgo = 1 then not_done 'Stay here until conversion is done
' adcin 0,ADVal
' TorchVave = ADVal + TorchVave
' next loopcnt
' ADVal = TorchVave/15 'ADC AVERAGE COUNTS
' GOSUB SERVOTORCH
'--------CONVERSION-------
' ADCVolts=(ADVal/1000)*Quanta
' LCDVolts=ADCVolts*VoltageDivider
' LCDout $fe, 1
' LCDout $fe, 2, "CURRENT READINGS ARE"
' Lcdout $fe, $C0, "A/D VDC = ",DEC1 ADCVolts/100,".",DEC2 ADCVolts//100
' Lcdout $fe, $94, "--------------------"
' Lcdout $fe, $D4, "ACTUAL VDC = ",DEC3 LCDVolts/100,".",DEC2 LCDVolts//100
' if Firsttrack = 1 then
LCDout $fe, 1
LCDout $fe, 2, "STATUS: TRACKING"
' Lcdout $fe, $C0, "TORCH VOLTS: ",DEC3 LCDVolts/100,".",DEC2 LCDVolts//100
LCDout $fe, $94, "LOCK TO VALUE: ",#TVal
Lcdout $fe, $D4, "DEADBAND VALUE: +/-",#hVal
'FIRSTTRACK = 0
' ELSE
' Lcdout $fe, $C0 + 15,DEC3 LCDVolts/100,".",DEC2 LCDVolts//100
' endif
endif
return

CmdOutput:
select case oval
case 11
low Out1
OutNumb=1
OutStatus=1
OutputMSG=1
case 10
high out1
OutNumb=1
OutStatus=0
OutputMSG=1
case 21
low Out2
OutNumb=2
OutStatus=1
OutputMSG=1
case 20
high out2
OutNumb=2
OutStatus=0
OutputMSG=1
case 31
low Out3
OutNumb=3
OutStatus=1
OutputMSG=1
case 30
high out3
OutNumb=3
OutStatus=0
OutputMSG=1
case 41
low Out4
OutNumb=4
OutStatus=1
OutputMSG=1
case 40
high out4
OutNumb=4
OutStatus=0
OutputMSG=1
case 51
low Out5
OutNumb=5
OutStatus=1
OutputMSG=1
case 50
high out5
OutNumb=5
OutStatus=0
OutputMSG=1
case 61
low Out6
OutNumb=6
OutStatus=1
OutputMSG=1
case 60
high out6
OutNumb=6
OutStatus=0
OutputMSG=1
case 71
low Out7
OutNumb=7
OutStatus=1
OutputMSG=1
case 70
high out7
OutNumb=7
OutStatus=0
OutputMSG=1
case 81
low Out8
OutNumb=8
OutStatus=1
OutputMSG=1
case 80
high out8
OutNumb=8
OutStatus=0
OutputMSG=1
case else
OutputMSG=0
end select
goto OutputComm
return

OutputComm:
FirstStandby =1
FirstSuspend =1
FirstWait =1
FirstTrack =1
select case OutputMSG
case 0
hserout ["Invalid command!",13,10]
LCDout $fe, 1
LCDout $fe, 2, "THE OUTPUT NUMBER ",#oval
Lcdout $fe, $C0, " IS INVALID! "
Lcdout $fe, $D4, " TRY AGAIN! "
pause 4000
case 1
SELECT CASE OutStatus
CASE 0
hserout ["OUTPUT ",#OutNumb," HAS BEEN TURNED OFF",13,10]
LCDout $fe, 1
Lcdout $fe, $C0, "THE OUTPUT NUMBER ",#OutNumb
Lcdout $fe, $94, "HAS BEEN TURNED OFF"
pause 4000
CASE 1
hserout ["OUTPUT ",#OutNumb," HAS BEEN TURNED ON",13,10]
LCDout $fe, 1
Lcdout $fe, $C0, "THE OUTPUT NUMBER ",#OutNumb
Lcdout $fe, $94, "HAS BEEN TURNED ON"
pause 4000
END SELECT
end select
return

CmdCommOut:
FirstStandby =1
FirstSuspend =1
FirstWait =1
FirstTrack =1
IF CMD = "T" THEN
hserout ["TORCH LOCK-TO VALUE HAS BEEN UPDATED TO ",#cmdCommVal,13,10]
LCDout $fe, 1
LCDout $fe, 2, "TORCH LOCK-TO VALUE"
Lcdout $fe, $C0, "HAS BEEN UPDATED TO:"
Lcdout $fe, $94, " ",#cmdCommVal
pause 4000
ENDIF
IF CMD = "H" THEN
hserout ["TORCH HYSTERESIS VALUE HAS BEEN UPDATED TO ",#cmdCommVal,13,10]
LCDout $fe, 1
LCDout $fe, 2, "HYSTERESIS VALUE"
Lcdout $fe, $C0, "HAS BEEN UPDATED TO:"
Lcdout $fe, $94, " +/-",#cmdCommVal
pause 4000
ENDIF
return

AboutDTHC:
FirstStandby =1
FirstSuspend =1
FirstWait =1
FirstTrack =1
hserout ["PROGRAMMED BY Kevlar",13,10,_
"FIRMWARE V1.00",13,10,_
"FILE: CHIPTEST.HEX",13,10]
LCDout $fe, 1
LCDout $fe, 2, "PROGRAMMED BY Kevlar"
Lcdout $fe, $C0, "FIRMWARE V1.00"
Lcdout $fe, $94, "FILE: CHIPTEST.HEX"
FOR LCDCnt = 0 TO 19
Lcdout $fe, $D4 + LCDCnt, "."
pause 300
NEXT
return

CmdErr:
FirstStandby =1
FirstSuspend =1
FirstWait =1
FirstTrack =1
hserout ["Invalid command!",13,10]
LCDout $fe, 1
LCDout $fe, 2, "THE COMMAND RECEIVED"
Lcdout $fe, $C0, " IS INVALID! "
Lcdout $fe, $D4, " TRY AGAIN! "
pause 4000
return

ServoTorch:
if ADVal > ADCCntTarget + ADCHystTarget then
high OutDn 'C.1
low Outup 'C.0
return
endif
if ADVal < ADCCntTarget - ADCHystTarget then
high outup
low outDn
return
endif
low outup
low outDn
return

NewSerial:
NewSerFlag = 1
HSERIN [serBuff]
if serbuff = "@" then
HSERIN [cmd]
SELECT CASE CMD
CASE "T"
HSERIN [dec3 tval]
NewSerFlag = 1
ADCCntTarget=(tval*TValMult)/1000
cmdCommVal=tval
CASE "H"
HSERIN [dec Hval]
NewSerFlag = 1
ADCHystTarget=(Hval*TValMult)/1000
cmdCommVal=hval
CASE "O"
HSERIN [dec2 Oval]
NewSerFlag = 2
cmdCommVal=oval
CASE "A"
NewSerFlag = 3
CASE ELSE
NewSerFlag = 4
END SELECT
else
sergarbage = RCREG
NewSerFlag = 3
ENDIF
@ INT_RETURN

Thanks again to you all. I certainly wouldn't be near this far without you!

Chris

PS. Any other comments or suggestions on streamlining the working code would be great too!

kevlar129bp
- 18th July 2010, 20:11
DOH! Got it...
Just need to read my own comments :o

ADCON1 = %10010000 'Right Justify, VRef = VDD

to...

ADCON1 = %10000000 'Right Justify, VRef = VDD

Movin' on...
Thanks all,
Chris