A/D conversion with PIC18F67J50


Closed Thread
Results 1 to 10 of 10

Hybrid View

  1. #1
    Join Date
    Feb 2006
    Location
    Gilroy, CA
    Posts
    1,530


    Did you find this post helpful? Yes | No

    Default

    Thanks Darrel,

    I commented out my ADCON0 = %00000000 and put the loop back in, and confirmed my loop is looping. My result seems to be stuck at 24543, 40910 or 8142 each time I reset. Basically giving me random numbers as best I can tell. But despite the loop looping, the numbers do not change, until I remove power from the unit, then apply power again.

    Code:
    DEFINE OSC 48
    
    include "modedefs.bas"
    include "LCD_3310.pbp"
    
    TRISD = 0
    PORTD.0 = 1   'turn on g sensor
    PORTD.1 = 0   'select scale for g sensor
    PORTD.2 = 0   'select scale for g sensor
    
    
    TRISA = %00000111   'set porta.0, 1, and 2 as inputs
    TRISB = 0
    CM1CON = 7
    CM2CON = 7
    TRISC = 0
    TRISE = 0
    ADCON0 = %00000001      'turn on adc
    ADCON1 = %00000010      'fosc/32 ?? 
    'am I translating c language ADCON1=0x10 above correctly?
    
    resx var word
    x var word
    y var word
    z var word
    adval var word
    
    x=0
    y=0
    z=0
    adval = 0
    
    PORTD.0 = 1   'turn on g sensor (again)
    '*************************************************
    @ bsf WDTCON,ADSHR   ;set shared address SFR with WTCON<4> - is this right?
    ADCON0 = %11111110  ' channel with a 0 is analog input, all others digital
    @ bcf WDTCON,ADSHR
    ADCON1 = %10111110  'right justified, AD=20AD, A/D clock=fosc/64
    ADCON0.0 = 1        'turn on adc
    
    ADCON0.2 = 0        'channel select bit CHS0(should already be a 0)
    ADCON0.3 = 0        'Channel select bit CHS1(should already be a 0)
    
    
    start:
        Pause 500       ' Wait .5 second
    loop: 		ADCON0.1 = 1					'Start Conversion
    adval = 0                                   'clear result word
    notdone:	pause 5
    	if ADCON0.1 = 1 Then notdone	'wait for low on bit-2 of ADCON0, conversion finished
    
    	adval.highbyte = ADRESH			'move HIGH byte of result to adval
    	adval.lowbyte = ADRESL			'move LOW byte of result to adval
                
            'ADCON0 = %00000000              'turn off adc
    	    	
            'Lcdout $fe, 1   				'Clear screen
            'Lcdout "Value: ", DEC adval	'Display the decimal value  
                x = x +1                        'test to see if loop is working
    @ PrintStr 0,0, "Z= "                       ;display on Nokia 3310
    @ PrintVar 24,0, _adval                     ;display result on 3310
    @ PrintVar 0,1, _x                          ;show if loop is looping
            Pause 100       				'Wait .1 second
    
           	Goto loop       				'Do it forever
    End
    http://www.scalerobotics.com

  2. #2
    Join Date
    Feb 2006
    Location
    Gilroy, CA
    Posts
    1,530


    Did you find this post helpful? Yes | No

    Default

    Whoops,

    I noticed that it was going to my include file, then popping up at start: which missed all my settings to the ADCON0 etc.

    Sometimes I have to say it out loud (to everyone) to figure it out, with the help of some experts. I won't tell anyone how many days I was trying..........

    Thanks,

    Walter
    Last edited by ScaleRobotics; - 6th May 2009 at 21:04.
    http://www.scalerobotics.com

  3. #3
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    You conversion clock seems a bit high @48MHz operation, and your first example in C used ANCON0, not yours.... yet...

    While it's not a problem for now, one day you may need to disable some analog feature on this PIC... however, seems ANCON0 and ANCON1 are not included in PBP 2.50c, so I guess the following would be handy one day or another.
    Code:
            '
            '       Configure ADC
            '       =============
            ANCON0  VAR BYTE EXT    ' not included in PBP2.50c
            ANCON1  VAR BYTE EXT    ' not included in PBP2.50c
            
            ANCON0 = %10011110
                   '  -xx------ Not Implemented
                   '  1--1111-- AN7, & AN<4:1> = Digital
                   '  -------0- AN0 = Analog
                   
            ANCON1 = %11111111
                   '  11111111- AN<15:10> = Digital
                                         
            ADCON0 = %00000001
                   '  0-------- VCFG1, Vref- 0 = AVss (1=AN2)
                   '  -0------- VCFG2, Vref+ 0 = AVdd (1=AN3) 
                   '  --0000--- CHS<3:0>, Channel select -- 0
                   '  ------0-- Go/Done, don't care for now
                   '  -------1- ADON, Enable ADC
                      
            ADCON1 = %10000111
                   '  1-------- ADFM, Right justified result
                   '  -0------- ADCAL, Normal A/D converter operation
                   '  --000---- ACQT<2:0>, A/D Aquisition time = 0 Tad
                   '  -----111- ADCS<2:0>, A/D conversion clock = FRC
                    
            '
            '       Hardware Aliases
            '       ================
            GoDone      var ADCON0.1 ' StartConversion = 1, Conversion done = 0
            
            '
            '       Software Variables
            '       ==================
    @ADVal = ADRESL
            ADVal       VAR WORD EXT
            
    Start:
            pauseus 10  ' Acquisition time        
            GoDone = 1
            While GoDone : Wend
            LCDOUT $FE, 1, "Value: ", DEC ADVal
            PAUSE 250
            GOTO START
    EDIT: for some odd reason, ANCON0 & ANCON1 are commented in PIC18EXT.BAS, i'd sent an e-mail to Melabs, obviously they must have a reason for that.
    Last edited by mister_e; - 6th May 2009 at 22:04.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  4. #4
    Join Date
    Feb 2006
    Location
    Gilroy, CA
    Posts
    1,530


    Did you find this post helpful? Yes | No

    Default

    Thanks mister_e ! I have flipped to page 299 to 302 so many times but never noticed the "D" to "N" change. Doh!

    Do you think it is edited out because it is a shared address, only distinguished by the address share bit ADSHR in the WDTCON register?

    Currently I have to:
    @ bsf WDTCON,ADSHR 'flag address share bit
    ADCON0 = %11111000 ' channels with a 0 is analog input, all others digital
    @ bcf WDTCON,ADSHR
    (or should I say I think? I have to....)

    to set the aNcon0 register

    (Despite all my mistakes, I am now getting valid conversion results, as of post 4)
    Last edited by ScaleRobotics; - 6th May 2009 at 22:34.
    http://www.scalerobotics.com

  5. #5
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    Holly crap, yeah, that make sense indeed. Yet another stupidity from Microchip

    So my example will need some changes...
    Code:
            '
            '       Configure ADC
            '       =============
            ANCON0  VAR BYTE EXT    ' not included in PBP2.50c
            ANCON1  VAR BYTE EXT    ' not included in PBP2.50c
            
            WDTCON.4 = 1    ' Switch to Alternate SFR
            ANCON0 = %10011110
                   '  -xx------ Not Implemented
                   '  1--1111-- AN7, & AN<4:1> = Digital
                   '  -------0- AN0 = Analog
                   
            ANCON1 = %11111111
                   '  11111111- AN<15:10> = Digital
                                         
            WDTCON.4 = 0    ' Back to Default SFR
    or
    Code:
            '
            '       Configure ADC
            '       =============
            WDTCON.4 = 1    ' Switch to Alternate SFR
            
            ADCON1 = %10011110  ' alternate ANCON0
                   '  -xx------ Not Implemented
                   '  1--1111-- AN7, & AN<4:1> = Digital
                   '  -------0- AN0 = Analog
                   
            ADCON0 = %11111111  ' alternate ANCON1 
                   '  11111111- AN<15:10> = Digital
                                         
            WDTCON.4 = 0    ' Back to Default SFR
    By far, i prefer the first, easier to read

    However, yours work.. keep it like that. If it's not broken, don't fix it!
    Last edited by mister_e; - 6th May 2009 at 23:00.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  6. #6
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    Side note... there's no real need to redefine ANCON1, ANCON0 as i did if you use ANCON1_ALT, ANCON0_ALT within your code. Those two are defined in PIC18EXT.BAS.

    Having _ALT written at the right of the register name, may remember you to set/clear WDTCON.4 bit? Maybe
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

  7. #7
    Join Date
    Feb 2006
    Location
    Gilroy, CA
    Posts
    1,530


    Did you find this post helpful? Yes | No

    Default

    Quote Originally Posted by mister_e View Post
    Side note... there's no real need to redefine ANCON1, ANCON0 as i did if you use ANCON1_ALT, ANCON0_ALT within your code. Those two are defined in PIC18EXT.BAS.

    Having _ALT written at the right of the register name, may remember you to set/clear WDTCON.4 bit? Maybe
    Sweet! I did not see that either. May be time for glasses. And a lot cleaner than the way I was doing it, and I like the way you wrote the registry bits in the code. That would have kept me from having to divert my attention to and from tfm a lot!

    Thanks for all the help.

    Walter
    http://www.scalerobotics.com

  8. #8
    Join Date
    Sep 2004
    Location
    montreal, canada
    Posts
    6,898


    Did you find this post helpful? Yes | No

    Default

    To me, comments are really important. So, on the long run... coding like that
    Code:
            ADCON0 = %00000001
                   '  0-------- VCFG1, Vref- 0 = AVss (1=AN2)
                   '  -0------- VCFG2, Vref+ 0 = AVdd (1=AN3) 
                   '  --0000--- CHS<3:0>, Channel select -- 0
                   '  ------0-- Go/Done, don't care for now
                   '  -------1- ADON, Enable ADC
    May indeed avoid to open the datasheet all the time, one thing is sure, it's easier to modify/understand later.
    Last edited by mister_e; - 8th May 2009 at 02:03.
    Steve

    It's not a bug, it's a random feature.
    There's no problem, only learning opportunities.

Similar Threads

  1. Fast / low resolution A/D conversion
    By AndrewC in forum General
    Replies: 7
    Last Post: - 7th April 2009, 12:18
  2. A/D conversion problem in 18F2520, 2523, 2550 etc.
    By selimkara in forum mel PIC BASIC Pro
    Replies: 9
    Last Post: - 10th March 2008, 16:26
  3. A/D conversion problem on 18F4431
    By ttease in forum mel PIC BASIC Pro
    Replies: 3
    Last Post: - 10th April 2007, 23:03
  4. A/D converter fails?
    By egberttheone in forum mel PIC BASIC Pro
    Replies: 14
    Last Post: - 13th February 2006, 18:57
  5. Strange A/D conversion...
    By Christos_K in forum mel PIC BASIC Pro
    Replies: 4
    Last Post: - 5th June 2005, 01:35

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