Penn Electric / MAX518
Committer:
PennElectric
Date:
Thu Dec 20 10:45:27 2012 +0000
Revision:
1:aec29e73ffc1
Parent:
0:8ebf1c452028
Child:
3:96d5489ff1ab
Built/updated December 2012.  Confirmed working with a MAX518 2 channel 8 bit DAC with both a typical (ACK expected) and opto-isolated (no ACK, one-way) I2C bus interface.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
PennElectric 1:aec29e73ffc1 1 /* Copyright (c) <2012> <P. Patel>, MIT License
PennElectric 1:aec29e73ffc1 2 *
PennElectric 1:aec29e73ffc1 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
PennElectric 1:aec29e73ffc1 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
PennElectric 1:aec29e73ffc1 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
PennElectric 1:aec29e73ffc1 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
PennElectric 1:aec29e73ffc1 7 * furnished to do so, subject to the following conditions:
PennElectric 1:aec29e73ffc1 8 *
PennElectric 1:aec29e73ffc1 9 * The above copyright notice and this permission notice shall be included in all copies or
PennElectric 1:aec29e73ffc1 10 * substantial portions of the Software.
PennElectric 1:aec29e73ffc1 11 *
PennElectric 1:aec29e73ffc1 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
PennElectric 1:aec29e73ffc1 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
PennElectric 1:aec29e73ffc1 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
PennElectric 1:aec29e73ffc1 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
PennElectric 1:aec29e73ffc1 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
PennElectric 1:aec29e73ffc1 17 */
PennElectric 1:aec29e73ffc1 18
PennElectric 1:aec29e73ffc1 19 // ------------------------------ MAX518 Interfacing Library ------------------------------------
PennElectric 1:aec29e73ffc1 20
PennElectric 1:aec29e73ffc1 21
PennElectric 1:aec29e73ffc1 22 #include "MAX518.h"
PennElectric 1:aec29e73ffc1 23 #include "mbed.h"
PennElectric 1:aec29e73ffc1 24
PennElectric 1:aec29e73ffc1 25 // Class constructor, create i2c connection, update instance variables
PennElectric 1:aec29e73ffc1 26 DAC::DAC(PinName sda, PinName scl, int address, int freq, bool ack) : i2c(sda, scl) {
PennElectric 1:aec29e73ffc1 27 _address = address;
PennElectric 1:aec29e73ffc1 28 _ack = ack;
PennElectric 1:aec29e73ffc1 29 i2c.frequency(freq);
PennElectric 1:aec29e73ffc1 30 }
PennElectric 1:aec29e73ffc1 31
PennElectric 1:aec29e73ffc1 32 // Set output of both DAC channels with ints 0 - 255
PennElectric 1:aec29e73ffc1 33 bool DAC::setDAC(int a, int b) {
PennElectric 1:aec29e73ffc1 34 if (a > 255 || a < 0 || b > 255 || b < 0)
PennElectric 1:aec29e73ffc1 35 return false; // Return if int a or int b is out of range
PennElectric 1:aec29e73ffc1 36 int check = 0; // Counter for ACK signals
PennElectric 1:aec29e73ffc1 37
PennElectric 1:aec29e73ffc1 38 i2c.start();
PennElectric 1:aec29e73ffc1 39 check += i2c.write(_address); // Write address
PennElectric 1:aec29e73ffc1 40 check += i2c.write(0); // Select Channel 1
PennElectric 1:aec29e73ffc1 41 check += i2c.write(a); // Write output value
PennElectric 1:aec29e73ffc1 42 check += i2c.write(1); // Select Channel 2
PennElectric 1:aec29e73ffc1 43 check += i2c.write(b); // Write output value
PennElectric 1:aec29e73ffc1 44 i2c.stop(); // End communication (trigger DAC to update outputs)
PennElectric 1:aec29e73ffc1 45
PennElectric 1:aec29e73ffc1 46 if (_ack && check != 5) return false; // Return false if device did not acknowledge when expected
PennElectric 1:aec29e73ffc1 47 else return true;
PennElectric 1:aec29e73ffc1 48 }
PennElectric 1:aec29e73ffc1 49
PennElectric 1:aec29e73ffc1 50 // Set output of DAC Channel 1 with int 0 - 255
PennElectric 1:aec29e73ffc1 51 bool DAC::setCh1(int n) {
PennElectric 1:aec29e73ffc1 52 if (n > 255 || n < 0) return false; // Return if n is out of range
PennElectric 1:aec29e73ffc1 53 int check = 0; // Counter for ACK signals
PennElectric 1:aec29e73ffc1 54
PennElectric 1:aec29e73ffc1 55 i2c.start();
PennElectric 1:aec29e73ffc1 56 check += i2c.write(_address); // Write address
PennElectric 1:aec29e73ffc1 57 check += i2c.write(0); // Select Channel 1
PennElectric 1:aec29e73ffc1 58 check += i2c.write(n); // Write output value
PennElectric 1:aec29e73ffc1 59 i2c.stop(); // End communication (trigger DAC to update outputs)
PennElectric 1:aec29e73ffc1 60
PennElectric 1:aec29e73ffc1 61 if (_ack && check != 3) return false; // Return false if device did not acknowledge when expected
PennElectric 1:aec29e73ffc1 62 else return true;
PennElectric 1:aec29e73ffc1 63 }
PennElectric 1:aec29e73ffc1 64
PennElectric 1:aec29e73ffc1 65 // Set output of DAC Channel 2 with int 0 - 255
PennElectric 1:aec29e73ffc1 66 bool DAC::setCh2(int n) {
PennElectric 1:aec29e73ffc1 67 if (n > 255 || n < 0) return false; // Return if n is out of range
PennElectric 1:aec29e73ffc1 68 int check = 0; // Counter for ACK signals
PennElectric 1:aec29e73ffc1 69
PennElectric 1:aec29e73ffc1 70 i2c.start();
PennElectric 1:aec29e73ffc1 71 check += i2c.write(_address); // Write address
PennElectric 1:aec29e73ffc1 72 check += i2c.write(1); // Select Channel 1
PennElectric 1:aec29e73ffc1 73 check += i2c.write(n); // Write output value
PennElectric 1:aec29e73ffc1 74 i2c.stop(); // End communication (trigger DAC to update outputs)
PennElectric 1:aec29e73ffc1 75
PennElectric 1:aec29e73ffc1 76 if (_ack && check != 3) return false; // Return false if device did not acknowledge when expected
PennElectric 1:aec29e73ffc1 77 else return true;
PennElectric 1:aec29e73ffc1 78 }
PennElectric 1:aec29e73ffc1 79
PennElectric 1:aec29e73ffc1 80 // Reset DAC (all outputs to 0)
PennElectric 1:aec29e73ffc1 81 bool DAC::reset() {
PennElectric 1:aec29e73ffc1 82 int check = 0; // Counter for ACK signals
PennElectric 1:aec29e73ffc1 83
PennElectric 1:aec29e73ffc1 84 i2c.start();
PennElectric 1:aec29e73ffc1 85 check += i2c.write(_address); // Write address
PennElectric 1:aec29e73ffc1 86 check += i2c.write(16); // Reset command (all outputs to 0)
PennElectric 1:aec29e73ffc1 87 i2c.stop(); // End communication (trigger DAC to update)
PennElectric 1:aec29e73ffc1 88
PennElectric 1:aec29e73ffc1 89 if (_ack && check != 2) return false; // Return false if device did not acknowledge when expected
PennElectric 1:aec29e73ffc1 90 else return true;
PennElectric 1:aec29e73ffc1 91 }
PennElectric 1:aec29e73ffc1 92
PennElectric 1:aec29e73ffc1 93 // Power down DAC into silent monitoring mode (outputs also go to 0)
PennElectric 1:aec29e73ffc1 94 bool DAC::powerDown() {
PennElectric 1:aec29e73ffc1 95 int check = 0; // Counter for ACK signals
PennElectric 1:aec29e73ffc1 96
PennElectric 1:aec29e73ffc1 97 i2c.start();
PennElectric 1:aec29e73ffc1 98 check += i2c.write(_address); // Write address
PennElectric 1:aec29e73ffc1 99 check += i2c.write(8); // Power down DAC into silent mode (outputs also go to 0)
PennElectric 1:aec29e73ffc1 100 i2c.stop(); // End communication (trigger DAC to update)
PennElectric 1:aec29e73ffc1 101
PennElectric 1:aec29e73ffc1 102 if (_ack && check != 2) return false; // Return false if device did not acknowledge when expected
PennElectric 1:aec29e73ffc1 103 else return true;
PennElectric 0:8ebf1c452028 104 }