Arduino Ethernet (KEIN Shield!) und TLC5940. ist das möglich?

@pylon: sensationell!
(Unter anderem) mit deiner grandiosen Hilfe ist es mir nun gelungen, den Webserver parallel zum TLC5940 zu verwenden!

Ich habe die Library deinen Vorgaben entsprechend modifiziert und mit diesem Arduino-Sketch getestet:

#include <Ethernet.h>
#include <SPI.h>
#include "Tlc5940.h"

boolean reading = false;
byte ip[] = { 192, 168, 1, 70 };
byte gateway[] = { 192, 168, 1, 1 };
byte subnet[] = { 255, 255, 255, 0 };
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };  
EthernetServer server = EthernetServer(80);

void setup(){
	Serial.begin(9600);

	Tlc.init();

	Ethernet.begin(mac, ip, gateway, subnet);
	server.begin();

	Serial.println(Ethernet.localIP());
}

void loop(){
	EthernetClient client = server.available();
	if (client) {
		boolean currentLineIsBlank = true;
		boolean sentHeader = false;

		while (client.connected()) {
			if (client.available()) {
				if(!sentHeader){
					client.println("HTTP/1.1 200 OK");
					client.println("Content-Type: text/html");
					client.println();
					sentHeader = true;
				}

		        char c = client.read();

				if (reading && c == ' ') reading = false;
				if (c == '?') reading = true; //found the ?, begin reading the info

				if(reading){
					Serial.print(c);

					switch (c) {
						case '0':
							ledStepper(-1);
							client.println("Toggle LEDs from 16-0.");
						break;
						case '1':
							ledStepper(1);
							client.println("Toggle LEDs from 16-0.");
						break;
					}

				}
				if (c == '\n' && currentLineIsBlank) break;
				if (c == '\n') {
					currentLineIsBlank = true;
				} else if (c != '\r') {
					currentLineIsBlank = false;
				}
			}
		}
		delay(1); // give the web browser time to receive the data
		client.stop(); // close the connection:
	} 
}

void ledStepper(int _direction) {
	int channel = 0;
	if (_direction != 1) {
		channel = 16;
	}
	for (int count = 0; count < 16; count++) {
		Tlc.clear();
		Tlc.set(channel - 1, 1000);
		Tlc.set(channel, 4095);
		if (channel != 16 - 1) {
			Tlc.set(channel + 1, 1000);
		}
		Tlc.update();
		channel = channel += _direction;
		delay(75);
	}
}

...und diese Konfiguration verwende ich in tlc_config.h:

#define DATA_TRANSFER_MODE    TLC_BITBANG
/** SIN (TLC pin 26) */
#define SIN_PIN        PD2	// Arduino-Pin 2
#define SIN_PORT       PORTD
#define SIN_DDR        DDRD
/** SCLK (TLC pin 25) */
#define SCLK_PIN       PD7	// Arduino-Pin 7
#define SCLK_PORT      PORTD
#define SCLK_DDR       DDRD
/** BLANK (TLC pin 23) */
#define BLANK_PIN      PD5	// Arduino-Pin 5
#define BLANK_PORT     PORTD
#define BLANK_DDR      DDRD

Wenn man das ganze dann so verkabelt wie auf dem Bild zu sehen, und im Browser http://192.168.1.70/?1 oder http://192.168.1.70/?0 aufruft, laufen die LEDs (Angeschlossen an den PWM-Kanälen 1-16 des TLC5940) einmal hinauf oder hinunter.

soweit so gut! DANKE!

Für mich ergeben sich dadurch aber auch folgende Fragen:

  1. Ist es möglich, dass sich aus dieser Lösung, die man doch eher als Workaround bezeichnen kann, irgendwelche Stabilitätsprobleme ergeben?

  2. Welcher Nachteil ergibt sich aus "deutlich mehr Interrupts" noch, außer einer höheren Prozessorbelastung?

  3. Außerdem schreibst du:

Das Timing auf dem BLANK-Ausgang ändert sich zwar geringfügig

Was bedeutet das dann in der Praxis bzw welche Auswirkungen hat das möglicherweise?

Tlc5940_mod.zip (64.6 KB)