@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:
-
Ist es möglich, dass sich aus dieser Lösung, die man doch eher als Workaround bezeichnen kann, irgendwelche Stabilitätsprobleme ergeben?
-
Welcher Nachteil ergibt sich aus "deutlich mehr Interrupts" noch, außer einer höheren Prozessorbelastung?
-
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)