MAX1247 4-Channel, 12-Bit ADC


Closed Thread
Results 1 to 15 of 15

Hybrid View

  1. #1
    Join Date
    Sep 2006
    Location
    Florida, USA
    Posts
    94


    Did you find this post helpful? Yes | No

    Default OK, What am I missing?

    I have scoured all of my resources and have come up with the following code but I seem to be missing something. Can anyone provide some insight?

    ' Set compiler to use HS (20 mHz)
    @ DEVICE HS_OSC
    DEFINE OSC 20 'resonator frequency at 20 Mhz

    ' Define the LCD Hookup parameters
    ' data pins D4-D7 are hooked to pins C.0-C.3, respectively
    define LCD_DREG PORTC 'Data Port = PORTC
    define LCD_DBIT 0 'Data starting bit = 0
    define LCD_RSREG PORTC 'Register Select Port = PORTC
    define LCD_RSBIT 4 'RS bit = PortC.4
    define LCD_EREG PORTC 'Enable Port = PORTC
    Define LCD_EBIT 5 'Enable Bit = PortC.5
    define LCD_BITS 4 'LCD Bus Size = 4
    define LCD_LINES 2 'Number of lines on LCD

    define SHIFT_PAUSEUS 1000 '

    Pause 1000 ' Wait for LCD to startup
    Lcdout $FE, $80, "MAX1247"
    lcdout $FE, $C0, "Example"
    pause 1000

    'Variables for ADC
    CB var byte
    CB0 var Byte
    CB1 var Byte
    CB2 var Byte
    CB3 var Byte

    ADResult var word ' contains the result of the read
    X var byte ' counter

    'Control Byte Setup:
    ' Bit 7: Start Bit = 1
    ' Bit 6: Channel Select Bit 2 (SEL2) -See Channel Selection Below
    ' Bit 5: SEL1
    ' Bit 4: SEL0
    ' Bit 3: UNI/BIP - 1=Unipolar 0=Bipolar
    ' Bit 2: SNGL/DIF - 1=Single Ended 0=Differential
    ' Bit 1: PD1 - Sets clock and power down mode
    ' Bit 0: PD0 - Sets clock and power down mode

    'Channel Selection:
    ' SEL2 SEL1 SEL0
    'CH0 0 0 1
    'CH1 1 0 1
    'CH2 0 1 0
    'CH3 1 1 0

    ' To read channel 0 in Unipolar, single ended, external clock mode,
    ' Control Byte (CB) = 10011111
    CB0 = %10011111 'To Read Channel 0
    CB1 = %11011111 'To read channel 1
    CB2 = %10101111 'To read Channel 2
    CB3 = %11101111 'To read Channel 3

    ' Set up MAX1247 4-channel 12-bit ADC
    CLKpin var PORTA.0 'SPI clock pin
    CSpin var PORTA.1 'DAC chip select
    DINpin var PORTA.2 'Data in pin
    DOUTpin var PORTA.3 'Data Out Pin

    'set up Max1247 pins
    TRISA.0 = 0 'CLKpin as output
    TRISA.1 = 0 'CSpin as output
    TRISA.2 = 0 'DINpin as output
    TRISA.3 = 1 'DOUTpin as input

    'Take Reading
    CB = CB0 'Read Channel 0
    Loop:
    CSpin = 1 'keep max1247 off until called
    clkpin = 0 'keep clock low until ready

    gosub ReadADC

    Lcdout $FE, 1 ' Clear LCD screen

    Lcdout $FE, $80, #ADresult

    pause 330
    goto loop

    ReadADC:
    'Send Control Byte
    low CSpin 'cs going low starts the conversion process
    shiftout doutpin, clkpin, 1, [cb\8]
    high cspin
    pause 10

    'Read Result
    adresult = 0
    low cspin
    shiftin dinpin, clkpin, 0, [adresult\12]
    high cspin

    return

    end

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


    Did you find this post helpful? Yes | No

    Default

    try..
    Code:
    ReadADC:
            'Send Control Byte
        low CSpin 'cs going low starts the conversion process
        shiftout doutpin, clkpin, 1, [cb\8]
            'Read Adc
        shiftin dinpin, clkpin, 0, [adresult\12]
        high cspin
    
        return
    Steve

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

  3. #3
    Join Date
    Sep 2006
    Location
    Florida, USA
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    Steve - Thanks for your reply (again). Unfortunately, the suggestion did not work. I have attached my board layout. It is pretty straight forward - Do you see anything I am missing? Ignore the other chip - it is a 12-bit D-A chip that works fine... Just can't get the input side of this to work. You will see that I have a pot supplying a voltage to CH0 of the MAX1247. I am trying to read this and display the result on the LCD.

    Thanks!
    Attached Images Attached Images

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


    Did you find this post helpful? Yes | No

    Default

    First observation, you have to disable ADCs on PORTA
    ADCON1=7

    and at the top, you should insert a short PAUSE (let's say 50) after
    CSpin = 1
    Just for safety sake


    sorry i'm too lazy tonight to check the whole thing

    Fortunately, someone else may have a deeper look to?
    Steve

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

  5. #5
    Join Date
    Sep 2006
    Location
    Florida, USA
    Posts
    94


    Did you find this post helpful? Yes | No

    Default

    Steve - I was really hoping that the ADCON1 thing was it as I missed that one, but still no go. I did the 50 mS pause you recommended, too.

    I can't help but think this is one of those "can't see the forest through the trees" thing. I'm sure it's staring me right in the face. I am using a 12 bit D/A (4-channel) chip (MAX525) on this board as well and it works perfectly. Can't imagine why the A/D chip is giving me such a hard time...

    Let me know if you think of anything else! Thanks!

  6. #6
    Join Date
    Sep 2006
    Location
    Florida, USA
    Posts
    94


    Did you find this post helpful? Yes | No

    Default Is this what I'm missing?

    This is out of the data sheet for the MAX1247:

    "the simplest software interface requires only
    three 8-bit transfers to perform a conversion (one 8-bit
    transfer to configure the ADC, and two more 8-bit transfers
    to clock out the 12-bit conversion result)."

    "Simple Software Interface
    Make sure the CPU’s serial interface runs in master
    mode so the CPU generates the serial clock. Choose a
    clock frequency from 100kHz to 2MHz.

    1) Set up the control byte for external clock mode and call it TB1. TB1 should be of the format: 1XXXXX11 binary, where the Xs denote the particular channel and conversion mode selected.

    2) Use a general-purpose I/O line on the CPU to pull CS low.

    3) Transmit TB1 and, simultaneously, receive a byte and call it RB1. Ignore RB1.

    4) Transmit a byte of all zeros ($00 hex) and, simultaneously, receive byte RB2.

    5) Transmit a byte of all zeros ($00 hex) and, simultaneously, receive byte RB3.

    6) Pull CS high.

    Figure 5 shows the timing for this sequence. Bytes RB2
    and RB3 contain the result of the conversion, padded
    with one leading zero and three trailing zeros. The total
    conversion time is a function of the serial-clock frequency
    and the amount of idle time between 8-bit
    transfers. To avoid excessive T/H droop, make sure the
    total conversion time does not exceed 120μs."

    This seems to be telling me that I have to shift out 3 bytes (control, $00, $00) and I read back 3 bytes - the result is contained in the 2nd two bytes. It also mentions choosing a clock frequency of 100kHz to 2MHz. How do I do that?

    I made a stab at the three out, three in routine but no result:

    ReadADC:
    low CSpin
    shiftout doutpin, clkpin, 1, [cb] 'Send Control Byte
    shiftin dinpin, clkpin, 0, [rb1] 'Read RB1 in and discard
    shiftout doutpin, clkpin, 1, [$00] 'Send a byte of zeros
    shiftin dinpin, clkpin, 0, [rb2] 'Read RB2
    shiftout doutpin, clkpin, 1, [$00] 'Send a byte of zeros
    shiftin dinpin, clkpin, 0, [rb3] 'Read RB3 - RB2&3 contain result
    high cspin

    return

    Am I using the right modes for shiftin and out?

Similar Threads

  1. MCP3208 12 bit A/D driver
    By polymer52 in forum Code Examples
    Replies: 0
    Last Post: - 5th February 2010, 11:59
  2. PICBasic newbie problem
    By ELCouz in forum mel PIC BASIC Pro
    Replies: 32
    Last Post: - 12th February 2008, 00:55
  3. Flash PIC with 12 bit ADC
    By Steve_88 in forum mel PIC BASIC Pro
    Replies: 6
    Last Post: - 12th October 2007, 20:35
  4. Microcontroller with 2 way paging application problem
    By oneohthree in forum mel PIC BASIC Pro
    Replies: 30
    Last Post: - 20th April 2007, 17:27
  5. Real Time Clock & Eeprom
    By smart_storm in forum General
    Replies: 8
    Last Post: - 17th February 2006, 19:03

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