Simple Hello World for the PCA9532 on the Embedded Artists Baseboard

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
chris
Date:
Fri May 07 12:40:00 2010 +0000
Parent:
0:deb3f7947394
Commit message:

Changed in this revision

PCA9532.cpp Show annotated file Show diff for this revision Revisions of this file
PCA9532.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCA9532.cpp	Fri May 07 12:40:00 2010 +0000
@@ -0,0 +1,191 @@
+/* mbed PCF9532 LED Driver Library
+ *
+ * Copyright (c) 2010, cstyles (http://mbed.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+
+#include "PCA9532.h"
+#include "mbed.h"
+
+/*
+ Constructor, pin names for I2C and the I2C addrss of the device
+ */
+PCA9532::PCA9532(PinName scl, PinName sda, int addr)
+        : _i2c(scl, sda) {
+
+    _i2c.frequency(1000000);
+
+    _addr = addr;
+
+}
+
+
+
+
+
+/*
+ Set the period
+ */
+int PCA9532::Period (int channel, float period) {
+
+    char reg = 0;
+    
+    if (channel == 0) {
+       reg = PCA9532_REG_PSC0;
+    } else if (channel == 1) {
+       reg = PCA9532_REG_PSC1;
+    } else {
+        return (1);
+    }
+
+    if (period > 1.0) {
+        period = 255;
+    } else if ( period < 0.0 ) {
+        period = 0;
+    } else {
+        period = 256 * period;
+    }
+
+    _write(reg, period);
+    return(0);
+
+}
+
+
+/*
+ Set the duty cycle
+ */
+int PCA9532::Duty (int channel, float d) {
+
+    char duty = 0;
+    char reg = 0;
+    
+    if (channel == 0) {
+       reg = PCA9532_REG_PWM0;
+    } else if (channel == 1) {
+       reg = PCA9532_REG_PWM1;
+    } else {
+        return (1);
+    }
+
+    if (d > 1.0) {
+        duty = 255;
+    } else if ( d < 0.0 ) {
+        duty = 0;
+    } else {
+        duty = 256 * d;
+    }
+
+    _write(reg, duty);
+    return(0);
+
+}
+
+/*
+ Set each of the LEDs in this mask to the give mode
+ Loop through the mask calling SetLed on each match
+ alt_mode specifies the mode of the non-Matches of SetMode
+ */
+int PCA9532::SetMode (int mask, int mode) {
+    if ( (mode < 0) || (mode > 3) ) {
+        return(1);
+    } else {
+        for (int i=0 ; i < 16 ; i++ ) {
+
+            // if this matches, set the LED to the mode
+            if (mask & (0x1 << i)) {
+                SetLed(i,mode);
+            }
+        }
+    }
+    return(0);
+}
+
+
+
+/*
+ led is in the range 0-15
+ mode is inthe range 0-3
+ */
+int PCA9532::SetLed(int led, int mode) {
+
+    int reg = 0;
+    int offset = (led % 4);
+
+    printf("\nSetLed(%d,%d)\n", led, mode);
+
+    // makesure mode is within bounds
+    if ( (mode < 0) || (mode > 3) ) {
+        printf("Error : Invalid mode supplied\n");
+        return(1);
+    }
+
+    // determine which register this is,
+    if (led < 4) {
+        reg = PCA9532_REG_LS0;
+    } else if ( (led > 3) && (led < 8) ) {
+        reg = PCA9532_REG_LS1;
+    } else if ( (led > 7) && (led < 12) ) {
+        reg = PCA9532_REG_LS2;
+    } else if ( (led > 11) && (led < 16) ) {
+        reg = PCA9532_REG_LS3;
+    } else {
+        return(1);
+    }
+
+    // read the current status of the register
+    char regval = _read(reg);
+
+    // clear the two bit slice at the calculated offset
+    regval &= ~(0x3 << (2 * offset));
+
+    // now OR in the mode, shifted by 2*offset
+    regval |= (mode << (2 * offset));
+
+    // write the new value back
+    _write(reg, regval);
+
+    return(0);
+}
+
+
+
+// private functions for low level IO
+
+void PCA9532::_write(int reg, int data) {
+    char args[2];
+    args[0] = reg;
+    args[1] = data;
+    _i2c.write(_addr, args,2);
+}
+
+int PCA9532::_read(int reg) {
+    char args[2];
+    args[0] = reg;
+    _i2c.write(_addr, args, 1);
+    _i2c.read(_addr, args, 1);
+    return(args[0]);
+}
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PCA9532.h	Fri May 07 12:40:00 2010 +0000
@@ -0,0 +1,98 @@
+/* mbed PCF9532 LED Driver Library
+ *
+ * Copyright (c) 2010, cstyles (http://mbed.org)
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef PCA9532_H
+#define PCA9532_H
+
+#include "mbed.h"
+
+/*
+ * register names
+ */
+ 
+#define PCA9532_REG_INPUT0 0
+#define PCA9532_REG_INPUT1 1
+#define PCA9532_REG_PSC0   2
+#define PCA9532_REG_PWM0   3
+#define PCA9532_REG_PSC1   4
+#define PCA9532_REG_PWM1   5
+#define PCA9532_REG_LS0    6
+#define PCA9532_REG_LS1    7
+#define PCA9532_REG_LS2    8
+#define PCA9532_REG_LS3    9
+
+/*
+ LED modes
+ */
+ 
+#define MODE_OFF  0
+#define MODE_ON   1
+#define MODE_PWM0 2
+#define MODE_PWM1 3
+
+class PCA9532 {
+
+public:
+
+    /*
+     * Constructor
+     * Pass the I2C pins being used, and the address
+     * The address bottom bit will be replaced by R/W bit
+     */
+    PCA9532(PinName sda, PinName scl, int addr);
+
+    /*
+     * SetLed(int led, int mode)
+     * Set the  LED (0-15) into the specified mode (0-3) (OFF, On, PWM0, PWM1)
+     */
+    int SetLed  (int led, int mode);
+
+    /*
+     * SetMode(int mask, int mode)
+     * Set the LED specified in the mask to the given mode
+     */     
+    int SetMode (int mask, int mode);
+
+    /*
+     * SetDuty(int channel, float duty)
+     * Set the duty cycle (0.0-1.0) of the specified PWM channel (0|1)
+     */     
+    int Duty (int channel, float duty);
+
+    /*
+     * SetPeriod(int channel, float duty)
+     * Set the period (0.0-1.0) of the specified PWM channel (0|1)
+     */     
+    int Period (int channel, float period);
+
+protected:
+
+    void _write(int reg, int data);
+    int _read(int reg);
+    int _addr;
+    I2C _i2c;
+
+};
+
+
+#endif
--- a/main.cpp	Fri Apr 16 13:28:53 2010 +0000
+++ b/main.cpp	Fri May 07 12:40:00 2010 +0000
@@ -1,20 +1,15 @@
 #include "mbed.h"
+#include "PCA9532.h"
 
-I2C i2c (p28,p27);
+PCA9532 leds (p28, p27, 0xc0);
 
 int main() {
 
-    char i2c_data[2];
+    while (1) {
+        leds.SetLed(0xffff, MODE_ON);
+        wait (0.2);
+        leds.SetLed(0xffff, MODE_OFF);
+        wait (0.2);
+    }
 
-    while (1) {
-        i2c_data[0] = 6; // LS0 register
-        i2c_data[1] = 0x0; // all off
-        i2c.write(0xc0,i2c_data,2);
-        wait(0.2);
-
-        i2c_data[0] = 6; // LS0 register
-        i2c_data[1] = 0x55; // all ON
-        i2c.write(0xc0,i2c_data,2);
-        wait(0.2);
-    }
 }
\ No newline at end of file