RE: Probleme bei Schaltung für belebtes Haus

#1 von Anxarces , 28.10.2014 22:23

Hallo zusammen,

ich bin zur Zeit dabei, eine Schaltung für ein belebtes Haus mit dem Arduino zu realisieren. Das Haus ist mit den LED-Hausbeleuchtungsplatinen von Viessmann versehen. Diese Platinen sind für eine Spannung von 10-16V ausgelegt. Daher kann ich sie nicht direkt über den Arduino ansteuern. Ausserdem habe ich im Haus 22 Platinen verbaut, so dass mir die Ausgänge des Arduinos auch nicht reichen würden.

Daher habe ich folgendes Vorgehen geplant:

    * Erweiterung der Ausgänge des Arduinos mit 3 8-bit Schieberegister

    * Betrieb der Schieberegister mit 15V DC und Trennung von der Steuerung des Arduinos durch Optokoppler


Herausgekommen ist folgender Schaltplan:



An die Emitterausgänge der Optokoppler habe ich 10kOhm Pulldownwiderstände angeschlossen. Die Schieberegister sind MOS4094 (siehe hier), die Optokoppler sind vom Typ 4N35 (siehe hier).

Die einzelnen Komponenten arbeiten einwandfrei. Das Schieberegister steuert LEDs auf dem Steckbrett korrekt an, die Optokoppler schalten wie geplant. In Kombination ist das Ergebnis nicht das Gewünschte. Es leuchten zwar einzelne Fenster, aber mit jedem neuen Schreiben in das Schieberegister ändern sich die beleuchteten Fenster, obwohl der geschriebene Wert immer der gleich ist. Nach einer Weile wiederholt sich dann das Muster, d.h. das Anfangsmuster erscheint wieder.

Folgenden Code verwende ich für die Tests:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
int latchPin = 7;
int clockPin = 12;
int dataPin = 2;
long data = 0B110100110101001101001111;
 
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
 
void loop()
{
digitalWrite(latchPin, LOW);
digitalWrite(clockPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, data >> 16);
digitalWrite(clockPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, data >> 8);
digitalWrite(clockPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, data);
digitalWrite(latchPin, HIGH);
delay(500);
}
 



Auch das manuelle Schreiben in das Schieberegister anstelle von shiftOut löst das Problem nicht. Ich hatte hier sogar Delays eingebaut, ohne Erfolg.

Woran könnte das komische Verhalten liegen und wie kann ich es beheben?

Viele Grüße
Uli



 
Anxarces
InterRegioExpress (IRE)
Beiträge: 311
Registriert am: 05.08.2006
Homepage: Link
Gleise K-Gleis
Spurweite H0, H0e, Z
Steuerung CS1 Reloaded
Stromart AC, DC, Digital


RE: Probleme bei Schaltung für belebtes Haus

#2 von Bodo , 29.10.2014 08:26

Hallo Uli,

die Befehle

1
 
digitalWrite(clockPin, LOW);
 

erschließen sich mir nicht. Hast Du die schon mal weggelassen ?

1
2
3
4
5
6
7
8
9
 
void loop() 
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, data >> 16);
shiftOut(dataPin, clockPin, MSBFIRST, data >> 8);
shiftOut(dataPin, clockPin, MSBFIRST, data);
digitalWrite(latchPin, HIGH);
delay(500);
}
 

müßte völlig reichen.

Für wahrscheinlicher halte ich aber, dass mit dem data-Wert was schief geht ... s.a. http://arduino.cc/en/Reference/IntegerConstants . Da steht jedenfalls, dass die B...-Formatierung nur mit 8-Bit-Werten funktioniert. Eine 0B...-Formatierung habe ich gar nicht gefunden.

Definiere data doch testweise mal mit einem passenden Dezimalwert - oder statt einem Long-Wert drei verschiedene INT-Werte data1, data2, data3. Ich benutze pro Schieberegister einen INT-Wert shiftVal_x und kann problemlos 10 Schieberegister damit steuern.

