A/D converter fails?


Closed Thread
Results 1 to 15 of 15

Hybrid View

  1. #1
    egberttheone's Avatar
    egberttheone Guest

    Default A/D converter fails?

    I'm building a system to monitor a few powerlines it works well but some times the conversion results into a 0; i took the data sheet of the pic i use (16f88) read the whole chapter about it over and over and i finished up changing my code(snippets; of course the enable bit and so are set) from this:
    Code:
    'GO/DONE: A/D Conversion Status bit
    'If ADON = 1:
    '1 = A/D conversion in progress (setting this bit starts the A/D conversion)
    '0 = A/D conversion not in progress (this bit is automatically cleared by hardware when the A/D
    'conversion is complete)
    symbol AD_Progress = ADCON0.2
    
    
    ADCON0.5 = 0
    ADCON0.4 = 0
    ADCON0.3 = 0
    AD_Progress = 1
    while AD_Progress = 1: wend
    Sound_Level.lowbyte = ADRESL
    Sound_Level.highbyte = ADRESH
    to this:

    Code:
    'GO/DONE: A/D Conversion Status bit
    'If ADON = 1:
    '1 = A/D conversion in progress (setting this bit starts the A/D conversion)
    '0 = A/D conversion not in progress (this bit is automatically cleared by hardware when the A/D
    'conversion is complete)
    symbol AD_Progress = ADCON0.2
    
    ADCON0.5 = 0
    ADCON0.4 = 0
    ADCON0.3 = 0
    pause 50
    AD_Progress = 1
    while AD_Progress = 1: wend
    Sound_Level.lowbyte = ADRESL
    Sound_Level.highbyte = ADRESH
    as I understood of the manual: if I change the input port from the a/d converter I need to wait a minimum of time before recalling a new a/d conversion. So far so good but what happens is it stucks @ "while AD_Progress = 1: wend" because it simply does not clear any more the code above without the pause 50 does work! so if I remove that line "pause 50" the code runs but some times I get a 0 in the result of the a/d conversion :S I don;t get it do you?
    Last edited by egberttheone; - 7th February 2006 at 20:42.

  2. #2
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    ADCON0.0 = 1 ' <-- Turn ON A/D module
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  3. #3
    egberttheone's Avatar
    egberttheone Guest


    Did you find this post helpful? Yes | No

    Thumbs down

    Quote Originally Posted by Bruce
    ADCON0.0 = 1 ' <-- Turn ON A/D module
    please read before replying; i told that all these bits are set AND i sad that it works without the pause command or do you want to say that beacause i added the command line "pause 50" that the a/d conversion module shuts off?

  4. #4
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    Sorry. It's hard to "guess" how you're configuring things if you don't show it in your code.

    I'm sure this isn't what the rest of your own application is doing, but it works fine with the
    pause 50 in there;
    Code:
        @ DEVICE HS_OSC, WDT_ON, LVP_OFF, PROTECT_OFF
        DEFINE OSC 20
        
        SYMBOL AD_Progress = ADCON0.2
        SYMBOL ADON = ADCON0.0
        SYMBOL LED = PORTB.0
      
        Sound_Level VAR WORD
        
        TRISA.0 = 1     ' A/D input
        PORTB.0 = 1     ' LED on at boot
        TRISB.0 = 0     ' LED output
          
        ADCON0 = 128 ' A/D clock Fosc/32, RA0/AN0, A/D disabled
        ANSEL = 1       ' RA0 analog
        ADCON1.7 = 1  ' right justify for 10-bit
    
    Main:
        ADON = 1        ' turn on A/D module
        PAUSE 50        ' wait
        AD_Progress = 1 ' start conversion
        
        WHILE AD_Progress = 1 : WEND
        Sound_Level.lowbyte = ADRESL
        Sound_Level.highbyte = ADRESH
        LED = LED ^ 1    ' toggle LED for visual
        GOTO Main
        
        END
    I left the WDT enabled just to be sure PBP was handling it during the pause periods.
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

  5. #5
    egberttheone's Avatar
    egberttheone Guest


    Did you find this post helpful? Yes | No

    Default

    this code works but if you change the input port of the a/d convertor and then add a pause in the line between changing and a/d conversions start then it stucks.

    example:

    Code:
    'retrieve sound level
    ADCON0.5 = 0
    ADCON0.4 = 0
    ADCON0.3 = 0
    pause 50
    AD_Progress = 1
    while AD_Progress = 1: wend
    Sound_Level.lowbyte = ADRESL
    Sound_Level.highbyte = ADRESH
    
    'retrieve negative level
    ADCON0.5 = 0
    ADCON0.4 = 0
    ADCON0.3 = 1
    pause 50
    AD_Progress = 1
    while AD_Progress = 1: wend
    Negative_Voltage.lowbyte = ADRESL
    Negative_Voltage.highbyte = ADRESH
    
    'retrieve positieve level
    ADCON0.5 = 0
    ADCON0.4 = 1
    ADCON0.3 = 0
    pause 50
    AD_Progress = 1
    while AD_Progress = 1: wend
    Positive_Voltage.lowbyte = ADRESL
    Positive_Voltage.highbyte = ADRESH
    Last edited by egberttheone; - 8th February 2006 at 21:12.

  6. #6
    Join Date
    Jul 2003
    Posts
    2,405


    Did you find this post helpful? Yes | No

    Default

    That's odd. It works for me without getting stuck.

    I modified your version to include 3 LED's in the last section of each channel read routine,
    and all 3 LED's blink right along.

    It doesn't appear to be getting getting stuck at any point.
    Code:
        @ DEVICE HS_OSC, WDT_ON, LVP_OFF, PROTECT_OFF
        DEFINE OSC 20
        
        SYMBOL AD_Progress = ADCON0.2
        SYMBOL ADON = ADCON0.0
        SYMBOL LED1 = PORTB.0
        SYMBOL LED2 = PORTB.1
        SYMBOL LED3 = PORTB.2
      
        Sound_Level VAR WORD
        Negative_Voltage VAR WORD
        Positive_Voltage VAR WORD
        
        TRISA.0 = 1         ' A/D input
        PORTB = %00000111   ' LED's on at boot
        TRISB = 0           ' LED outputs
          
        ADCON0 = 128    ' A/D clock Fosc/32, RA0/AN0, A/D disabled
        ANSEL = 1       ' RA0 analog
        ADCON1.7 = 1    ' right justify for 10-bit
    
    Main:
        ADON = 1        ' turn on A/D module
        PAUSE 50        ' wait
        AD_Progress = 1 ' start conversion 
        WHILE AD_Progress = 1: WEND
        Sound_Level.lowbyte = ADRESL
        Sound_Level.highbyte = ADRESH
        LED1 = LED1 ^ 1    ' toggle LED for visual
        
        'retrieve negative level
        ADCON0.5 = 0
        ADCON0.4 = 0
        ADCON0.3 = 1
        PAUSE 50
        AD_Progress = 1
        WHILE AD_Progress = 1: WEND
        Negative_Voltage.lowbyte = ADRESL
        Negative_Voltage.highbyte = ADRESH
        LED2 = LED2 ^ 1    ' toggle LED for visual
        
        'retrieve positieve level
        ADCON0.5 = 0
        ADCON0.4 = 1
        ADCON0.3 = 0
        PAUSE 50
        AD_Progress = 1
        WHILE AD_Progress = 1: WEND
        Positive_Voltage.lowbyte = ADRESL
        Positive_Voltage.highbyte = ADRESH
        LED3 = LED3 ^ 1    ' toggle LED for visual
        GOTO Main
        
        END
    Are you reading 0-5 VDC voltage levels?
    Regards,

    -Bruce
    tech at rentron.com
    http://www.rentron.com

Similar Threads

  1. Replies: 9
    Last Post: - 31st July 2008, 08:56
  2. A/D converter sample
    By allan josephus in forum mel PIC BASIC
    Replies: 5
    Last Post: - 23rd February 2008, 19:44
  3. A/D converter with pic16f84, i need a help
    By micro in forum General
    Replies: 0
    Last Post: - 13th December 2005, 21:17
  4. help with pic16f870 a/d converter
    By cammo in forum mel PIC BASIC
    Replies: 3
    Last Post: - 22nd March 2005, 05:16
  5. Re Cs5532 A/d Converter
    By massquip in forum mel PIC BASIC Pro
    Replies: 0
    Last Post: - 29th April 2004, 16:31

Members who have read this thread : 0

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