Danke
die richtige Antwort ist Blink=~Blink, das gibt vom 0b11111111 den 0b00000000 und vice verse. ( Ich habe auch solche Sachen versucht, aber es funktionierte nicht richtig).
Danke
die richtige Antwort ist Blink=~Blink, das gibt vom 0b11111111 den 0b00000000 und vice verse. ( Ich habe auch solche Sachen versucht, aber es funktionierte nicht richtig).
Bin mir nicht sicher ob ich die Frage richtig verstanden habe... aber ...
Das != ergibt true oder false also 0 oder 1
aber nicht 0b00000000 oder 0b11111111
probier mal
byte Blink = 0;
for(byte i = 0; i++ ;i<10) {
Blink = Blink ^ 255; //XOR
Serial.println(Blink);
delay(10000);
}
Dann wird mit jeder Operation zwischen 0 und 255 gewechselt.
Danke Rene, in den letzten zwei Tagen habe ich vielleicht 5x alles durchgelesen, und schon der erste Wahl war korrekt:
Blink=~Blink;
Trozdem funktionierte es nicht so wie ich dachte. Jetzt plötzlich geht wie ich das erwartet habe.
Hallo Eugen
es gibt zu allen logischen Operatoren entsprechende Bitoperatoren.
Für NOT ist hier beschrieben: https://www.arduino.cc/referen…ise-operators/bitwisenot/
Diese Unterscheidung ist wichtig, da die logischen Operatoren nur Resultate von 0 oder 1 produzieren.
Gruss
René
Endlich habe ich die Lösung gefunden: Es funktioniert genau so ich wie ich will
INA - wählt den WEG aus, also die LED blinkt. (es ist nur ein Testaufbau mit 2 Portextender, denn ich bin nicht zu Hause und habe ich nur 2 mitgenommen. Also die INA Eingänge sind nur simuliert. (in die Wirklichkeit all Schalter schalten zum GND, deswegen muss ich mehrmals invertieren.
Die Eingänge INB sind die Besetzmelder (also der WEG ist fertig), und dann die LED leuchten nur.
Ausgänge sind OutA, die schalten die LEDs über 2803 und gegen 12V.
Die Variable INA,INB und OutA werden auf ARRAY umgestellt.
Liebe Freunde
ich habe ein Problem,
Wie invertiert man einen Byte?
I diesem Code ich habe den Blink Byte welcher startet mit 0xFF und be jedem Interrupt sollte auf 0x00 umschalten. Es tut auch aber schienbar nicht bitwise, sondern vom Byte bleibt nur ein Bit übrig. Das heisstbit Interrupt funktioniert alles normal, aber nachher nur ein Bit wird umgeschaltet, also von 8 LEDs nur eine blinkt.
das ist die ganze ISR Routine:
void BLINKER(){
digitalWrite(IRQLED,Blink);
Blink=!Blink
return;
}
Der IRQLED Blinkt, aber wie im Serial Port zu sehen ist, nach 0b11111111 wird der Blink Byte nur 0. (Anstelle von 0b00000000) und damit funktionieren natürlich auch die logische Operationen im Code.
Vielen Dank!
Eugen
Stell dich vor einen Bahnhof.
Erst werden die Weichen, Signale usw , also die Zugwege gestellt (blinkende LEDs). Dann irgendwann kommt ein Zug auf die Strecke, also wird besetzt. So etwas muss ich auch auf dem Display darstellen.
Es ist dann naturgemäß, das die Weichen irgendwo im Bahnhof liegen, während die Gleisbesetzmelder sind in einem zentralen Ort irgendwo im Bhf Gebäude.
In meinem Fall ist es umgekehrt, die "Weichen" sind zentral geschaltet (also von einem Schaltpult, dort bekomme ich die InputA Signale) während die "Besetzmelder" sind irgendwo in der Anlage (InputB).
Deswegen kann ich nicht so einfach die Schalter und die Rückmelder in ein Matrix schalten.
Anstelle von individuelle LEDs habe ich sogar auf einen VideoTFT Panel mit 480x272 RGB Punkten gedacht, nur die Steuerung ist für mich noch zu kompliziert.
Hallo Eugen
logisch, ich kann mir zuwenig unter Deinem Projekt vorstellen, deshalb kann ich Vorschläge machen, in der Hoffnung das Eine oder Andere hilft Dir weiter.
Die Antwort betreffs der Outputs (LED Steuerung) bin ich noch schuldig.
Auch diese Lösung könnte im Mux Betrieb, zusammen mit den Eingängen realisiert werden. Aber ich habe Dich verstanden, dies kommt für Dich nicht in Frage.
Eine für mich einfacher Lösungsansatz wäre die Benutzung eines Chips, der gleich möglichst viele Aufgaben in der Hardware erledigt. Ein solcher Chip wäre z.B: der MAX7219, mitdem man via SPI 8x8 Led's direkt bedienen kann. Eine zweite Lösung, der MAX6951, der ein schnelleres Interface und die Möglichkeit von Blinken für Segmente ermöglicht. Ob dies dann Deinen Anforderungen entspricht, müsstest Du selber heraus finden.
Beiden Lösungen ist gemeinsam, dass sie die LED's im Mux Betrieb ansteuern, ohne dass sich die Software darum kümmern muss. Die Helligkeit der LED's kann durch die Software bestimmt werden. Hier zeigen sich die Vorteile des Mux Betriebes deutlich, Da jeweils lediglich eine Reihe Led aktiviert ist, reduziert sich der Strombereich. Die Verluste werden durch die relativ kleinen Vorwiderstände der LED's verringert.
Der Chip arbeitet übrigens im "Charlieplexing" Verfahren, was die Anzahl Leitungen nochmals reduziert. 9Leitungen bedienen 8x8 Leds.
falls es jemanden interessiert, hier der Link: https://en.wikipedia.org/wiki/Charlieplexing
schönes Wochenende
Pius
Link zum Datenblatt MAX6951:
https://www.maximintegrated.co…ower-control/MAX6951.html
Hallo Pius
vielen Dank für Deine Mühe, ich kann leider die Tastaturen oder die EIngänge nicht in ein Matrix schalten, denn deren Zahl kann jederzeit ändern und ich will nicht immer mit neuer Verkabelung beschäftigen. Deswegen war meine Entscheidung für die Port Extender. Die kann man einfach erweitern (mit einem neuem Modul) und das Algorithmus bleibt erhalten.
Ich habe schon einen Testcode geschrieben für die LEDs mit je 2 Eingänge. (InputA und InputB). Die werden Byteweise vom Portextenders eingelesen und and die Ziel weitergeschickt.
In diesem Code simuliere ich nur die Blinkfuntion und die zwei Eingänge.
Es funktioniert genau so wie ich es vorstelle. Jetzt kann ich den Code für den Portscanner integrieren. n dient nur für Simulation von dem B Eingang. Die BlaueLED simuliert den Posrtscanner, also dort werde ich die Ports einlesen und bearbeiten, und die GrüneLED simuliert den Portausgang.
Hallo Eugen
Ich bin etwas faul … und wenn ich mir Deinen Entwurf ansehe und müsste ich dies realisieren, dann sehe ich die ganz vielen Verbindungen, die ich zu Löten oder zu Stecken hätte. Deshalb auch meine Frage, nach Tasten oder Schalter. Zusätzlich bedeuten viele Verbindungen auch viele Fehlerquellen, die sich beim Aufbau einschleichen könnten.
Bei solchen Aufgaben kann man sich überlegen, ob man nicht mehrere Kontroller (Arduino xx) benutzen will und die Aufgaben auf diese Weise dezentral verteilt. Ein Master System könnte so die einzelnen Slave Systeme abfragen, oder einen Mechanismus zur Verfügung stellen, dass die Slaves selbstständig aktiv werden, wenn sich etwas verändert hat.
Kümmern wir uns zuerst um die Eingänge. Tastaturen werden üblicherweise im Multiplexbetrieb aufgebaut, was die Anzahl der notwendigen Verbindungen drastisch verringert. Je mehr Tasten man benötigt, desto grösser wird die Einsparung der Verbindungen. Gleichzeitig ist die Art der Implementierung der Software, vor allem bei vielen Tasten, entscheidend. Wenn Du gedenkst, das Entprellen der Tasten in Software, mit Wartezeiten zu realisieren, dann könntest Du Dir mal die Rechnung machen, wie lange es dauert, bis Du alle Tasten abgefragt hast. Wartezeiten im Bereich von 20mS multipliziert mit den Anzahl Tasten, dann erneutes Abfragen …. Ich denke Du siehst was ich meine.
Unten ist ein kleines Beispiel einer Mux Tastatur. Das Beispielschema entstammt von einem Schulungssystem für Lehrlinge.
Meine Antwort für die LED’s sprich Ausgabe folgt noch. Aber auch dieser Teil könnte mit einer Mux Lösung realisiert werden, noch besser, man kann den Multiplexer (die Select Leitungen) sowohl für die Inputs, wie auch für die Outputs benutzen.
(hoffentlich habe ich Dich nun nicht verwirrt)
Gruss
Pius
Quelle Bild: ELOB ZLV MINT (Zuger Lehrbetriebsvereinigung) S_TEC electronics Uneträgeri
Tastatur Multiplexbetrieb
Der Mikrokontroller legt zuerst SEG_1 auf 0 und bringt damit T22 zum Leiten (Kollektor T22 führt nun 5V). Wird nun eine Taste in der untersten Reihe (TB11,TB0,TB10) gedrückt, wiederspiegelt sich dies auf den Leitungen TM1-TM3. Dieser Zustand kann nun von einem Eingangs Port des uC abgefragt werden. Im nächsten Schritt wird SEG_1 wieder deaktiviert (auf 1) und SEG_2 auf 0 gelegt. Nun können die Tasten in der zweit untersten Reihe (TB1-TB3) an den Pins TM1-TM3 abgefragt werden.
Diese Vorgehensweise wiederholt man für jede SEG_x Reihe.
Basierend auf diesem Prinzip lassen sich mit sehr wenigen Leitungen eine hohe Anzahl Tasten auslesen.
Werden beispielsweise 8 Outputs (für SEG_) verwendet und 8 Inputs (TM1-TM8) lassen sich damit bereits 64 (8x8) Tasten abfragen.
8-Bit als Input ergibt ein Byte. Damit kann man mit etwas Bitmanipulation schnell entsprechende numerische Tastencodes erzeugen:
Im eingelesenen Byte entsprechen die einzelnen Bits einer Taste, der gescannten Zeile. Werden in der Zeile mehrere Tasten betätigt, ergibt sich ein Zahlenbereich 0- 255 (0 keine Taste gedrückt). Die Operation zum Tastencode ist lediglich ein shift nach links, um die Anzahl Bits.
1. Zeile Input * 1 ergibt die Werte 0x00-0x00FF shift left 0
2. Zeile Input * 8 ergibt die Werte 0x00-0x0800 shift left 3
3. Zeile Input *16 ergibt die Werte 0x00-0x1000 shift left 4
4. Zeile Input *32 ergibt die Werte 0x00-0x2000 shift left 5
usw.
Bei Multiplexbetrieb muss man aber immer mit berücksichtigen, dass man die Tasten entprellen muss und in diesem Zusammenhang ist es etwas einfacher, wenn man mehrere Eingangsleitungen benützt (z.B: weil man damit die Aufgabe des Entprellen gleich für 8 Tasten gleichzeitig erledigt.
Zusätzlich kombiniert man das Multiplexverfahren mit der Ansteuerung von LED Zeilen, das die Trägheit unserer Augen ausnutzt.
Eine gute detaillierte Beschreibung der Thematik findet man hier:
Hallo Pius
Alle Eingänge sind entweder schon logische 0 oder 5 V. oder optisch gekoppelte Schalter. Die Signale sind schon in einer kleineren Anlage auf eine Fläche von 3-4 m2. Also dort muss ist die Eingangs-Extender verteilen. Viele Signale sind im Kontrolpult, aber einige Rückkoplungen sind direkt in der nähe von Motors. (einfache Schalter). Alle diese Signale gehen auf einen Displaypanel (etwa 2-3 m lange Kabel), wo die LEDs die Anlagezustände signalisieren .
Ja, ich habe schon die bestückte Platinen und habe noch ULN2803 Verstärkerplatinen entworfen und bestellt. die sollen bald kommen. Falls Interesse sind die Platinen beim PCBWay zu haben.
Ich habe auch die optische Eingangsplatinen (immer 8 Bit).
Vielen Dank für Deine Hilfe
Eugen
Morgen Eugen
ich bin heute den ganzen Tag unterwegs, meine Antwort braucht noch etwas Zeit. Aber vorab mal vielen Dank für die Zeichnung, die mir mehr Klarheit bringt.
Hast Du an den Eingängen mehrheitlich Schalter oder Taster?
Wie weit enfernt von einander sind die Einheiten?
Entwirfts Du Platinen oder stöpselst Du fertige Baugruppen zusammen, oder realisierst Du es in Fädeltechnik (Lochrasterplatine)?
Betreibst Du das in einer verstörten Umgebung (Du hast von Motoren gesprochen)?
Dies könnte alles Einfluss auf das Design haben.
ich wünsche einen schönen Tag
Pius
Hallo Pius
Danke für Deine Antwort.
Ja ich habesehr viele logische Eingäge, die gleich weitergeleitet werden sollen zu den LEDs. Die Aufgabe ist eigentlich kabel zu sparen, also auf dem LED Panel muss ich die logische Eingänge anzeigen. Ich will nicht etwa 100 adrigen Kabel ziehen sondern über I2C die Anlage mit dem Display verbinden. Ursprünglich wollte ich nur die Eingänge einfach 1:1 anzeigen. Unten ist schon ein Code welche 8 Eingänge an 8 Ausgängen schickt und funktioniert.
Später kam der Wunsch bei etwa 32 LEDs muss ich zwei Status anzeigen ( ursprünglich wollte ich zweifarbige LEDs verwenden, aber das braucht noch mehr Ports). Deswegen ist jetzt so, das ich eine LED auswähle mit einem A Eingang, dann soll es anfangen zu blinken. Wenn die entsprechende Mechanik den anderen Endpunkt erreicht, es wird mit den B Eingang umschalten, und die LED soll aufhören zu blinken.
Es geht teilweise um mechanische Bewegungen, also mit einem Schalter startet den Motor ( blinkt die LED). Der Motor auf dem anderen Endpunkt schickt ein Signal B, also wurde umgestellt. Das sollen die 32 LEDs anzeigen.
Das soll nur für 32 Ports gelten.
Der Rest ist nur einfache Weiterleitung, also wenn Eingang High ist, der Ausgang soll auch High sein und umgekehrt.
Ich überlege noch immer wie ich die PCF Module paaren soll. 16 PORT auf beiden Seiten wäre auch eine Möglichkeit.
Den Blinker werde ich wahrscheinlich mit einem 0,5 Hz Interrupt erledigen, welche den C Variablen jeden 0,5 sec umschaltet.Disply Block.sch.pdf
Guten Abend Eugen
ich habe mich noch nicht in Details Deiner Idee eingelesen, weiss nur, dass Du viele Input's hat, die dann entsprechende Ausgänge, an denen LED's angeschlossen sind. Die Eingänge werden vemutlich mit einem logisches Signal versorgt. Sind es Tasten oder Schalter, die Du abfragen musst?
Wenn die Änderungen an den Eingängen nicht häufig und vor allem nicht kanz kurze Pegelwechsel beinhalten, dann würde sich eine gemultiplexter Eingang eignen. Damit würdest Du sehr viele Input Pins einsparen. Dasselbe kann man vielleicht auch an den Ausgängen benutzen.
Aber wie gesagt, ich wiess noch zu wenig. Vielleicht hast Du ja bereits ein Schema oder eine Zeichnung?
schönen Abend
Pius
Langsam reift die genaue Aufgabe und auch die notwendige HW Lösung.
Auf der Eingangseite sind 2 verschiedene Gruppen.
Die 1. Gruppe:
8 bit Extender doppelt, das heisst, jeder Eingang hat 2 bits A und B.
Wenn der A Bit gesetzt ist, eine LED auf dem Ausgang soll blinken.
Wenn der zweite Eingangsbit B ist auch gesetzt die LED auf dem Ausgang soll normal leuchten.
Also:
Wenn A=1. OP1 blinkt. (OP1 = Ausgangport 1.)
Wenn A1=1 und B1=1 OP1 =1.
Das nächste Problem ist auf dem Ausgang, dort sind ausschliesslich 16 bit Ports im Einsatz.
In boolean: interne C = blinker Signal.
An&(Bn|C)=OPn. Die Kondition auf Bitebene.
Die 2. Gruppe ist einfacher, jeder Ausgang hat nur einen 1 Bit Eingang, also wenn der Eingang Hoch ist, die LED auf dem Ausgang soll leuchten.
An=OPn
Zusammen sind es 32 LEDs von der erste Gruppe, und 48 oder 64 LEDs von der zweite Gruppe.
Ich weiß noch nicht ganz genau wie ich die eingelese einzeln Bytes strukturiere für den 2 Byte Ausgänge (pro Adresse).
Ich brauche dazu also auch ein Round Robin Algoritmus, alle Byte by Byte die Eingänge einlesen auswerten und auf Ausgänge schicken. Bitweise sind die Ein und Ausgänge gepaart, also Bit n auf dem Eingang entspricht dem Bit n auf dem Ausgang.
Also zusammen werde ich 24 Port Extenders haben, 16 Stk 8 bit Extenders und 8 Stk 16 Bit Extenders auf dem Ausgang.
Was sagt ihr dazu?
Hallo Rene
danke für Deine Mühe. es ist nicht dringend, ich werde mich auch bemühen etwas sinnvolles aus zu denken.
Ich habe eine Idee. Die eingelesene Bytes probiere ich ziwschen speichern und dann vom diesem Speicher für die Ausgangsmodule auslesen.
Aber mehr weiß ich noch nicht.
Liebe Grüße
Eugen
Hallo Eugen
Ich habe mir einige Module mit dem PCF8575 besorgt, aber noch nichts damit gemacht. Sobald ich Zeit habe, werde ich mir das anschauen. Dein Code könnte da schon eine gute Grundlage sein.
Gruss
René
Hallo René
ich habe schon etwas funktionierendes gebaut.
Die Aufgabe ist: Ich habe bis etwa 72 Eingänge, und jeder Eingang soll irgendwo ein LED oder eine Gruppe von LEDs ein oder ausschalten:
Ich habe genug PCF8574 (8Bit) und PCF8575(16Bit) Modulen. Die sind noch nicht alle eingebaut deswegen der Kod ist noch nicht fertig. Ich versuche die Aufgabe mit Arrays zu lösen:
Es funktioniert in diesem Form, die 16 Bit Module habe ich noch nicht probiert, ich überlege noch wie könnte ich alle kombinieren. Im einfachsten Fall kann ein 16 Bit Eingangsmodul zu einem 16Bit Ausgangsmodul anbinden, aber natürlich wäre es besser zum Beispiel von zwei 8 Bit Eingänge, einen 16 Bit Ausgangsmodul anzusprechen.
In Array vorläufig die Module paarweise angesprochen, also der Zeiger (pointer) sucht die Adresse vom RDEV und die Adresse von WDEV,
Ich muss noch überlegen wie kann ich die 16 Bit Module im Kod einfügen
(dort habe ich zwei Lesezeilen
Wire.requestFrom(RDEV[i], 2);
d=Wire.Read();
d2=Wire.Read();
Also wäre optimal wenn das System es automatisch erkennen würde.
Vielen Dank
Eugen
Hallo René
Vielen Dank, das habe ich schon gefunden, nur damals war die Arduino Sprache ziemlich unbekannt für mich und fehlte komplett die Routine.
Seitdem habe ich schon etwas gelernt....