Meine "Hardware" ist unter http://moba.noethlich.info/?page_id=297 zu finden - als Ausgabe-Code benutze ich ein Unterprogramm (hier nur für 8 Schieberegister):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
void shiftoutLEDs() {
// nur falls Änderung seit letztem Schreibvorgang ...
if(shiftVal_A != preVal_A || shiftVal_B != preVal_B || shiftVal_C != preVal_C || shiftVal_D != preVal_D ||
shiftVal_E != preVal_E || shiftVal_F != preVal_F || shiftVal_G != preVal_G || shiftVal_H != preVal_H) {
digitalWrite(latchPin, LOW); // latchPin LOW so LEDs don't change while sending data
shiftOut(dataPin, clockPin, MSBFIRST, shiftVal_H); // Ausgabe der Bits für Schieberegister H
shiftOut(dataPin, clockPin, MSBFIRST, shiftVal_G); // Ausgabe der Bits für Schieberegister G
shiftOut(dataPin, clockPin, MSBFIRST, shiftVal_F); // Ausgabe der Bits für Schieberegister F
shiftOut(dataPin, clockPin, MSBFIRST, shiftVal_E); // Ausgabe der Bits für Schieberegister E
shiftOut(dataPin, clockPin, MSBFIRST, shiftVal_D); // Ausgabe der Bits für Schieberegister D
shiftOut(dataPin, clockPin, MSBFIRST, shiftVal_C); // Ausgabe der Bits für Schieberegister C
shiftOut(dataPin, clockPin, MSBFIRST, shiftVal_B); // Ausgabe der Bits für Schieberegister B
shiftOut(dataPin, clockPin, MSBFIRST, shiftVal_A); // Ausgabe der Bits für Schieberegister A
digitalWrite(latchPin, HIGH); // latchPin HIGH so LEDs will light up
preVal_H = shiftVal_H; // Sichern des aktuellen Werts für Schieberegister H
preVal_G = shiftVal_G; // Sichern des aktuellen Werts für Schieberegister G
preVal_F = shiftVal_F; // Sichern des aktuellen Werts für Schieberegister F
preVal_E = shiftVal_E; // Sichern des aktuellen Werts für Schieberegister E
preVal_D = shiftVal_D; // Sichern des aktuellen Werts für Schieberegister D
preVal_C = shiftVal_C; // Sichern des aktuellen Werts für Schieberegister C
preVal_B = shiftVal_B; // Sichern des aktuellen Werts für Schieberegister B
preVal_A = shiftVal_A; // Sichern des aktuellen Werts für Schieberegister A
}
}
 



Viele Grüße, Bodo

PS: Für die Verstärkung der Schaltleistung benutze ich Transistor-Arrays statt der Optokoppler. Nach Ändern der Vorwiderstände vor den LEDs auf ca. 330 Ohm geht´s auch ohne zusätzliche Verstärkung. Und mit 9V (die man bei Versorgung mit Steckernetzteil von V(in) des Arduino abgreifen kann) leuchten die Viessmann-LEDs auch mit dem werkseitigen Vorwiderstand schon ganz ordentlich.


Die Freiheit des Menschen liegt nicht darin, dass er tun kann, was er will, sondern dass er nicht tun muss, was er nicht will. (Jean-Jacques Rousseau)

Meine Anlage - Meine Dauerbaustelle
Platinen für Modellbahn- und Arduino-Anwendungen


 
Bodo
InterCityExpress (ICE)
Beiträge: 2.471
Registriert am: 28.04.2005
Homepage: Link
Gleise C-Gleis, Lenz 0
Spurweite H0, 0
Steuerung MS2 & CS2
Stromart Digital


RE: Probleme bei Schaltung für belebtes Haus

#3 von Anxarces , 29.10.2014 10:45

Zitat von Bodo


die Befehle

1
 
digitalWrite(clockPin, LOW);
 

erschließen sich mir nicht. Hast Du die schon mal weggelassen ?



shiftOut schreibt die Werte laut Dokumentation bei fallender Flanke in die Register. Mein Schieberegister schreibt die Werte jedoch bei steigender Flanke. Hier wird in der Arduino Dokumentation das explizite Setzen von clock auf LOW empfohlen. Ich habe testweise diese Befehle weggelassen, jedoch ohne Erfolg.

Zitat von Bodo

Für wahrscheinlicher halte ich aber, dass mit dem data-Wert was schief geht ... s.a. http://arduino.cc/en/Reference/IntegerConstants . Da steht jedenfalls, dass die B...-Formatierung nur mit 8-Bit-Werten funktioniert. Eine 0B...-Formatierung habe ich gar nicht gefunden.


Das muss ich nochmal prüfen.

Zitat von Bodo

Definiere data doch testweise mal mit einem passenden Dezimalwert - oder statt einem Long-Wert drei verschiedene INT-Werte data1, data2, data3. Ich benutze pro Schieberegister einen INT-Wert shiftVal_x und kann problemlos 10 Schieberegister damit steuern.


