Hi Nicholas, Now wonder you are having problems -- see what happens when you provide extra details? When I first looked at your code, I thought it was written by you. I thought your reference to the function 'AckI2C()' was a check for slave acknowledge, but now that I know you are using the C18 compiler, the 'AckI2C()' is a function that generates a MASTER ACK which is what you do not want. It looks like the WriteI2C() function automatically checks for a slave ACK. Therefore, try this (remove all 'AckI2C()' from your DAC code): I changed the int you were using to unsigned char, and made some other changes. void MAX517( unsigned char DataByte, unsigned char I2C_Address ) { I2C_Address &= 0xFE; // Coerce address byte to WRITE mode StartI2C(); // Start condition WriteI2C(I2C_Address); // Address byte of DAC WriteI2C(0x00); // Command byte WriteI2C(DataByte); // Output Data StopI2C(); // Stop condition } Let us know if this works. You might also want to process the function return code of the WriteI2C() function, but for now just try to get the DAC working. Also, I would recommend a stiffer voltage reference versus the resistive voltage divider Vref that you are currently using. If you need help selecting a voltage reference just come on back with some questions. If you are breadboarding, you can easily find them in a TO-93 package. Best regards, Ken Pergola -- http://www.piclist.com hint: PICList Posts must start with ONE topic: [PIC]:,[SX]:,[AVR]: ->uP ONLY! [EE]:,[OT]: ->Other [BUY]:,[AD]: ->Ads