Questions about using the A to D


Closed Thread
Results 1 to 19 of 19

Hybrid View

  1. #1
    Join Date
    Mar 2011
    Location
    Los Angeles, California
    Posts
    322

    Question Questions about using the A to D

    Hi all!
    Okay so before some one tells me to read the manual the manual only gives a few "guidelines" and nothing in depth. For example it says the ADC_CLOCK can be a value of 2-5 bits and the default value is 3. It does not say what values 2, 4, and 5 are for. Now I have an 18F1320 and wish to use port b.0 as the input from a sensor putting out 0-5 volts. My best guess is this is what the code should look like?

    21 Define ADC_BITS 10 ' Set number of bits in result
    22 Define ADC_CLOCK 3 ' Set clock source (3=rc)
    23 Define ADC_SAMPLEUS 50 ' Set sampling time in uS
    24
    25 adval Var word ' Create adval to store result
    26
    27 TRISB = %11111111 ' Set PORTB to all input
    28 ADCON2 = %10000010 ' Set PORTB analog and right justify result
    30 mainloop:
    31
    32
    33 ADCIN 0, adval ' Read channel 0 to adval

    The other part of this is that the ICD uses port b.1 and port b.4 so would the TRISB statement mess up the IDC?

    Thanks in advance for any and all who wish to help educate me.

    Best, Ed

  2. #2
    Join Date
    May 2013
    Location
    australia
    Posts
    2,389


    Did you find this post helpful? Yes | No

    Default Re: Questions about using the A to D

    The other part of this is that the ICD uses port b.1 and port b.4 so would the TRISB statement mess up the IDC?
    no
    28 ADCON2 = %10000010 ' Set PORTB analog and right justify result
    will not set portb analog , and changes adc clock to fosc/32 which contradicts
    Define ADC_CLOCK 3 ' Set clock source (3=rc)


    ADCIN 0, adval ' Read channel 0 to adval
    ano is porta.1 is this what you mean if so then set adcon1 = %00000001

  3. #3
    Join Date
    Mar 2011
    Location
    Los Angeles, California
    Posts
    322


    Did you find this post helpful? Yes | No

    Default Re: Questions about using the A to D

    Thank you and my wish is to set port B.0 to be the analog input (pin 8). I was not planning on using any of the A ports except for the resonator.

  4. #4
    Join Date
    May 2013
    Location
    australia
    Posts
    2,389


    Did you find this post helpful? Yes | No

    Default Re: Questions about using the A to D

    my wish is to set port B.0 to be the analog input (pin 8)
    portb.0 is an4 use
    ADCIN 4, adval ' Read channel 0 to adval
    and set adcon1 to %00010000


    there is no need to use tris to set the pin to an input just use adcon1 to make it analogue

  5. #5
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,521


    Did you find this post helpful? Yes | No

    Default Re: Questions about using the A to D

    Hi,
    and set adcon1 to %00010000
    Hmm.... I think you've got that backwards...
    Looking at the 18F1320 datasheet, ADCON1 defaults to 0 which means that AN0-AN6 are all analog. If AN4 is the ONLY pin to be used as analog you need ADCON1 = %11101111

    /Henrik.

  6. #6
    Join Date
    Jun 2009
    Location
    Sc*nthorpe, UK
    Posts
    333


    Did you find this post helpful? Yes | No

    Default Re: Questions about using the A to D

    Quote Originally Posted by richard View Post
    there is no need to use tris to set the pin to an input just use adcon1 to make it analogue
    From the datasheet
    17.6 Configuring Analog Port Pins
    The ADCON1, TRISA and TRISB registers all configure
    the A/D port pins. The port pins needed as analog inputs
    must have their corresponding TRIS bits set (input). If
    the TRIS bit is cleared (output), the digital output level
    (VOH or VOL) will be converted
    .

    Which I read as saying tris has to be set along with adcon1 to make it analogue?

  7. #7
    Join Date
    May 2013
    Location
    australia
    Posts
    2,389


    Did you find this post helpful? Yes | No

    Default Re: Questions about using the A to D

    I stand corrected on both counts
    it just goes to show when it comes to pics assume nothing , read data sheet twice . the current pic18f45k20 I'm fooling with says in

    19.1 ADC Configuration
    The A/D operation is independent of the state of the
    ANSx bits and the TRIS bits


    and I read it again and yes the tris bit should be set , I misinterpreted that for sure
    Last edited by richard; - 28th August 2014 at 07:13. Reason: wrong agin

  8. #8
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,521


    Did you find this post helpful? Yes | No

    Default Re: Questions about using the A to D

    Hi,
    Yes the TRIS bit needs to be set.
    That, however, doesn't meant you actually need to set it since it IS set by default at POR.

    /Henrik.

  9. #9
    Join Date
    Mar 2011
    Location
    Los Angeles, California
    Posts
    322


    Did you find this post helpful? Yes | No

    Default Re: Questions about using the A to D

    Thanks Guys, that part makes sense now. If the ICD uses pin 9 (RB1/AN5/TX/CK/INT1) AND PIN 10 (RB4/AN6/RX/DT/KBI0) does that change the ADCON1 pattern?

  10. #10
    Join Date
    May 2013
    Location
    australia
    Posts
    2,389


    Did you find this post helpful? Yes | No

    Default Re: Questions about using the A to D

    have a listen to this about icd setup , I believe if you don't make the pins analogue all should be ok
    I have been wong before though
    http://support.melabs.com/DT/INTOSC_ICD/INTOSC_ICD.html

  11. #11
    Join Date
    Mar 2011
    Location
    Los Angeles, California
    Posts
    322


    Did you find this post helpful? Yes | No

    Question A to D reading confusion

    (A/D threads merged - Robert)



    Hi All!
    So I have my PIC doing the A to D conversion and the reading is strange! With a volt meter I know the voltage is .441 volts. This should give a value of 362. The value I get is 582 which would be for .710 volts! Now I am completely lost as to why the results are not what is expected. Can anyone explain what I am doing wrong?

    Thanks, Ed

    '************************************************* ****************
    '* Name: XXXXSPEEDT2.bas *
    '* Author: Ed Cannady *
    '* Notice: Copyright (c) 2011 *
    '* : All Rights Reserved *
    '* Date: 8/29/2014 *
    '* Version: 1.0 *
    '* Notes: For a 18F1320 and MS4515 *
    '************************************************* *****************

    Define OSC 20
    Define LOADER_USED 1
    Include "Modedefs.bas"
    include "hpwm10L.pbp" ' For future calculations
    ENABLE DEBUG

    #CONFIG
    __CONFIG _CONFIG1H, _HS_OSC_1H & _FSCM_OFF_1H
    __CONFIG _CONFIG2H, _WDT_OFF_2H & _WDTPS_8K_2H
    __CONFIG _CONFIG2L, _PWRT_ON_2L & _BOR_OFF_2L & _BORV_27_2L
    __CONFIG _CONFIG3H, _MCLRE_OFF_3H
    __CONFIG _CONFIG4L, _DEBUG_OFF_4L & _LVP_OFF_4L & _STVR_ON_4L
    __CONFIG _CONFIG5L, _CP0_OFF_5L & _CP1_OFF_5L
    __CONFIG _CONFIG5H, _CPB_OFF_5H & _CPD_OFF_5H
    __CONFIG _CONFIG6L, _WRT0_OFF_6L & _WRT1_OFF_6L
    __CONFIG _CONFIG6H, _WRTC_OFF_6H & _WRTB_OFF_6H & _WRTD_OFF_6H
    __CONFIG _CONFIG7L, _EBTR0_OFF_7L & _EBTR1_OFF_7L
    __CONFIG _CONFIG7H, _EBTRB_OFF_7H
    #ENDCONFIG


    Define ADC_BITS 10
    DEFINE ADC_CLOCK 3
    DEFINE ADC_SAMPLEUS 100

    ADCON1 = %11101111
    TRISB = %11111111

    VOLTS VAR WORD ' Volts reading

    VOLTS = 0 ' Start with a Volts value of zero

    GETVOLTS:

    ADCIN 4, VOLTS
    VOLTS = VOLTS/10

    GOTO GETVOLTS
    Last edited by Demon; - 4th October 2014 at 21:35.

  12. #12
    Join Date
    Mar 2011
    Location
    Los Angeles, California
    Posts
    322


    Did you find this post helpful? Yes | No

    Default Re: A to D reading confusion

    Just in case anyone is looking at this, my original external A/D went from 0-4096. The PIC A/D goes from 0-65535! So a divide by 16 makes everything correct!

  13. #13
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,521


    Did you find this post helpful? Yes | No

    Default Re: A to D reading confusion

    Hi,
    No it doesn't. The ADC in the 18F1320 (as in most PICs) are 10 bits, ie they return a value ranging from 0 to 1023.

    However, since the result is 10bits it needs two 8bit registers (bytes) to store the result and depending on how you have the ADC configured it returns the result left or right justified within those two bytes. So, if the input to the ADC is saturated it returns the value 1023, looking at the two registers for the result (ADRESH and ADRESL) it'll will be either (00000011 11111111 = 1023) or (11111111 11000000 = 65472) depending on if you choose to have the result right or left justified.

    Check the ADCON2 register.

    /Henrik.

  14. #14
    Join Date
    Mar 2011
    Location
    Los Angeles, California
    Posts
    322


    Did you find this post helpful? Yes | No

    Default Re: A to D reading confusion

    Hi Henrik!
    Thanks! You are always a good friend and a very big help and I mean that sincerely. The PIC returns a "VOLTS" value of 5824 representing the .441 volts I see on a voltmeter. If I divide 5824 by 16 then the reading would be 364. I changed the code to be /16 rather than /10. Using a conversion chart where 5.00 volts equals 4096 then 364 is really close. The sensor does vary a little about every 28 second it will read either + or - 4 using the divide by 16 value or 5824 then 5888 without the divide. Not sure why this happens, it's not temperature related and the reference port and sensor port are connected together with a piece of tubing. I do not know how to display the value in the ADCON2 register to do a check.

    Best, Ed

  15. #15
    Join Date
    Oct 2005
    Location
    Sweden
    Posts
    3,521


    Did you find this post helpful? Yes | No

    Default Re: A to D reading confusion

    Hi Ed,
    Your previous ADC had a resolution of 12 bits, ie a value ranging from 0 to 4095.
    The PIC ADC has a resolution of 10 bits, ie a value ranging from 0 to 1023 in "steps" of 1 (0, 1 ,2 ,3, 4....) or from 0 to 65472 in "steps" of 64 (0, 64, 128, 192, 256...)

    If you divide 65472 by 16 you'll get 4092 which is pretty close to 4095 - that's the reason it "works" for you. And if you divide the "step size" of 64 by 16 you'll get 4 so when you see you're value "bouncing" +/- 4 counts it's really only "bouncing" +/- 1 LSB which is kind of expected.

    Try setting ADCON2.7 = 1 to right justify the result and see if you'll get a result from 0 to 1023 with "steps" of 1 instead. If needed, you can then get more resolution by oversampling. Take 16 readings, add them all up and divide by 4 to go from 10 bits to a "psuedo resolution" of 12 bits - for example.

    I'm not saying what you're doing is wrong - as long as it works for you I'm happy :-)
    I just wanted to clarify for you and others that might find your comment about the ADC is going from 0-65535 that the resolution of the ADC is NOT 16bits which you might think it is when reading your post.

    /Henrik.

Similar Threads

  1. PicKit 2 Questions
    By dmairspotter in forum General
    Replies: 3
    Last Post: - 11th November 2007, 21:10
  2. 2 questions
    By Archangel in forum mel PIC BASIC Pro
    Replies: 13
    Last Post: - 1st December 2006, 02:47
  3. Serial questions
    By Armando Herjim in forum Serial
    Replies: 0
    Last Post: - 29th June 2006, 19:49
  4. New with questions
    By Terke in forum General
    Replies: 5
    Last Post: - 6th December 2005, 06:35
  5. Questions?
    By ngeronikolos in forum mel PIC BASIC Pro
    Replies: 5
    Last Post: - 23rd June 2005, 14:44

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