Hello All!
Has anyone had any experience with this chip? Any PBP code snippets would be greatly appreciated (Spec sheet is not much help w/PBP)!
Thanks!
Hello All!
Has anyone had any experience with this chip? Any PBP code snippets would be greatly appreciated (Spec sheet is not much help w/PBP)!
Thanks!
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
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.
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!
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.
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!
Attached is code used with a 16F877 and Max 1270 a/d,similar I believe.
Arniepj - Thanks for the code! I will give it a try (with some modifications, of course). I will let you know how it goes...
Thanks!
Arniepj - Tried your code and am now actually able to get a reading!!! It is off by about 200 mV but it might be because I am using a 4.096 Vref reference (were you using one?). I will play with this a little more to tweek it so that it is accurate and post the final code. What I have now that works is posted below. The other thing that I changed based on your code was going from an external to internal clock on the Control Byte for the chip.
Thanks a million!!!
(and thanks to you too, Steve!)
' Set compiler to use HS (20 mHz)
@ DEVICE HS_OSC
DEFINE OSC 20 'resonator frequency at 20 Mhz
ADCON1 = 7 ' Disable PORTA Analog
' 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
Pause 1000 ' Wait for LCD to startup
Lcdout $fe, $80, "MAX1247"
lcdout $fe, $C0, "Example"
pause 1000
Lcdout $FE, 1 ' Clear LCD screen
'Variables for ADC
CB var byte
CB0 var Byte
CB1 var Byte
CB2 var Byte
CB3 var Byte
'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
' 00 - full power down
' 01 - fast power down
' 10 - internal clock mode
' 11 - external clock 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, internal clock mode,
' Control Byte (CB) = 10011110
CB0 = %10011110 'To read Channel 0
CB1 = %11011110 'To read Channel 1
CB2 = %10101110 'To read Channel 2
CB3 = %11101110 '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 'DIpin as output
TRISA.3 = 1 'DOpin as input
' ******** Declarations *******************************
Voltage1 var word
Voltage2 var word
Voltage3 var word
Voltage4 var word
SerialDataOut var byte ' Serial data out to Max1247 A/D
SerialDataIn var word ' Serial data in from Max1247 A/D
Indexer var byte ' Loop indexer for data in
' ********* Presets ****************************
SerialDataOut = cb0
SerialDataIn = 0
clkpin = 0 ' Clock signal
cspin = 0 ' Chip select: low selects
dinpin = 0 ' Serial data out
doutpin = 0 ' Serial data in
'******Main Program ********************************
DataOut:
gosub DataAcquisition 'Read data from Max1247
Voltage1 = SerialDataIn * 2 ' Convert data to voltage
Voltage2 = (SerialDataIn * 4)/10 ' Convert data to voltage
Voltage3 = (SerialDataIn * 4)/100 ' Convert data to voltage
Voltage4 = Voltage1 + Voltage2 + Voltage3 + 9 ' Convert data to voltage
lcdout $FE, $80, #Voltage4, " " ' Display data
SerialDataIn = 0
goto Dataout
'************ Data Acquisition ***************************
DataAcquisition:
for Indexer = 7 to 0 step -1 ' Output data,8 clock pulses
dinpin = SerialDataOut.0[Indexer] ' Output data port
pulsout clkpin,5 ' Output clock pulse
next Indexer ' Next data bit,next clock pulse
for Indexer = 1 to 12 ' Read data,12 clock pulses
SerialDataIn = SerialDataIn * 2 ' Shift each bit to the left
SerialDataIn = SerialDataIn + doutpin ' Data in port
pulsout clkpin,5 ' Output clock pulse
next Indexer ' Next data bit,next clock pulse
return
end
Hello All - Here is the final version of the software. Note that I am using a 2.5V Vref with the MAX1247, so you will have to change the voltage calculation if you are using a different Vref or none at all.
Enjoy!
' Set compiler to use HS (20 mHz)
@ DEVICE HS_OSC
DEFINE OSC 20 'resonator frequency at 20 Mhz
ADCON1 = 7 ' Disable PORTA Analog
' 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
Pause 1000 ' Wait for LCD to startup
Lcdout $fe, $80, "MAX1247"
lcdout $fe, $C0, "Example"
pause 1000
Lcdout $FE, 1 ' Clear LCD screen
'Variables for ADC
CB var byte
CB0 var Byte
CB1 var Byte
CB2 var Byte
CB3 var Byte
'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
' 00 - full power down
' 01 - fast power down
' 10 - internal clock mode
' 11 - external clock 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, internal clock mode,
' Control Byte (CB) = 10011110
CB0 = %10011110 'To read Channel 0
CB1 = %11011110 'To read Channel 1
CB2 = %10101110 'To read Channel 2
CB3 = %11101110 '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 'DIpin as output
TRISA.3 = 1 'DOpin as input
' ******************************** Declarations ********************************************
Voltage var word
SerialDataOut var byte ' Serial data out to Max1247 A/D
SerialDataIn var word ' Serial data in from Max1247 A/D
Indexer var byte ' Loop indexer for data in
' ******************************** Presets ************************************************
SerialDataOut = cb0
SerialDataIn = 0
clkpin = 0 ' Clock signal
cspin = 0 ' Chip select: low selects
dinpin = 0 ' Serial data out
doutpin = 0 ' Serial data in
'********************************* Main Program *********************************************
DataOut:
gosub DataAcquisition ' Read data from Max1247
lcdout $FE, $80, #Serialdatain, " " ' Display data
lcdout $FE, $C0, #voltage, " " ' Display calculated voltage
goto Dataout
'******************************** Data Acquisition ***************************
DataAcquisition:
SerialDataIn = 0
for Indexer = 7 to 0 step -1 ' Output data,8 clock pulses
dinpin = SerialDataOut.0[Indexer] ' Output data port
pulsout clkpin,5 ' Output clock pulse
next Indexer ' Next data bit,next clock pulse
for Indexer = 1 to 12 ' Read data,12 clock pulses
SerialDataIn = SerialDataIn * 2 ' Shift each bit to the left
SerialDataIn = SerialDataIn + doutpin ' Data in port
pulsout clkpin,5 ' Output clock pulse
next Indexer ' Next data bit,next clock pulse
SerialDataIn = SerialDataIn * 2 ' Shift each bit to the left
'Using a 2.5V Reference with ADC, therefore, 2500 / 4096 = 0.6 mV per step
'Multiply the result (SerialDataIn) by 6
voltage = serialdatain * 6
voltage = voltage / 10 'shift decimal point
return
end
Atom050,
Glad to help.An alternative is to use the hardware spi,but since you had a board already,changing i/o might not be possible.
Bookmarks