Ambi-Light 2: 16bit PWM, 5 RGB-Kanäle

9. Software

In diesem Kapitel wird die Software-Ausstattung beschrieben. Bitte beachtet, dass die Firmware unter der Creative Commons Lizenz by-nc-sa steht. Ihr dürft die Daten nicht kommerziell verwenden und müßt den Urheber angeben. Eine Weitergabe zu den gleichen Bedingungen ist gestattet.

9.1 PC-Komponente

Am PC benötigen wir, wie bisher auch, einen Prozess, die die Farben aus dem Bildschirm ausliest und sie in einen seriellen Datenstrom verwandelt. Nachdem Boblight (ursprüngliche Seite, Google Code) hier sehr gute Dienste leistet, optimal unter Windows XP läuft und auch Standby/Resume überlebt, hat sich hier wenig getan. Wir müssen nur in der Konfiguration umstellen, dass wir jetzt 15 RGB-Kanäle statt drei haben. Hier noch einmal die Konfigurationsdatei.

9.2 MCU Firmware

Fast schon beschämend ist die Simplizität der Firmware. Mußte in der Soft-PWM-Variante noch jeder Taktzyklus gezählt werden, so können wir uns hier sehr entspannt zurücklehnen und einfach Bytes zwischen Hardware-Modulen hin- und herschieben. Nachdem es nicht viel Code ist, habe ich ihn hier kommentiert, wo notwendig.

WinAVR-Code für Ambilight Controller 2
#define F_CPU 7373742
#define MAX_CHANNELS_OF_DEVICE 15
#define ERROR_CONDITION 240

//#define WITH_PORTD1_AS_USART 1

#include
#include
#include
#include 

