Back again... 'lil help with ADC settings


Closed Thread
Results 1 to 2 of 2
  1. #1
    Join Date
    Dec 2005
    Location
    Salt Lake City, Ut, USA
    Posts
    108

    Question Back again... 'lil help with ADC settings

    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!
    Code:
    '****************************************************************
    '*  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!

  2. #2
    Join Date
    Dec 2005
    Location
    Salt Lake City, Ut, USA
    Posts
    108


    Did you find this post helpful? Yes | No

    Default

    DOH! Got it...
    Just need to read my own comments

    ADCON1 = %10010000 'Right Justify, VRef = VDD

    to...

    ADCON1 = %10000000 'Right Justify, VRef = VDD

    Movin' on...
    Thanks all,
    Chris

Members who have read this thread : 1

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts