ok guys
I still have troubles with this appli ???
Now the toggling of LED is OK thanks to bugfight and the removing 0xf0 for sink drivers (i don’t have transistors on my PCB) :
#if 1
// cycle colour whenever button has been pressed (value == 0)
if( !value ) {
mask = MIOS_HLP_GetBitORMask(blm_button_column);
if ( blm_row_green[blm_button_row] & mask )
{
if ( blm_row_red[blm_button_row] & mask )
blm_row_blue[blm_button_row] ^= mask; //if red is changing to 0, toggle blue
blm_row_red[blm_button_row] ^= mask; //if green is changing to 0, toggle red
}
blm_row_green[blm_button_row] ^= mask; //green toggles every time
}
/*
3 states cycle : red->blue->white->NA
mask = MIOS_HLP_GetBitORMask(blm_button_column);
if ( blm_row_red[blm_button_row] & mask )
{
if ( blm_row_green[blm_button_row] & mask )
blm_row_blue[blm_button_row] ^= mask; //if red is changing to 0, toggle blue
blm_row_green[blm_button_row] ^= mask; //if green is changing to 0, toggle red
}
blm_row_red[blm_button_row] ^= mask; //green toggles every time
}
*/
I have done the management of LEDs by MIDI messages, and it works, except for the BLUE LED :
/////////////////////////////////////////////////////////////////////////////
// This function is called by MIOS when a complete MIDI event has been received
/////////////////////////////////////////////////////////////////////////////
void MPROC_NotifyReceivedEvnt(unsigned char evnt0, unsigned char evnt1, unsigned char evnt2) __wparam
{
unsigned char evnt1Adj;
unsigned char led_column;
unsigned char led_row;
// control the Duo-LEDs via Note On/Off Events
// The colour is controlled with velocity value:
// 0 : all LEDs off
// 01-10 : green LED on
// 11-20 : red LED on
// 21-30 : blue LED on
// 31-40 : red+green LED on (= yellow)
// 41-50 : green+blue LED on (= turquoise)
// 51-60 : blue+red LED on (= purple)
// 61-127 : all LEDs on (= white)
// CLEAR &= AND
// SET |= OR
// only MIDI note numbers from 0x00..0x3f are valid (-> 64 LEDs)
evnt1Adj = ((evnt1 - 24) & 0x7f);
if( (evnt0 == 0x80 || evnt0 == 0x90) && (evnt1Adj < 0x40 ) ) {
// derive LED column and row from note number
led_column = evnt1Adj >> 3;
led_row = evnt1Adj & 0x07;
// 90 xx 00 is the same like a note off event!
// (-> http://www.borg.com/~jglatt/tech/midispec.htm)
if( evnt0 == 0x80 || evnt2 == 0x00 ) {
// Note Off or velocity == 0x00: clear all LEDs
blm_row_green[led_column] &= MIOS_HLP_GetBitANDMask(led_row);
blm_row_red[led_column] &= MIOS_HLP_GetBitANDMask(led_row);
blm_row_blue[led_column] &= MIOS_HLP_GetBitANDMask(led_row);
} else if( evnt2 < 10 ) { // GREEN
// Velocity < 10: set green LED, clear red LED, clear blue LED
blm_row_green[led_column] |= MIOS_HLP_GetBitORMask(led_row);
blm_row_red[led_column] &= MIOS_HLP_GetBitANDMask(led_row);
blm_row_blue[led_column] &= MIOS_HLP_GetBitANDMask(led_row);
} else if( evnt2 < 20 ) { // RED
// Velocity < 20: clear green LED, set red LED, clear blue led
blm_row_green[led_column] &= MIOS_HLP_GetBitANDMask(led_row);
blm_row_red[led_column] |= MIOS_HLP_GetBitORMask(led_row);
blm_row_blue[led_column] &= MIOS_HLP_GetBitANDMask(led_row);
} else if( evnt2 < 30 ) { // BLUE
// Velocity < 30 : clear green LED, clear red LED, set blue led
blm_row_red[led_column] &= MIOS_HLP_GetBitANDMask(led_row);
blm_row_green[led_column] &= MIOS_HLP_GetBitANDMask(led_row);
blm_row_blue[led_column] |= MIOS_HLP_GetBitORMask(led_row);
} else if( evnt2 < 40 ) { // YELLOW = R+G
// Velocity < 40 : set green LED, set red LED, clear blue led
blm_row_green[led_column] |= MIOS_HLP_GetBitORMask(led_row);
blm_row_red[led_column] |= MIOS_HLP_GetBitORMask(led_row);
blm_row_blue[led_column] &= MIOS_HLP_GetBitANDMask(led_row);
} else if( evnt2 < 50 ) { // turquoise = G+B
// Velocity < 50 : set green LED, set blue LED, clear red led
blm_row_green[led_column] |= MIOS_HLP_GetBitORMask(led_row);
blm_row_blue[led_column] |= MIOS_HLP_GetBitORMask(led_row);
blm_row_red[led_column] &= MIOS_HLP_GetBitANDMask(led_row);
} else if( evnt2 < 60 ) { // PURPLE = R+B
// Velocity < 60 : set blue LED, set red LED, clear green led
blm_row_blue[led_column] |= MIOS_HLP_GetBitORMask(led_row);
blm_row_red[led_column] |= MIOS_HLP_GetBitORMask(led_row);
blm_row_green[led_column] &= MIOS_HLP_GetBitANDMask(led_row);
} else {
// Velocity >= 61: set RGB LEDs
blm_row_green[led_column] |= MIOS_HLP_GetBitORMask(led_row);
blm_row_red[led_column] |= MIOS_HLP_GetBitORMask(led_row);
blm_row_blue[led_column] |= MIOS_HLP_GetBitORMask(led_row);
}
}
The behaviour is very strange :
when it is supposed to be only GREEN, it lights up BLUE+GREEN
when supposed only BLUE, nothing lights up
when supposed RED+GREEN, it is R+G+B
when supposed R+B, it is only RED
LEDs used are these with common cathode http://cgi.ebay.fr/ws/eBayISAPI.dll?ViewItem&item=230254668750&_trksid=p3907.m32&_trkparms=tab%3DWatching
It seems led the green was driving the blue led and the blue led not connected (obvious it is as it can produce RGB light !)
Any ideas ? TK ?
MIOS32 drives RGB, but I don’t have yet the mios32 PCB …
[4colors_blm_example_v1_2.zip](< base_url >/applications/core/interface/file/attachment.php?id=4762)
[4colors_blm_example_v1_2.zip](< base_url >/applications/core/interface/file/attachment.php?id=5815)