Just had my first attempt dabbling with SPI this evening - fail!
I'm trying to control a AD5206 (six digital pots in the one IC package - http://www.analog.com/static/importe...D5204_5206.pdf)
To test that the wiper on the nominated pot moves I've put 5V on the High side of the internal pot6 pin, & 0V on the low side of pot6 pin. I'm trying to set pot 6's wiper to the midway point (it's a 256 position pot, so I'm sending a value of 127) - but the wiper is not going to 2.5V ....it just sits at 5V.
I've try to join all the 'SPI' elements together (as taken from several threads!). The only bit I'm not totally sure about (& it's pretty fundamental!) is how to send just 11 bits to the AD5206 (the format is three bits to select which of the 6 internal digital pots you want the wiper to move, then send the data to actually control the wiper (3 'variable resistor select' bits + 8 databits so 11 bits in total).
Any ideas....
Code:
@ __CONFIG _FCMEN_OFF & _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _CP_OFF & _IESO_OFF & _BOR_OFF & _PWRTE_OFF
'16F690 Pin Connections....
' PIN# NAME USE & CONNECTION
' 1 Vdd +5VDC power supply
' 9 RC7 SDO (serial Data out)
' 10 RB7 HSEROUT pIN
' 11 RB6 SPI Clock out
' 13 RB4 SDI (serial Data In)
' 16 RCO CS Chip Select (to pin 3 on AD5206) output
' 20 Vss Ground
'*************************************************************************************
DEFINE OSC 8 ' set Oscillator at 8Mhz.
DEFINE NO_CLRWDT 1 ' PBP doesn't clear WDT automatically
DEFINE HSER_SPBRG 25 'HSEROUT Stuff.
DEFINE HSER_TXSTA 24h 'HSEROUT Stuff.
DEFINE HSER_CLROERR 1 'HSEROUT Stuff.
txsta = %10100100 'setup the tx register
RCSTA.7 = 1 'Enable RB7 for TX USART
INTCON.0 = 0 'clears the RABIF Flag (to 0), COULD be 1 on reset (unique to F690)
ANSEL = 0 'disable AtoD.
ANSELH = 0 'disable AtoD.
OPTION_REG = %00000111 'enable weak pullups.
WPUB = %00010000 'enable weak pullups on the SDI RB4 (input from digital pot)
'------SPI setup
SSPEN VAR SSPCON.5 ' SSP Enable bit
CKP VAR SSPCON.4 ' Clock Polarity Select
SMP VAR SSPSTAT.7 ' Data input sample phase
CKE VAR SSPSTAT.6 ' Clock Edge Select bit
SSPIF VAR PIR1.3 ' SPI interrupt flag
SSPCON.5=1 'enable SSP
SSPCON.4=1 'Clock idles high bit name CKP
SSPCON.3=0 ' bit 3 to 0 indicate clock speed. bit 0 set means clock = OSC/16 = 1.25 MHz
SSPCON.2=0
SSPCON.1=0
SSPCON.0=1
SSPSTAT.7=1 ' SPI Master mode
SSPSTAT.6=0 ' data transmitted on rising edge of SCK
SCK var PortB.6 'clock pin
CS var PORTC.0 'chip select
SDI var PortB.4 'data in
SDO var PortC.7 'data out
AD5206 var word 'word used to send 3 control bits + 8 data bits
TrisC.0 = 0 'Chip Select (CS)
TrisB.6 = 0 'SPI Clock Out
TrisB.7 = 0 'Debug Out
' AD5206 Variable resistor select 'Control' bits as as follows....
'000 Select Variable resistor1
'001 Select Variable resistor2
'010 Select Variable resistor3
'011 Select Variable resistor4
'100 Select Variable resistor5
'101 Select Variable resistor6
AD5206 = %00001010111111 'upper byte = select Variable Resistor 6 (ref the table above) , lower byte = set VR6 wiper value to midway
high CS
' CODE TO CONTROL SPI POTENTIOMETER AD5206
Main:
gosub WriteSPI
pause 1000
goto Main
WriteSPI:
LOW CS
Shiftout SDO, SCk, 1, [AD5206 \11] ' not sure about this bit!!
high cs
RETURN
end
Bookmarks