Jedoch habe ich auch Versuche mit expliziten Bytewerten gemacht. Auch ohne Erfolg. Ich habe aber recht viel rumprobiert und werde es nochmal mit dem hier angegebenen Code versuchen.



 
Anxarces
InterRegioExpress (IRE)
Beiträge: 311
Registriert am: 05.08.2006
Homepage: Link
Gleise K-Gleis
Spurweite H0, H0e, Z
Steuerung CS1 Reloaded
Stromart AC, DC, Digital


RE: Probleme bei Schaltung für belebtes Haus

#4 von Anxarces , 29.10.2014 11:02

Da der Schaltplan oben recht unübersichtlich ist, hier ein Detail zum Optokoppler und Schieberegister.



Kann es sein, dass hier der Fehler liegt? Ich habe hier ein Bild zur Verwendung von Pullup und Pulldown Widerständen mit Optokopplern gefunden. Mein Optokoppler 4N35 scheint einen NPN Transistor zu besitzen. In den Bildern wird hier dann jedoch ein Pullup Widerstand verwendet. Könnte das der Grund für mein Problem sein?

Viele Grüße
Uli



 
Anxarces
InterRegioExpress (IRE)
Beiträge: 311
Registriert am: 05.08.2006
Homepage: Link
Gleise K-Gleis
Spurweite H0, H0e, Z
Steuerung CS1 Reloaded
Stromart AC, DC, Digital


RE: Probleme bei Schaltung für belebtes Haus

#5 von Bodo , 29.10.2014 11:33

Hallo Uli,

mir wird jetzt erst bewußt, dass Du die Optokoppler zwischen Arduino und Schieberegister hast ... meiner Meinung nach macht es bei der Konzeption aber mehr Sinn, nur die Leistungsausgänge zu entkoppeln (also an den Schieberegister-Ausgängen Optokoppler oder Transistoren).

Um den Fehler einzugrenzen, würde ich den Aufbau erstmal mit einem Schieberegister und dem "HelloWorld"-Binärzähler aus der Arduino-Reference ausprobieren. Zu Deiner Bauteile-Kombination kann ich eigentlich nichts sagen - ist der Optokoppler schnell genug, oder "schluckt" er möglicherweise Daten ?

Bei mir waren Fehler in der Ausgabe bisher immer auf unsaubere Lötverbindungen (Kriechströme ?) oder - wesentlich häufiger - auf Fehler bei der Datenausgabe zurückzuführen (Wert in der Ausgabe-Kette vergessen u.ä.). Deshalb würde ich zunächst mal den elektrischen Aufbau in der einfachsten Form mit dem Beispielprogramm prüfen. Wenn das einwandfrei funktioniert, liegt der Fehler bei der Datenübertragung/-formatierung oder bei den nachgeschalteten Schieberegistern.

Viele Grüße, Bodo


Die Freiheit des Menschen liegt nicht darin, dass er tun kann, was er will, sondern dass er nicht tun muss, was er nicht will. (Jean-Jacques Rousseau)

Meine Anlage - Meine Dauerbaustelle
Platinen für Modellbahn- und Arduino-Anwendungen


 
Bodo
InterCityExpress (ICE)
Beiträge: 2.471
Registriert am: 28.04.2005
Homepage: Link
Gleise C-Gleis, Lenz 0
Spurweite H0, 0
Steuerung MS2 & CS2
Stromart Digital


RE: Probleme bei Schaltung für belebtes Haus

#6 von Anxarces , 29.10.2014 12:43

Hallo Bodo,

die Optokoppler wollte ich nicht an die Leistungsausgänge anschliessen, da ich dann ja 24 davon bräuchte. Bei meiner Lösung benötige ich nur drei Optokoppler. Die Optokoppler scheinen schnell genug zu sein (laut Datenblatt max. 10 Mikrosekunden). Ich habe mit einem Programm getestet, dass anstelle des shiftOut das Schieberegister komplett selbst anspricht und entsprechende Delays (bis zu 1 Sekunde) ziwschen den einzelnen digitalWrite Befehlen eingefügt. Damit konnte ich ein Timingproblem ausschliessen.

Die Lötverbindungen habe ich alle nochmals nachgemessen und nachgelötet. Hier dürfte eigentlich auch kein Problem vorliegen.

Einen Testaufbau mit einem Schieberegister und einem einfachen Testprogramm habe ich auf dem Steckbrett ausprobiert.

