ui_led.c

00001 /*
00002   led.c
00003   
00004   providing control of the LEDs on the UI board since 2009.
00005   
00006   Nicolas Williamson - July 2009
00007   Adapted from code by Emily Lee
00008 */
00009 
00010 #include <includes.h> 
00011 
00012 #define LED_BUSY (SSPSR & (1<<4))
00013 #define LED_TNF (SSPSR & (1<<1))
00014 #define LED_RNE (SSPSR & (1<<2))
00015 #define SSEL_LO FIO0CLR = (1<<20);
00016 #define SSEL_HI FIO0SET = (1<<20);
00017 
00018 #define R 2  // red
00019 #define G 1  // green
00020 #define B 0  // blue
00021 #define NO_OP 0x2000  // no-op
00022 
00023 void ui_led_init(void)
00024 {
00025   while(!LED_TNF){}   // wait if transmit buffer is full
00026   SSEL_LO;
00027   SSPDR = 0x1001;   // configuration: run mode
00028   while(!LED_TNF){}   // wait if transmit buffer is full
00029   SSPDR = 0x1001;   // configuration: run mode
00030   while(LED_BUSY) {}  // wait if transfering data
00031   SSEL_HI;
00032 
00033   while(!LED_TNF){}   // wait if transmit buffer is full
00034   SSEL_LO;
00035   SSPDR = 0x0A01;       // turn off all LEDs, 16 bit
00036   while(!LED_TNF){}   // wait if transmit buffer is full
00037   SSPDR = 0x0A01;       // turn off all LEDs, 16 bit
00038   while(LED_BUSY) {}  // wait if transfering data
00039   SSEL_HI;
00040 }
00041 
00042 void ui_led_register_write(unsigned int device, unsigned int address, unsigned int w_data)
00043 {
00044   // device 1 or 2 indicates first or second max6966 chip
00045   if (device == 1){
00046     while(!LED_TNF){}    // wait if transmit buffer is full
00047     SSEL_LO;        // SSEL1 low
00048     SSPDR = NO_OP;           // dummy data for device 2
00049     while(!LED_TNF){}    // wait if transmit buffer is full
00050     SSPDR = (address << 8) | w_data; // data for device 1
00051     while(LED_BUSY){}    // wait if transfering data
00052     SSEL_HI;        // SSEL1 high, latch data to devices
00053   } else if (device == 2){  
00054     while(!LED_TNF){}    // wait if transmit buffer is full
00055     SSEL_LO;        // SSEL1 low
00056     SSPDR = (address << 8) | w_data; // data for device 2
00057     while(!LED_TNF){}    // wait if transmit buffer is full
00058     SSPDR = NO_OP;           // dummy data for device 1
00059     while(LED_BUSY){}    // wait if transfering data
00060     SSEL_HI;        // SSEL1 high
00061   }
00062 }
00063 
00064 void ui_led_pwm(unsigned int ui_led_num, unsigned int color, unsigned int pwm)
00065 {
00066   //PWM level should be between 3 and 254
00067   unsigned int dev, addr, tmp;
00068   
00069   if (pwm < 3){
00070     pwm = 1;
00071   } else if (pwm > 254){
00072     pwm = 0;
00073   }
00074   
00075   tmp = (ui_led_num * 3) + color;
00076   dev = (tmp / 9) + 1; //leds 0-2 are on device 1, and leds 3-5 are on device 2
00077   addr = tmp % 9;  
00078 
00079   ui_led_register_write(dev, addr, pwm);
00080 }
00081 
00082 void ui_led_rgb(unsigned int ui_led_num, unsigned int red_level, unsigned int green_level, unsigned int blue_level)
00083 {
00084   //PWM level should be between 3 and 254
00085   ui_led_pwm(ui_led_num, R, red_level);
00086   ui_led_pwm(ui_led_num, G, green_level);
00087   ui_led_pwm(ui_led_num, B, blue_level);
00088 }
00089 
00090 
Generated on Tue Jun 29 16:36:14 2010 by  doxygen 1.6.3