uint16_t gamma25[256] = { 0, 0, 1, 2, 3, 6, 8, 11, 15, 20, 25, 31, 38, 46, 54, 64, 74, 86, 98, 112, 126, 142, 159, 176, 195, 215, 237, 259, 283, 308, 334, 362, 391, 421, 453, 486, 520, 556, 594, 632, 673, 714, 758, 803, 849, 897, 946, 998, 1050, 1105, 1161, 1219, 1278, 1339, 1402, 1467, 1533, 1601, 1671, 1743, 1816, 1892, 1969, 2048, 2129, 2212, 2296, 2383, 2472, 2562, 2655, 2749, 2846, 2944, 3045, 3147, 3252, 3358, 3467, 3578, 3691, 3805, 3923, 4042, 4163, 4287, 4412, 4540, 4670, 4803, 4937, 5074, 5213, 5354, 5498, 5644, 5792, 5942, 6095, 6250, 6407, 6567, 6729, 6894, 7061, 7230, 7402, 7576, 7752, 7931, 8113, 8297, 8483, 8672, 8864, 9058, 9254, 9453, 9655, 9859, 10066, 10275, 10487, 10701, 10918, 11138, 11360, 11585, 11813, 12043, 12276, 12511, 12750, 12991, 13235, 13481, 13730, 13982, 14237, 14494, 14754, 15017, 15283, 15552, 15823, 16097, 16374, 16654, 16937, 17223, 17511, 17803, 18097, 18394, 18694, 18997, 19303, 19612, 19924, 20238, 20556, 20877, 21200, 21527, 21857, 22189, 22525, 22864, 23205, 23550, 23898, 24249, 24603, 24960, 25320, 25684, 26050, 26419, 26792, 27168, 27547, 27929, 28314, 28702, 29094, 29489, 29887, 30288, 30692, 31100, 31511, 31925, 32342, 32763, 33186, 33613, 34044, 34478, 34915, 35355, 35798, 36245, 36696, 37149, 37606, 38066, 38530, 38997, 39467, 39941, 40418, 40899, 41383, 41870, 42361, 42856, 43353, 43855, 44359, 44867, 45379, 45894, 46413, 46935, 47460, 47989, 48522, 49058, 49598, 50141, 50688, 51238, 51792, 52350, 52911, 53475, 54044, 54615, 55191, 55770, 56353, 56939, 57529, 58123, 58720, 59321, 59926, 60534, 61147, 61762, 62382, 63005, 63632, 64263, 64897, 65535 };
uint16_t gamma22[256] = { 0, 2, 4, 7, 11, 17, 24, 32, 41, 52, 64, 78, 93, 110, 128, 147, 168, 191, 215, 240, 267, 296, 327, 359, 392, 428, 465, 504, 544, 586, 630, 676, 723, 772, 823, 875, 930, 986, 1044, 1104, 1165, 1229, 1294, 1361, 1430, 1501, 1574, 1648, 1725, 1803, 1884, 1966, 2050, 2136, 2224, 2314, 2406, 2500, 2595, 2693, 2793, 2895, 2998, 3104, 3212, 3322, 3433, 3547, 3663, 3781, 3900, 4022, 4146, 4272, 4400, 4530, 4663, 4797, 4933, 5072, 5212, 5355, 5499, 5646, 5795, 5946, 6099, 6255, 6412, 6572, 6733, 6897, 7063, 7231, 7402, 7574, 7749, 7926, 8105, 8286, 8469, 8655, 8843, 9033, 9225, 9419, 9616, 9815, 10016, 10219, 10425, 10632, 10842, 11054, 11269, 11486, 11705, 11926, 12149, 12375, 12603, 12833, 13066, 13301, 13538, 13777, 14019, 14263, 14509, 14758, 15009, 15262, 15517, 15775, 16035, 16298, 16563, 16830, 17099, 17371, 17645, 17922, 18201, 18482, 18765, 19051, 19339, 19630, 19923, 20218, 20516, 20816, 21119, 21424, 21731, 22040, 22352, 22667, 22984, 23303, 23624, 23949, 24275, 24604, 24935, 25269, 25605, 25943, 26284, 26628, 26973, 27322, 27672, 28026, 28381, 28739, 29100, 29462, 29828, 30196, 30566, 30939, 31314, 31692, 32072, 32454, 32840, 33227, 33617, 34010, 34405, 34802, 35202, 35605, 36010, 36417, 36827, 37240, 37655, 38072, 38493, 38915, 39340, 39768, 40198, 40631, 41066, 41503, 41944, 42387, 42832, 43280, 43730, 44183, 44639, 45097, 45557, 46020, 46486, 46954, 47425, 47899, 48374, 48853, 49334, 49818, 50304, 50793, 51284, 51778, 52275, 52774, 53276, 53780, 54287, 54796, 55308, 55823, 56341, 56860, 57383, 57908, 58436, 58966, 59499, 60035, 60573, 61114, 61657, 62203, 62752, 63303, 63857, 64414, 64973, 65535 };
//uint16_t gamma20[256] = { 0, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400, 441, 484, 529, 576, 625, 676, 729, 784, 841, 900, 961, 1024, 1089, 1156, 1225, 1296, 1369, 1444, 1521, 1600, 1681, 1764, 1849, 1936, 2025, 2116, 2209, 2304, 2401, 2500, 2601, 2704, 2809, 2916, 3025, 3136, 3249, 3364, 3481, 3600, 3721, 3844, 3969, 4096, 4225, 4356, 4489, 4624, 4761, 4900, 5041, 5184, 5329, 5476, 5625, 5776, 5929, 6084, 6241, 6400, 6561, 6724, 6889, 7056, 7225, 7396, 7569, 7744, 7921, 8100, 8281, 8464, 8649, 8836, 9025, 9216, 9409, 9604, 9801, 10000, 10201, 10404, 10609, 10816, 11025, 11236, 11449, 11664, 11881, 12100, 12321, 12544, 12769, 12996, 13225, 13456, 13689, 13924, 14161, 14400, 14641, 14884, 15129, 15376, 15625, 15876, 16129, 16384, 16641, 16900, 17161, 17424, 17689, 17956, 18225, 18496, 18769, 19044, 19321, 19600, 19881, 20164, 20449, 20736, 21025, 21316, 21609, 21904, 22201, 22500, 22801, 23104, 23409, 23716, 24025, 24336, 24649, 24964, 25281, 25600, 25921, 26244, 26569, 26896, 27225, 27556, 27889, 28224, 28561, 28900, 29241, 29584, 29929, 30276, 30625, 30976, 31329, 31684, 32041, 32400, 32761, 33123, 33488, 33855, 34224, 34595, 34968, 35343, 35720, 36099, 36480, 36863, 37248, 37635, 38024, 38415, 38808, 39203, 39600, 39999, 40400, 40803, 41208, 41615, 42024, 42435, 42848, 43263, 43680, 44099, 44520, 44943, 45368, 45795, 46224, 46655, 47088, 47523, 47960, 48399, 48840, 49283, 49728, 50175, 50624, 51075, 51528, 51983, 52440, 52899, 53360, 53823, 54288, 54755, 55224, 55695, 56168, 56643, 57120, 57599, 58080, 58563, 59048, 59535, 60024, 60515, 61008, 61503, 62000, 62499, 63000, 63503, 64008, 64515, 65024, 65535 };
uint16_t gamma18[256] = { 0, 11, 22, 37, 55, 76, 101, 128, 158, 191, 227, 266, 307, 350, 397, 446, 497, 551, 607, 666, 727, 791, 857, 925, 995, 1068, 1143, 1220, 1300, 1382, 1466, 1552, 1640, 1731, 1824, 1919, 2016, 2115, 2216, 2319, 2425, 2532, 2642, 2753, 2867, 2983, 3100, 3220, 3342, 3466, 3591, 3719, 3849, 3981, 4114, 4250, 4387, 4527, 4668, 4812, 4957, 5104, 5254, 5405, 5558, 5712, 5869, 6028, 6188, 6351, 6515, 6681, 6849, 7019, 7190, 7364, 7539, 7716, 7895, 8076, 8259, 8443, 8629, 8817, 9007, 9199, 9392, 9588, 9785, 9983, 10184, 10386, 10590, 10796, 11004, 11213, 11424, 11637, 11852, 12068, 12286, 12506, 12728, 12951, 13176, 13403, 13631, 13861, 14093, 14327, 14562, 14799, 15038, 15278, 15520, 15764, 16009, 16257, 16505, 16756, 17008, 17262, 17517, 17775, 18033, 18294, 18556, 18820, 19085, 19353, 19621, 19892, 20164, 20438, 20713, 20990, 21269, 21549, 21831, 22114, 22399, 22686, 22975, 23265, 23556, 23849, 24144, 24441, 24739, 25038, 25340, 25642, 25947, 26253, 26561, 26870, 27181, 27493, 27807, 28123, 28440, 28759, 29079, 29401, 29724, 30049, 30376, 30704, 31034, 31365, 31698, 32033, 32369, 32706, 33045, 33386, 33728, 34072, 34417, 34764, 35113, 35463, 35814, 36167, 36522, 36878, 37235, 37595, 37955, 38318, 38681, 39047, 39413, 39782, 40152, 40523, 40896, 41270, 41646, 42024, 42403, 42783, 43165, 43549, 43934, 44320, 44708, 45098, 45489, 45881, 46275, 46671, 47068, 47466, 47866, 48268, 48671, 49075, 49481, 49889, 50298, 50708, 51120, 51533, 51948, 52364, 52782, 53202, 53622, 54044, 54468, 54893, 55320, 55748, 56178, 56609, 57041, 57475, 57911, 58347, 58786, 59226, 59667, 60109, 60554, 60999, 61446, 61895, 62345, 62796, 63249, 63703, 64159, 64616, 65075, 65535 };