Hier ist ebenfalls ein Testaufbau mit dem von mir verwendeten Schieberegister zu finden. Ohne Optokoppler funktioniert das Programm wie gewünscht, mit Optokoppler im Testaufbau nicht.

Viele Grüße
Uli



 
Anxarces
InterRegioExpress (IRE)
Beiträge: 311
Registriert am: 05.08.2006
Homepage: Link
Gleise K-Gleis
Spurweite H0, H0e, Z
Steuerung CS1 Reloaded
Stromart AC, DC, Digital


RE: Probleme bei Schaltung für belebtes Haus

#7 von spielbahn ( gelöscht ) , 29.10.2014 14:12

(1) verkleinere mal die Pulldownwiderstände von 10k auf 1k.
Oder:
(2) Vielleicht könntest Du mal probieren, die Optokoppler anders an die Schieberegister zu koppeln. Du verwendest Pulldownwiderstände und schließt den Kollektor des Ausgangs des Kopplers an +12V. Versuche es mal mit Pullups. Also den Kollektor über 1k an +12V und den Emitter an GND. Dann musst Du die Logik Deines Steuerprogramms anpassen.


spielbahn

RE: Probleme bei Schaltung für belebtes Haus

#8 von Anxarces , 29.10.2014 23:30

So, ich habe nochmals mit einem Testaufbau mit einem Schieberegister experimentiert.

(1) Testen des Codes OHNE Optokoppler funktioniert einwandfrei.
(2) Änderung der Pulldownwiderstände auf 1kOhm hat keine Änderung bewirkt
(3) Umstellen auf Pullupwiderstände und entsprechende Anpassung im Code keine Verbesserung.

Ein Problem mit der Formatierung der Daten (0B-Notation) liegt nicht vor, da ich im Test ja nur ein Byte benötige und dies entsprechend umgesetzt habe.

Viele Grüße
Uli



 
Anxarces
InterRegioExpress (IRE)
Beiträge: 311
Registriert am: 05.08.2006
Homepage: Link
Gleise K-Gleis
Spurweite H0, H0e, Z
Steuerung CS1 Reloaded
Stromart AC, DC, Digital


RE: Probleme bei Schaltung für belebtes Haus

#9 von spielbahn ( gelöscht ) , 30.10.2014 04:07

Tja, wenn es eindeutig an den Optokopplern liegt, dann ist die einfachste Lösung, diese eben wegzulassen.
(Evtl. sind sie zu langsam, oder.....)
Bodo hat schon diesen Vorschlag gemacht. Baue alles ohne Optokoppler auf und setze nach den Schieberegistern Transistorarrays ein, z.B. ULN2803, um die LEDs mit 12V zu schalten. Macht auch von der Hardwareseite Sinn: Du sparst drei Optokoppler und benötigst (für 16 Ausgänge) zwei ULN2803 (und hast ausgangsseitig kein Stromstärkeproblem).


spielbahn

RE: Probleme bei Schaltung für belebtes Haus

#10 von Anxarces , 31.10.2014 22:03

Hallo zusammen,

in meinem Testaufbau konnte ich das Problem nun lösen. Ich habe an die Basis der Optokoppler jeweils 100kOhm Widerstände angeschlossen. Zumindest im Testaufbau funktioniert nun ein Schieberegister. Leider fehlen mir für die eigentliche Schaltung noch entsprechende Widerstände, die ich erst nächste Woche besorgen kann.

Die Lösung mit einem Transistorarray möchte ich nur wählen, wenn ich es mit den Optokopplern nicht zum Laufen bekomme. Ich habe mir für meine Schaltung schon zwei Platinen herstellen lassen habe, die ich gerne verwenden möchte. Zusätzliche Widerstände kann ich da ohne Probleme anbringen, nur ein komplett neues Layout klappt halt nicht.

Viele Grüße
Uli



 
Anxarces
InterRegioExpress (IRE)
Beiträge: 311
Registriert am: 05.08.2006
Homepage: Link
Gleise K-Gleis
Spurweite H0, H0e, Z
Steuerung CS1 Reloaded
Stromart AC, DC, Digital


RE: Probleme bei Schaltung für belebtes Haus

#11 von Anxarces , 04.11.2014 21:24

So, nachdem ich mir nun die 100kOhm Widerstände besorgt habe, konnte ich sie in die Schaltung einlöten. Nun habe ich noch folgendes Problem: bei 5V Versorgungsspannung funktioniert nun alles, bei 12 oder 15V nicht mehr. Der Schaltplanausschnitt sieht nun wie folgt aus:



