Hallo zusammen,
ich hab´ mal wieder was angefangen … passt aber irgendwie nicht so richtig zu den vorhandenen ähnlichen Threads. Ich wollte sehen, was in einen ATtiny so alles reinpasst und habe einen DCC-Dekoder auf ATtiny-Basis mit Schieberegistern kombiniert. Vorab also schon mal direkt: Klar - mit einem Arduino geht´s genau so gut oder besser. Dann bleiben nach Abzug der drei Ports für die Schieberegister und den Port für das DCC-Signal sogar noch mehr als einer übrig. Die "Dekoder-Hardware" orientiert sich am Digispark und der Schaltung von Robokalle mit dem Vorteil, dass der StepDown-Regler an der Digitalspannung nicht direkt heiß wird. Anwendung könnte das ganze in einem Diorama oder Modul finden, wo man nicht viele Schaltdekoder verbauen will. Oder wenn man auf der MS2 lieber zu einer Lokadresse die Funktionstasten bedient, als zwischen 16 Weichenadressen hin- und herspringt.
Mit den Funktionstasten F0 bis F15 der MS2 werden die Ausgänge der ersten beiden Schieberegister geschaltet. Da dann immer noch Platz war, können mit weiteren Schieberegistern Effekte gesteuert werden - in diesem Beispiel erstmal ein Lauflicht und eine Verkehrsampel (welche im ausgeschalteten Zustand dann gelb blinkt). Weitere bzw. andere Effekte wären auch noch denkbar … Wegen der Beschränkung auf 16 Funktionen habe ich die Effekt-Schieberegister jetzt auch auf F0, F1, usw. gelegt.
Als Ausgangs-Sketch habe ich Dec_17LED_1Ftn von Geoff Bunza aus den Beispielen zur NmraDcc-Library verwendet. Hier noch ein Auszug aus dem Coding, wie die Funktionstastenzustände auf die Bits der Schieberegister umgesetzt werden:
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
...
for (int i = 0; i < 2; i++) { // Für jedes Schalt-Schieberegister-Modul ...
for (int j = 0; j < 8; j++) { // Für jeden Ausgang ...
if( function_key[(i*8)+j]) {
shiftValue[i] = switchLEDs (j,true,preValue[i]); // Ausgang-Bit setzen
}
else {
shiftValue[i] = switchLEDs (j,false,preValue[i]); // Ausgangs-Bit löschen
}
shiftoutLEDs(modulZahl); // Unterprogramm zur Ausgabe der Daten an die Schieberegister
}
...
byte switchLEDs (byte ledPos, boolean onOff, byte preValue) {
byte newValue = 0;
if (onOff) {
newValue = bitSet(preValue,ledPos); // LED einschalten, wenn onOff = true
}
else {
newValue = bitClear(preValue,ledPos); // LED ausschalten, wenn onOff = false
}
return newValue;
}
Falls ich es irgendwann mal schaffe, das tatsächlich in eine hübsche Anwendung zu packen, werde ich weiter berichten. Fragen sind natürlich erlaubt und werden gerne beantwortet, sofern es nicht nur ein lapidares "stell´ mal den gesamten Sketch hier ein" ist …
Viele Grüße, Bodo