I'm working on a project using the Microchip MCP4261 Digital Pots. Cute little parts...
Here's a code snippet and a schematic as example. The code is an example of reading a "real" pot via A/D and updating a "digital pot" with the value. I'm using the LAB-X2 board from meLabs for testing. The code uses the on-board POT1 for one channel (RA0) and a second off-board pot for channel two (RA1). Put a voltmeter on the wiper of the digital pot to see the values update. There are a few other features of the digital pot that can be used simply by changing the "address" value. There's code in there for writing the A/D value to a serial LCD display for testing - ignore it. Simple but maybe useful to someone...
Have fun.
MT
MCP4261.pdf
Code:'****************************************************************************** '* Name : MCP4261POT_000.bas * '* Compiler: PICBASIC PRO Compiler microEngineering Labs * '* Author : Mike Tripoli * '* Notes: * '* Read an analog voltage on RA.0 and and RA.1 * '* copy the 8 bit value to a digital pot value register * '* Display value on serial LCD display * '* 8-bit conversion yields 0-255 result for 0-5 volt input. * '* Uses meLabs LAB-X2 demo board * '* * '* * '* Date : 03/03/2011 * '****************************************************************************** 'Setup some defaults for programming the device. 'High-speed OSC, Watch dog timer-OFF, Brown-out detect OFF, Low Voltage Program OFF, Protect code OFF @ DEVICE HS_OSC,WDT_OFF,BOD_OFF,LVP_OFF,PROTECT_OFF include "modedefs.bas" 'Shiftout mode definitions ' Define ADCIN parameters Define ADC_BITS 8 ' Set number of bits in result Define ADC_CLOCK 3 ' Set clock source (3=rc) Define ADC_SAMPLEUS 50 ' Set sampling time in uS ADC_VAL_0 Var byte ' Only using 8 bits of ADC Channel 0 ADC_VAL_1 Var byte ' Only using 8 bits of ADC Channel 1 POT0 var word ' WORD variable to for address (high byte) and pot value (low byte) POT0 POT1 var word ' WORD variable to for address (high byte) and pot value (low byte) POT1 LED1 Var PORTB.0 ' Alias PORTB.0 to LED1 on LAB-X2 board from meLabs LED2 VAR PORTB.1 ' Alias PORTB.1 to LED2 LED3 VAR PORTB.2 ' Alias PORTB.2 to LED3 SCK var PORTC.3 ' Alias PORTC.3 to SCK (serial data clock) SDO var PORTC.5 ' Alias PORTC.5 to SDO (serial data out) CS var PORTC.2 ' Alias PORTC.2 to C_EN (chip enable) LCD_DISP var PORTB.3 ' LCD connected to PORTB.3 - LAB-X2 TRISA = %11111111 ' Set PORTA to all input TRISB = %00000000 ' Set PORTB to all output TRISC = %00000000 ' Set PORTC to all output ADCON1 = %00000010 ' Set PORTA analog 'Initialize registers and variables LOW LED1 'Initialize LEDs OFF LOW LED2 ' " LOW LED3 ' " HIGH CS 'Chip enable high to start high sck 'Mode 1,1 SCK idles high ; Serout2 LCD_DISP,396,[12] ' Clear the LCD display ;Initialize POT WORD pot0.Highbyte = %00000000 'POT0 address in hex - easier for me to see which pot selected pot0.lowbyte = 0 'POT0 value in DEC - initialize pot - can be any value pot1.Highbyte = %00010000 'POT1 address in hex pot1.lowbyte = 0 'POT1 value in DEC mainloop: ADCIN 0, adc_val_0 ' Read channel RA.0 to ADC_VAL_0 - Uses onboard "POT1" on LAB - X2 pot0.lowbyte = adc_val_0 'copy input voltage from pot to digital pot pause 10 ADCIN 1, adc_val_1 ' Read channel RA.1 to ADC_VAL_1 pot1.lowbyte = adc_val_1 'copy input voltage from pot to digital pot ;***** DELETE THIS SECTION - ONLY FOR TESTING *************** ; Serout2 PORTB.3,396,[12] 'Set to beginning of LCD display ; Serout2 PORTB.3,396,["ADC_VAL_0=",DEC3 adc_val_0,148] ' Display adc channel 0 ; Serout2 PORTB.3,396,["ADC_VAL_1=",DEC3 adc_val_1,13] ' Display adc channel 1 ; PAUSE 10 ;************************************************************ GOSUB write_pots goto mainloop WRITE_POTS: ; Routine writes value to pots WR_POT_0: low CS ' Make chip active pause 1 ' Delay after making chip active per data sheet - only need 60nS shiftout sdo,sck,5,[pot0\16] ' Mode 1,1 in MCP4261 DS / Mode 5 PBP - clock idles high, MSB shift out first high CS ' MCP4261 DS recommends toggling /CS between commands pause 1 ' Delay keeps from banging CS pin WR_POT_1: low CS 'Make chip active pause 1 'Delay after making chip active shiftout sdo,sck,5,[pot1\16] high CS RETURN END 'ALL PROGRAMS NEED AN END STATEMENT!





Bookmarks