Kann es sein, dass ich falsche Werte für die Widerstände nutze (R2 = 10KOhm, R3 = 100kOhm)?

Viele Grüße
Uli



 
Anxarces
InterRegioExpress (IRE)
Beiträge: 311
Registriert am: 05.08.2006
Homepage: Link
Gleise K-Gleis
Spurweite H0, H0e, Z
Steuerung CS1 Reloaded
Stromart AC, DC, Digital


RE: Probleme bei Schaltung für belebtes Haus

#12 von spielbahn ( gelöscht ) , 04.11.2014 22:02

Zitat von Anxarces
.....Ich habe mir für meine Schaltung schon zwei Platinen herstellen lassen habe, die ich gerne verwenden möchte......


Platinen zu bestellen, bevor der Testaufbau korrekt läuft, ist mutig. Könnte man evtl. unter "Erfahrung" abbuchen.
Ich verweise nochmals auf frühere Beiträge! Die gesamte Logik unter 5V laufen zu lassen, macht deutlich mehr Sinn. Und erst am Ausgang wird auf 12V umgestellt.


spielbahn

RE: Probleme bei Schaltung für belebtes Haus

#13 von Anxarces , 04.11.2014 22:20

Zitat von spielbahn

Platinen zu bestellen, bevor der Testaufbau korrekt läuft, ist mutig. Könnte man evtl. unter "Erfahrung" abbuchen.


Mir war beim Testaufbau nicht klar, dass die Schaltung nicht funktioniert. Lichter konnte ich ja an und ausschalten. Erst als ich Bits den einzelnen Fenstern zuordnen wollte, bin ich auf das Problem gestoßen.

Viele Grüße
Uli



 
Anxarces
InterRegioExpress (IRE)
Beiträge: 311
Registriert am: 05.08.2006
Homepage: Link
Gleise K-Gleis
Spurweite H0, H0e, Z
Steuerung CS1 Reloaded
Stromart AC, DC, Digital


RE: Probleme bei Schaltung für belebtes Haus

#14 von moppe , 04.11.2014 23:33

Ihren arduino hab 20 Ausgänge, ihren Haus hab 22 lichtstellen. Könnte sie zwei von diesen mit ein andre Ausgang koppeln, brauchst du nur drei uln2803 Verstärker/Treiber und nix weiter.

Klaus


"Meine" Modellbahn:http://www.modelbaneeuropa.dk
Dänisches Bahnforum: http://www.baneforum.dk
PIKO C4 "Horror Gallery": http://moppe.dk/PIKOC4.html


 
moppe
Trans Europ Express (TEE)
Beiträge: 8.720
Registriert am: 07.08.2011
Homepage: Link
Ort: Norddeusche halbinsel
Gleise Roco, PECO, Märklin/Trix, PIKO,
Spurweite H0, H0e, N, Z
Steuerung Z21, Lenz, MpC Gahler+Ringsmeier, Games on Track/Faller
Stromart AC, DC, Digital, Analog


RE: Probleme bei Schaltung für belebtes Haus

#15 von spielbahn ( gelöscht ) , 05.11.2014 11:48

Oh, das mit den 22 Lichtstellen habe ich überlesen...
Da hat Klaus (moppe) natürlich recht: wenn man zwei davon parallel zu anderen schalten könnte, also auf 20 Steuerleitungen kommt, benötigt man die ganze Geschichte mit den Schieberegistern gar nicht und es reichen drei ULN2803 zur Pegelanpassung.


spielbahn

RE: Probleme bei Schaltung für belebtes Haus

#16 von Anxarces , 06.11.2014 21:41

So, die Schaltung funktioniert nun. Jedem Bit ist nun ein Raum zugeordnet. Widerstände mit 1MOhm an der Basis der Optokoppler haben mein Problem gelöst.

Auf die Schieberegister wollte ich nicht verzichten, da ich noch mehr Häuser beleuchten will und nicht für jedes Haus einen Arduino verwenden möchte.

Viele Grüße
Uli



 
Anxarces
InterRegioExpress (IRE)
Beiträge: 311
Registriert am: 05.08.2006
Homepage: Link
Gleise K-Gleis
Spurweite H0, H0e, Z
Steuerung CS1 Reloaded
Stromart AC, DC, Digital


RE: Probleme bei Schaltung für belebtes Haus