unsigned char volatile resetCounter = 0;
unsigned char volatile currentChannelNumber = 0;
unsigned char volatile currentBaseAddress = 0;
unsigned char volatile channelValues[MAX_CHANNELS_OF_DEVICE] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

#ifdef WITH_PORTD1_AS_USART
ISR(USARTD1_RXC_vect) {
#else
ISR(USARTC1_RXC_vect) {
#endif

	static unsigned char data;
	unsigned char tmp;

#ifdef WITH_PORTD1_AS_USART
	data = USARTD1.DATA;
#else
	data = USARTC1.DATA;
#endif

	//PORTA.OUTCLR = 0b00000100;

	// Ok, "Timer" zum Zurücksetzen der Kanalnummer zurücksetzen
	// und "enablen"
	resetCounter=1;

	if (USARTC1.STATUS & (USART_FERR_bm | USART_BUFOVF_bm | USART_PERR_bm)) {
		// Transmission error, drop this frame
		PORTA.OUTCLR = 0x02; // Grüne LED aus
		PORTA.OUTSET = 0x01; // Rote LED an
		currentChannelNumber = ERROR_CONDITION;
	}

	// Bei Fehler oder zu vielen Bytes ISR verlassen
	if (currentChannelNumber == ERROR_CONDITION) { return; }

	if (
		currentChannelNumber >= currentBaseAddress
		&&
		currentChannelNumber < (currentBaseAddress+MAX_CHANNELS_OF_DEVICE)
	) {

		//PORTA.OUTSET = 0b00001000;

		tmp = currentChannelNumber - currentBaseAddress;

 		if (tmp == 0) {
			PORTA.OUTCLR = 0x01; // Rote LED aus
			PORTA.OUTSET = 0x02; // Grüne LED an, Frame-Start.
		}

		channelValues[tmp] = data;

		if (tmp == (MAX_CHANNELS_OF_DEVICE-1))   {
			// Ok, letzter Kanal, Werte übernehmen
			TCC0.CCABUF = gamma25[channelValues[0]];  // R1 = 0
			TCC0.CCBBUF = gamma22[channelValues[5]];  // G1 = 5
			TCC0.CCCBUF = gamma25[channelValues[10]]; // B1 = 10

			TCC0.CCDBUF = gamma25[channelValues[1]];  // R2 = 1
			TCC1.CCABUF = gamma22[channelValues[6]];  // G2 = 6
			TCC1.CCBBUF = gamma25[channelValues[11]]; // B2 = 11

			TCD0.CCABUF = gamma25[channelValues[2]];  // R3 = 2
			TCD0.CCBBUF = gamma22[channelValues[7]];  // G3 = 7
			TCD0.CCCBUF = gamma25[channelValues[12]]; // B3 = 12

			TCD0.CCDBUF = gamma25[channelValues[3]];  // R4 = 3
			TCD1.CCABUF = gamma22[channelValues[8]];  // G4 = 8
			TCD1.CCBBUF = gamma25[channelValues[13]]; // B4 = 13

			TCE0.CCABUF = gamma25[channelValues[4]];  // R5 = 4
			TCE0.CCBBUF = gamma22[channelValues[9]];  // G5 = 9
			TCE0.CCCBUF = gamma25[channelValues[14]]; // B5 = 14

			// LED aus
			PORTA.OUTCLR = 0x02;
		}

		//PORTA.OUTCLR = 0b00001000;
	}

	if (currentChannelNumber<ERROR_CONDITION) { currentChannelNumber++;}

}

int main() {
	// Konfig. PORT A: Zwei Outputs, Rest IN
	PORTA.DIR = 0b00011111;
	PORTA.OUT = 0b00000011; // Both LEDs on

	// Konfig. PORT A: Pullups einschalten
	PORTA.PIN5CTRL = PORT_OPC_PULLUP_gc;
	PORTA.PIN6CTRL = PORT_OPC_PULLUP_gc;
	PORTC.DIR = 0b11111111;
	PORTD.DIR = 0b11111111;
	PORTE.DIR = 0b00001111;

	// Osczillator-Modus: Crystal von 2-9MHz, mit 16k cycles startup-time
	OSC.XOSCCTRL = OSC_XOSCSEL_XTAL_16KCLK_gc | OSC_FRQRANGE_2TO9_gc;

	// CLK-Sourcen enablen
	OSC.CTRL = /* OSC_RC32MEN_bm | */ OSC_XOSCEN_bm ; //enable external OSC, Crystal

	while(!(OSC.STATUS & OSC_XOSCRDY_bm));  //wait for stability for External Clock Source
	PORTA.OUT = 0x00; // LEDs off.

	CCP = CCP_IOREG_gc; // Conf.Änderung erlauben
	CLK.CTRL = 0x03;    // CSource Clock Extern
	CCP = CCP_IOREG_gc; // Conf.Änderung erlauben
	CLK.PSCTRL = 0x00;  // Prescaler 0 (Teiler)

	//USART INIT
#ifdef WITH_PORTD1_AS_USART
	PORTD.DIRCLR  = 0b01000000; // RX Bit (6) als Eingang
	PORTD.DIRSET  = 0b10000000; // TX Bit (7) als Ausgang
	USARTD1.CTRLA = 0b00010000; // Interrupt-Level: RX High, alles andere Off
	USARTD1.CTRLC = 0b00000011; // Async, NoPar, 1SBit, 8Bit Wortgröße
	USARTD1.BAUDCTRLA = 0b00000111; // 7 = 57k6
	//USARTD1.BAUDCTRLA = 0b00001011; // 11 = 38k4
	//USARTD1.BAUDCTRLA = 0b00010111; // 23 = 19k2
	//USARTD1.BAUDCTRLA = 0b00101111; // 47 = 9600 Baud @7,32... Mhz
	USARTD1.BAUDCTRLB = 0b00000000;  //BSCALe=3x0, 11 hat keine high bits, daher auch 0
	USARTD1.CTRLB = 0b00011000; // 000, RX ein, TX ein, Single-Speed, No-Multi, 2xDontCare
#else
	PORTC.DIRCLR  = 0b01000000; // RX Bit (6) als Eingang
	PORTC.DIRSET  = 0b10000000; // TX Bit (7) als Ausgang
	USARTC1.CTRLA = 0b00010000; // Interrupt-Level: RX High, alles andere Off
	USARTC1.CTRLC = 0b00000011; // Async, NoPar, 1SBit, 8Bit Wortgröße
	USARTC1.BAUDCTRLA = 0b00000111; // 7 = 57k6
	//USARTD1.BAUDCTRLA = 0b00001011; // 11 = 38k4
	//USARTD1.BAUDCTRLA = 0b00010111; // 23 = 19k2
	//USARTD1.BAUDCTRLA = 0b00101111; // 47 = 9600 Baud @7,32... Mhz
	USARTC1.BAUDCTRLB = 0b00000000;  //BSCALe=3x0, 11 hat keine high bits, daher auch 0
	USARTC1.CTRLB = 0b00011000; // 000, RX ein, TX ein, Single-Speed, No-Multi, 2xDontCare
#endif

	//TIMER PORTD_0 INIT
	TCD0.CTRLA = TC_CLKSEL_DIV1_gc;    // divide clock by 0, enable Timers
	TCD0.PER   = 0xFFFF;               // set resolution to 16Bit
	TCD0.CTRLB = 0xF0 | TC_WGMODE_SS_gc;    // enable frequency generation for all 4 Channels

	//TIMER PORTD_1 INIT
	TCD1.CTRLA = 0x01;
	TCD1.PER   = 0xFFFF;
	TCD1.CTRLB = 0xF3;    // Es scheint nichts zu machen, wenn mann Bits für
	                      // Output-Compare setzt, die nicht vorhanden sind.
						  // Manual schweigt sich darüber aus.

	//TIMER PORTC_0 INIT
	TCC0.CTRLA = 0x01;    // divide clock by 0, enable Timers
	TCC0.PER   = 0xFFFF;  // set resolution to 16Bit
	TCC0.CTRLB = 0xF3;    // enable frequency generation for all 4 Channels

	//TIMER PORTC_1 INIT
	TCC1.CTRLA = 0x01;    // divide clock by 0, enable Timers
	TCC1.PER   = 0xFFFF;  // set resolution to 16Bit
	TCC1.CTRLB = 0xF3;    // Es scheint nichts zu machen, wenn mann Bits für
	                      // Output-Compare setzt, die nicht vorhanden sind.
						  // Manual schweigt sich darüber aus.

	//TIMER PORTE_0 INIT
	TCE0.CTRLA = 0x01;    // divide clock by 0, enable Timers
	TCE0.PER   = 0xFFFF;  // set resolution to 16Bit
	TCE0.CTRLB = 0xF3;    // enable frequency generation for all 4 Channels

	// Interrupts anknipsen
	CCP = CCP_IOREG_gc;      // Conf.Änderung erlauben
	PMIC.CTRL  = 0b00000111; // ENABLE high, mid und low level interrupts

	// Basisadresse für Kaskadierung auslesen
	// Achtung: Zwei gesetzte Jumper = Adresse 3
	// würde wegen Jumper->Masse "00" ergeben. Wir
	// müssen daher zuerst invertieren, dann maskieren,
	// dann shiften.
	currentBaseAddress = ~PORTA.IN;
	currentBaseAddress &= 0b01100000;
	currentBaseAddress >>= 5;
	currentBaseAddress *= MAX_CHANNELS_OF_DEVICE;

	// Interrupts ein
	sei();

	while (1) {
		_delay_us(10);
		if ((resetCounter<0xFF) && (resetCounter>0)) { resetCounter++; }
		if (resetCounter == 100) {
			//PORTA.OUTSET = 0b00000100;
			resetCounter = 0;
			currentChannelNumber=0;
		}
	}
}

Kurz zur Funktionsweise: Nach der Initialisierung der MCU wartet die USART-ISR auf ein ankommendes Byte. Je nach Jumper-Einstellung wird dann die entsprechende Zahl an Kanälen eingelesen, gamma-korrigiert und beim letzten Byte in die gepufferten PWM-Timer-Register übernommen.

Mittels der Hauptschleife habe ich einen Software-Timer realisiert, der eine Millisekunde nach dem letzten Byte den Kanalindex zurücksetzt. Zur Synchronisation wird also die Pause zwischen den Frames benutzt, welche bei 50 Hz ~20ms lang ist. Die Übertragung von 45 Bytes dauert knapp 8ms, damit haben wir also genug Zeit.

Mit dem Define-Statement kann schnell von einem USART zu einem noch freien auf Port C umgeschaltet werden. Ich hatte meinen auf Port D getoastet, nachdem ich beim Messen des USART-Signals am Stecker oben mit der Oszi-Spitze an 12V und das MCU_RX-Signal gekommen bin. Sowohl AVR-USART wie auch MAX3232 haben das nicht überlebt.

Ihr könnt mit dem Oszi an PORTA.3 und 4 Debug-Signale abnehmen: Das eine markiert den Reset des Index-Counters, das andere Beginn und Ende des eingestellten Frames, sollte also bei z.B. Byte 0 angehen und Byte 14 wieder auf 0 fallen.

Wie gesagt, beschämend simpel.

12 Kommentare zu “Ambi-Light 2: 16bit PWM, 5 RGB-Kanäle”

1.   Kommentar von Herman Oving
Erstellt am 22. März 2010 um 12:26 Uhr.

Hallo. Klasse gemacht. Wir überlegen ob wir die Daten nicht per PWM rausschicken, sondern als DMX. Der dmx receiver macht dann den PWM Teil, zB eine PAR oder moving head oder LED rgb light.
Ein Atmel mit dmx zu versehen ist nicht viel arbeit. Jedoch erst mal in dein Code einsteigen. Theoretisch brauche ich nur einen hex Wert zwischen 0 und 255 pro r,g oder b. Also 12 Kanäle( 4 * rgb) Mal sehen wo ich den am besten abgreife. Leider ist mein c nicht besonders gut. Bislang verwende ich nur assembler. Den PWM Teil werde ich dann weg lassen. Noch habe ich dein Code noch nicht mal detailliert angeschaut.
Vielen Dank und mal sehen ob das Projekt was wird.
Fabian & Herman Oving

2.   Kommentar von McSeven
Erstellt am 22. März 2010 um 14:59 Uhr.

Hi, Danke. Ich hab nur nicht genau verstanden, was ihr machen wollt? Soll es ein Seriell-zu-DMX-Konverter werden? Da schaut mal unter http://www.mikrocontroller.net, da gibt’s einiges zum Thema. Ziel dieses Projektes sollte ja genau die PWM-Ausgabe sein…

3.   Kommentar von hurra
Erstellt am 27. März 2010 um 15:12 Uhr.

Gibts den kompletten Quellcode auch nochmal zum Runterladen?

Danke

4.   Kommentar von McSeven
Erstellt am 27. März 2010 um 18:33 Uhr.

Hi, das versteh ich inhaltlich nicht. Auf Seite drei hast Du den gesamten Quelltext der Firmware. Mehr ist’s nicht. Und für die Sourcen von Boblight mußt Du auf seiner Seite schauen…

5.   Kommentar von hurra
Erstellt am 28. März 2010 um 13:39 Uhr.

c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avrxmega2/crtx16a4.o:(.init9+0x0): undefined reference to `main‘

Was mache ich falsch?

6.   Kommentar von McSeven
Erstellt am 05. April 2010 um 12:42 Uhr.

alles klar, es war ein dummer Fehler beim Kopieren und Einfügen, ich habe die neueste und vollständige Version eingebaut. Sollte funktionieren… Danke für den Hinweis.

7.   Kommentar von hurra
Erstellt am 03. Mai 2010 um 16:39 Uhr.

Hallo nochmal.

Ich konnte das Projekt erfolgreich nachbauen! Funktioniert super.

Die Schaltung hat aber imho noch ein Problem: Die Sende- und Empfangsleitung zwischen MAX und dem COM-Anschluß sind gekreuzt.
Darum wird im aktuellen Schaltplan ein Nullmodemkabel zwischen PC und Platine benötigt. Bei der Verwendung eines USB-Serial-Adapters muss das gekreuzte Nullmodemkabel zusätzlich noch eingefügt werden.

Ich würde die Kreuzung auf der Platine entfernen und Stattdessen eine normales Modemkabel verwenden (siehe hier: http://www.mikrocontroller.net/articles/AVR-Tutorial:_UART)

Bei mir funktioniert das ganze mit dem USB-Serial-Wandler problemlos

Danke!

8.   Kommentar von McSeven
Erstellt am 03. Mai 2010 um 19:22 Uhr.

Sehr schön, freut mich, wenn es klappt. Wegen des UART haste Recht. Hintergrund ist, dass ich noch ein paar dieser Kabel mit 5m Länge daheim liegen hatte und dafür das Gerät entworfen habe. Es ist so aber tatsächlich keine saubere Umsetzung. Danke für den Hinweis.

9.   Kommentar von hurra
Erstellt am 04. Mai 2010 um 00:20 Uhr.

Das einzige, was mir negativ auffällt ist die große Verzögerung. Gerade beim Filmen mit schnellen Farbwechseln ist dies stark zu bemerken. Es sind vielleicht 0.4 Sekunden. Konntes du dieses Delay auch feststellen? Woran liegt das? An der boblight-Software (1.3)? Gibt’s Abhilfe?

10.   Kommentar von McSeven
Erstellt am 04. Mai 2010 um 09:22 Uhr.

Hm, das kann imo an mehreren Dingen liegen:
a) USB2Seriell macht Ärger -> mit reiner HW-Schnittstelle testen.
b) Parameter „proportional“ in der boblight.conf steuert die Farbübergänge. Je größer, desto sanfter.
c) Desktop-Komposition in Vista und 7 aus?

Ansonsten schau Dir das Video an, so tuts bei mir; ich glaube nicht, dass es da Verögerungen gibt. Ich hab auch schon jerry bruckheimer filme gesehen auf dem system, da „klebten“ die LEDs an dem Blitz am Anfang. Sollte also kein Systemfehler sein.

11.   Kommentar von hurra
Erstellt am 05. Mai 2010 um 13:12 Uhr.

Ich konnte das Problem wesentlich kleiner machen. Das von mir verwendete boblight-X11 kennt einen Parameter -t, mit dem die Abtastzeit eingestellt wird. Standard sind 0.5 Sekunden. Wenn man den Wert kleiner macht reagiert er viel schneller, jedoch braucht er dabei auch ziemlich viel CPU-Leistung.

Etwas Verzögerung bleibt zwar trotzdem noch, damit kann man aber durchaus leben.

Außerdem hoffe ich, dass dies bei der neuen Version von boblight besser wird. Leider kann ich die Entwicklerversion derzeit nicht testen, da boblight-X11 immer mit ner Fehlermeldunng abschmiert (Bug ist reported bei google-code)

12.   Kommentar von hurra
Erstellt am 27. Mai 2010 um 11:55 Uhr.

Nochmal Feedback.

Hab jetzt doch die neue Version aus dem Google-Code-Repository zum laufen bekommen. Mit dieser Version sind wesentlich kleinere Abtastzeiten möglich. Standardmäßig sind 0.1 Sekungen eingestellt, aber auch 0.05s gehen bei mir problemlos.

Damit ists jetzt endlich so flott, wie von mir erwartet 🙂

Danke!

Einen Kommentar hinterlassen