การใช้งาน IC MCP4922 เป็น IC D to A ขนาด 12 bits ซึ่งสามารถหาซื้อได้ทั่วไปในเมืองไทย
#include <16F877A.h>
#DEVICE ADC=10
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use rs232(baud=9600, parity=N, Bits=8, xmit=PIN_C6, rcv=PIN_C7)
#define MCP4922_CS PIN_B1
#define MCP4922_CLK PIN_B2
#define MCP4922_DIN PIN_B3
#define MCP4922_LDAC PIN_B4
#define MCP4922_SHDN PIN_B5
// กำหนดค่า Register ต่างๆ ของ MCP4922
#define MCP4922_DAC_A_BUFFERED_GAIN_1X_NON_SHDN 0x70 // DAC A, Buffered, Gain 1x, Output power control
#define MCP4922_DAC_A_BUFFERED_GAIN_2X_NON_SHDN 0x50 // DAC A, Buffered, Gain 2x, Output power control
#define MCP4922_DAC_A_NON_BUFFERED_GAIN_1X_NON_SHDN 0x30 // DAC A, Non buffered, Gain 1x, Output power control
#define MCP4922_DAC_A_NON_BUFFERED_GAIN_2X_NON_SHDN 0x10 // DAC A, Non buffered, Gain 2x, Output power control
#define MCP4922_DAC_B_BUFFERED_GAIN_1X_NON_SHDN 0xF0 // DAC B, Buffered, Gain 1x, Output power control
#define MCP4922_DAC_B_BUFFERED_GAIN_2X_NON_SHDN 0xD0 // DAC B, Buffered, Gain 2x, Output power control
#define MCP4922_DAC_B_NON_BUFFERED_GAIN_1X_NON_SHDN 0xB0 // DAC B, Non buffered, Gain 1x, Output power control
#define MCP4922_DAC_B_NON_BUFFERED_GAIN_2X_NON_SHDN 0x90 // DAC B, Non buffered, Gain 2x, Output power control
void mcp4922_init() { //ฟังก์ชั่นเริ่มต้นการทำงาน
output_high(MCP4922_CS);
output_high(MCP4922_CLK);
output_high(MCP4922_DIN);
output_high(MCP4922_LDAC);
output_high(MCP4922_SHDN);
}
void main()
{
int8 cmd[2],i; //ประกาศตัวแปร cmd, I เป็น integer 8 bits
int16 data; //ประกาศตัวแปร data เป็น integer 16 bits
mcp4922_init(); //กำหนดฟังก์ชั่นเริ่มต้นการทำงาน
while(TRUE) {
data = 4095; //กำหนด data = 4095((4095 * 5)/(2^12-1) = 5 V)
cmd[0]=data; // cmd[0] = data 8 bits ล่าง
cmd[1]=(data>>8)|MCP4922_DAC_B_BUFFERED_GAIN_1X_NON_SHDN;
// cmd[0] = data 4 bits บน
output_low(MCP4922_CS); //เริ่มต้นการแปลงสัญญาณด้วย MCP4922
output_low(MCP4922_CLK);
output_high(MCP4922_LDAC);
for(i=0;i<=15;i++) {
output_bit(MCP4922_DIN,shift_left(cmd,2,1));
output_high(MCP4922_CLK);
output_low(MCP4922_CLK);
}
output_high(MCP4922_CS);
output_low(MCP4922_LDAC);
delay_us(10);
output_HIGH(MCP4922_LDAC);
delay_us(10);
}
}