#17 von Z-Welt ( gelöscht ) , 06.11.2014 23:20

Hallo Uli,
ich hab diesen Beitrag verfolgt, schön das es jetzt funktioniert. Kannst du uns mal deine neue komplette Schaltung (( Zeichnung )) hier einstellen und hast du am Sketch auch etwas geändert.

MfG Georg


Z-Welt

RE: Probleme bei Schaltung für belebtes Haus

#18 von Anxarces , 08.11.2014 13:07

Hallo Georg,

hier die aktualisierte Detailansicht:



Der komplette Schaltplan:



Den Code überarbeite ich gerade. Ich poste ihn dann hier, sobald ich fertig bin.

Viele Grüße
Uli



 
Anxarces
InterRegioExpress (IRE)
Beiträge: 311
Registriert am: 05.08.2006
Homepage: Link
Gleise K-Gleis
Spurweite H0, H0e, Z
Steuerung CS1 Reloaded
Stromart AC, DC, Digital


RE: Probleme bei Schaltung für belebtes Haus

#19 von Anxarces , 09.11.2014 11:46

Hier noch der entsprechende Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
 
/*******************************************************************
Program to control several lighting shields. Each window on each
shield will be successively be illuminated. The appropriate window
count will be displayed on the serial window.
*******************************************************************/
 
#define LATCHPIN 7
#define CLOCKPIN 12
#define DELAY 400
 
// Add data pin for each connected board.
byte dataPins[] = {2};
byte boardCount = sizeof(dataPins)/sizeof(byte);
 
/*******************************************************************
Setup method.
*******************************************************************/
void setup() {
pinMode(LATCHPIN, OUTPUT);
pinMode(CLOCKPIN, OUTPUT);

// Set each data pin to OUTPUT
for (byte i = 0; i < boardCount; i++)
{
pinMode(dataPins[i], OUTPUT);
}
Serial.begin(9600);
}
 
/*******************************************************************
Loop method.
*******************************************************************/
void loop()
{
// Light up each window in the each connected board
for (byte i = 0; i < boardCount; i++)
{
for (byte j = 0; j < 24; j++)
{
long data = getPattern(j);
updateLighting(data, i);
Serial.print(j);
Serial.print(": ");
Serial.println(i);
delay(2000);
}
}
}
 
/*******************************************************************
Updates the lighting in a specific house.
 
value: The bit pattern of the lighting
boardNumber: Specifies which connected board to update
*******************************************************************/
void updateLighting(long value, byte boardNumber)
{
digitalWrite(LATCHPIN, LOW);
digitalWrite(CLOCKPIN, LOW);
delayMicroseconds(DELAY);
shiftOutDelay(dataPins[boardNumber], CLOCKPIN, (value >> 16) & 255);
delayMicroseconds(DELAY);
shiftOutDelay(dataPins[boardNumber], CLOCKPIN, (value >> 8) & 255);
delayMicroseconds(DELAY);
shiftOutDelay(dataPins[boardNumber], CLOCKPIN, value & 255);
delayMicroseconds(DELAY);
digitalWrite(LATCHPIN, HIGH);
delayMicroseconds(DELAY);
digitalWrite(LATCHPIN, LOW);
delayMicroseconds(DELAY);
}
 
/*******************************************************************
Move bit pattern into an 8 bit shift register. Each cycle can be
delayed.
 
dataPin: Data pin of the shift register.
value: 8-bit value to be moved into the shift register.
*******************************************************************/
void shiftOutDelay(byte dataPin, byte clockPin, byte value)
{
for (int i = 0; i < 8; i++) {
digitalWrite(dataPin, !!(value & (1 << i)));
delayMicroseconds(DELAY);
digitalWrite(clockPin, HIGH);
delayMicroseconds(DELAY);
digitalWrite(clockPin, LOW);
}
}
 
/*******************************************************************
Calculate power of two of a given value.
 
index: Value to calculate power of two
 
returns: Power of two of the given value
*******************************************************************/
long getPattern(byte value)
{
return (long)1 << value;
}
 



 
Anxarces
InterRegioExpress (IRE)
Beiträge: 311
Registriert am: 05.08.2006
Homepage: Link
Gleise K-Gleis
Spurweite H0, H0e, Z
Steuerung CS1 Reloaded
Stromart AC, DC, Digital


   


  • Ähnliche Themen
    Antworten
    Zugriffe
    Letzter Beitrag
Xobor Einfach ein eigenes Forum erstellen
Datenschutz