I am confuse


Closed Thread
Results 1 to 20 of 20

Thread: I am confuse

Hybrid View

  1. #1
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    I picked up the below method of reading the ADC here
    http://www.rentron.com/PICX2.htm
    I like it much better than ADCIN.

    The below code is an example for reading ADC channel 0. Look at the example on the above link to add other channels.

    It looks like a lot of stuff to do to read the ADC, pretty much what ADCIN does behind the scenes. This way you have control.
    The "READ_AD" part is only needed once no matter how many channels you are reading (reusable).

    Use your LCD or SERIAL to see what is happening. I have this running at 2400 baud. Works OK with the internal OSC for testing.

    Code:
    [color=#000000]    '16F88 ADC TEST  FOR CHANNEL 0
        DEFINE OSC 4           
        OSCCON = %01100000
        @ __config _CONFIG1, _INTRC_IO & _WDT_OFF & _LVP_OFF & _MCLR_OFF &_CP_OFF
        ANSEL = %00001111
        TRISA = %11111111
        CHAN0  VAR WORD   'VAR TO HOLD ADC0 READING
        START:
        HIGH PORTB.3    'HEART BEAT
        PAUSE 250
        LOW PORTB.3
        PAUSE 250
        'BELOW WILL SHOW WHAT THE ADRESH AND ADRESL REGISTER HOLDS
        SEROUT2 PORTB.2, 16780, ["ADRESH ",DEC ADRESH," ADRESL ",DEC ADRESL,$a,$d]
        PAUSE 50
        'BELOW SHOWS THE 10 BIT READING OF ADC0 IN VAR CHAN0
        SEROUT2 PORTB.2, 16780, ["CHAN0 ",DEC CHAN0,$a,$d]
        GOSUB ADC_0      'STARTS THE READING OF ADC CHANNEL 0
        GOTO START
        
        ADC_0:       'READ AN0
        ADCON1 = %10000000      'SET FOR 10 BIT
        ADCON0 = %00000001      'TURNS ADC ON
        GOSUB   READ_AD
        CHAN0.HighByte = ADRESH  'PLACES THE HIGH AND LOW BYTE
        CHAN0.LowByte  = ADRESL   'INTO VAR CHAN0
        RETURN
        
        READ_AD:   'DOES THE ADC CONVERSION
        PAUSE   50
        ADCON0.2 = 1
        PAUSE   50
        RETURN  
    
    Last edited by mackrackit; - 7th April 2011 at 00:53.
    Dave
    Always wear safety glasses while programming.

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


    Did you find this post helpful? Yes | No

    Default

    You can actually improve on that Dave...

    Instead of...

    ADCON0.2=1
    PAUSE 50
    RETURN

    ... which makes the assumption that your ADC reading will complete in 50mS... well - suppose it didn't? And suppose it only took only 50uS then you've wasted a shed load of time!

    So, rather than a hit or miss approach, nail it properly...

    ADCON0.2=1
    WHILE ADCON0.2=1:WEND
    RETURN

    To find out why I've done this, read the Datasheet description for pin ADCON0.2

  3. #3
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,653


    Did you find this post helpful? Yes | No

    Post

    A2D8.bas example program, in the SAMPLES Folder ...

    While ... Wend did not exist in those prehistoric times this example was written ...


    Still no code available from tim ???

    Alain
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

  4. #4
    Join Date
    Nov 2003
    Location
    Wellton, U.S.A.
    Posts
    5,924


    Did you find this post helpful? Yes | No

    Default

    COOL!!!

    This is what I have said. You learn by trying to help.
    Been using something like I posted all along and of course I have read that part about that bit but it never clicked...

    Maybe that is why it is called GO/DONE

    Prehistoric??? Maybe there is another message here.
    Dave
    Always wear safety glasses while programming.

  5. #5
    Join Date
    Jul 2003
    Posts
    2,358


    Did you find this post helpful? Yes | No

    Default

    Well even in prehistoric times IF was available to you...

    Code:
    	ADCON0.2=1
    ADCTIMEOUT:
    	IF ADCON0.2=1 THEN ADCTIMEOUT
    	RETURN

  6. #6
    Join Date
    May 2004
    Location
    NW France
    Posts
    3,653


    Did you find this post helpful? Yes | No

    Wink

    Hi, Mel

    my prehistorics datings ( 14 Carbide ...) are V2.21 ...

    Code:
    mainloop: ADCON0.2 = 1		' Start Conversion
    
    notdone: Pause 5
    	If ADCON0.2 = 1 Then notdone	' Wait for low on bit-2 of ADCON0, conversion finished
    
    	adval = ADRESH		' Move high byte of result to adval
    of course it's impossible you knew it, may be your grand'dad ...

    I suspect " Pause 5 " here for 10,000 microns handcarved silicium "1650" processor ( PIC's ancester )...

    Regards
    Alain
    Last edited by Acetronics2; - 16th October 2009 at 17:19.
    ************************************************** ***********************
    Why insist on using 32 Bits when you're not even able to deal with the first 8 ones ??? ehhhhhh ...
    ************************************************** ***********************
    IF there is the word "Problem" in your question ...
    certainly the answer is " RTFM " or " RTFDataSheet " !!!
    *****************************************

  7. #7
    Join Date
    Aug 2009
    Posts
    33


    Did you find this post helpful? Yes | No

    Red face I am back...

    Well after reading all of your posts and did some research on the 16f88 datasheet I applied some changes to my own program that looks it has improved. With all channels 0 to 3 straight to ground I got channels 2 and 3 to 0 and channels 0 and 1 to some value of 14. I am adding the program listing for your evaluation. Thank you in advance.


    @ __config _CONFIG1, _INTRC_IO & _WDT_ON & _LVP_OFF & _CP_OFF

    INCLUDE "modedefs.bas"
    ANSEL = %00001111 'set RA0-RA3 as analog inputs
    ADCON1 = %10000000 'Right Justifies 10-bit value
    OSCCON = $60 'Sets the internal oscillator to 4 Mhz
    CMCON = 7 'Comparators off

    DEFINE ADC_BITS 10 ' Sets the number of bits in the result to 10

    ti var byte
    ti = 50 '20 MILLISECONDS DELAY'
    A VAR word
    B VAR word
    C VAR word
    D VAR word
    TRISA = %00001111
    TRISB = 0 'TURN PORT B as outputs but RB1 WHEN USE ICD FOR COMMUNICATION

    '* * * * * MAIN PROGRAM START HERE * * * * * * * *

    PAUSE 1000
    Serout PORTB.1, 0, [254,1]
    Serout PORTB.1, 0, [254,2]
    PAUSE 20

    READSENSORS:

    ADCON0 = %00000001 'Turn ON CHAN 0
    GOSUB ADCON
    A.LOWBYTE = ADRESL 'PLACES THE LOW BYTE INTO VAR
    SEROUT PORTB.1 , 0, ["Ch 0= ",# A.LOWBYTE]
    pause 20

    ADCON0 = %00001001 'Turn ON CHAN 1
    GOSUB ADCON
    B.LOWBYTE = ADRESL 'PLACES THE LOW BYTE INTO VAR
    SEROUT PORTB.1 , 0, [" Ch 1= ",# B.LOWBYTE]
    PAUSE 20

    SEROUT PORTB.1,0,[$FE,$C0]

    ADCON0 = %00010001 'Turn ON CHAN 2
    GOSUB ADCON
    C.LOWBYTE = ADRESL 'PLACES THE LOW BYTE INTO VAR
    SEROUT PORTB.1 , 0, ["Ch 2= ",# C.LOWBYTE]
    PAUSE 20

    ADCON0 = %00011001 'Turn ON CHAN 3
    GOSUB ADCON
    D.LOWBYTE = ADRESL 'PLACES THE LOW BYTE INTO VAR
    SEROUT PORTB.1 , 0, [" Ch 3= ",# D.LOWBYTE]
    PAUSE 1000

    Serout PORTB.1, 0, [254,1]

    GOTO READSENSORS ' PROVISIONAL LOOP TO CHECK THE A/D CONVERTION.

    '* * * * * * * * * SELECTING THE MOTOR MOVEMENT * * * * * * * *

    IF A =0 and D =0 or C =0 and b =0 THEN GOTO READSENSORS 'IT IS DARK
    IF ABS (A-D)<10 OR ABS (B-C)<10 THEN GOTO READSENSORS 'IT IS ALIGNED

    If (B>D) OR (A>C) Then gosub Front
    IF (A>B) OR (C>D) THEN GOsub Left
    IF (C>A) OR (D>B) THEN GOsub Back
    IF (D>C) OR (B>A) THEN GOsub Right

    GOTO READSENSORS 'STAY FOR EVER LOOPING

    '* * * * * * * * * MOTOR'S MOVEMENTS SUBRUTINES * * * * * * * *

    Front:
    Serout PORTA.6, 0, ["FRONT ",# ABS (B-D)," ",# ABS (A-C)]
    SEROUT PORTA.6, 0, [$FE,$C0]
    PORTB = 1 'GOING FRONT
    PAUSE TI
    PORTB = 2
    PAUSE TI
    PORTB = 4
    PAUSE TI
    PORTB = 8
    PAUSE TI
    Return
    LEFT:
    Serout PORTA.6, 0, ["LEFT ",# ABS (a-b)," ",# ABS (C-D)]
    SEROUT PORTA.6, 0, [$FE,$C0]
    PORTB = 128 'GOING LEFT
    PAUSE TI
    PORTB = 64
    PAUSE TI
    PORTB = 32
    PAUSE TI
    PORTB = 16
    PAUSE TI
    Return

    Back:
    Serout PORTA.6, 0, ["BACK ",# ABS(C-A)," ",# ABS(D-B)]
    SEROUT PORTA.6, 0, [$FE,$C0]
    PORTB = 8 'GOING BACK
    PAUSE TI
    PORTB = 4
    PAUSE TI
    PORTB = 2
    PAUSE TI
    PORTB = 1
    PAUSE TI
    Return
    RIGHT:
    Serout PORTA.6, 0, ["RIGHT ",# ABS(D-C)," ",# ABS(B-A)]
    SEROUT PORTA.6, 0, [$FE,$C0]
    PORTB = 16 'GOING RIGHT
    PAUSE TI
    PORTB = 32
    PAUSE TI
    PORTB = 64
    PAUSE TI
    PORTB = 128
    PAUSE TI
    Return

    ADCON:
    ADCON1 = %10000000 'SET FOR 10 BITS
    ADCON0.2 = 1 'IT'S ONE TILL IT READS
    WHILE ADCON0.2 = 1 : WEND
    RETURN

    END

Similar Threads

  1. Replies: 288
    Last Post: - 25th August 2008, 16:53

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