Hallo, wie im Titel bereits steht, möchte ich 11 Transistoren mit meinem Arduino Uno ansteuern. Prinzipiell wären ja 2^11 verschiedene Zustände Möglich. Davon itneressieren mich jedoch nur etwa 100. Ich dachte zuerst, ein KV-Diagramm zu füttern, und daraus eine Gleichung zu formen, welche ich im Arduino IDE implementiere. Leider finde ich kein Programm, welches mit sovielen Variablen umgehen kann. Gibt es hierfür eine einfacherere Lösung? Muss ja. Anwendungsfall ist eine Widerstandsdekade. Vielen Dank und Gruß :)
Ein Arduino Uno hat 14 digital I/O Pins, also kein Problem, 11 Transistoren direkt anzusteuern. Ob es sinnvoll ist, Widerstandsdekaden mit Transistoren anzusteuern, die eher einen Massebezug sehen wollen, sei dahingestellt, Analogschalter klingen passender, aber du hast dir das sicher gut überlegt und andere Lösungen nachgeschlagen und verstanden.
Ein Programm zur Optimierung eines CPLD oder FPGA sollte mit 11 Bit zurechtkommen, also z.B. Quartus von Altera (Intel). Es minimiert aber wahrscheinlich speziell für die Hardware des ausgewählten CPLD, nicht auf das Minimum. Die 2048 Zustände passen aber auch noch auf ein "Karopapier" 32*64 Kästchen, etwas mehr als DIN A4.
Christoph K. schrieb: > Die 2048 Zustände passen aber auch noch auf ein "Karopapier" Auf einen Arduino passen sie garantiert auch. Die Frage ist bloss, was steht in der Tabelle drin? Georg
Die Anzahl der Ports reicht ja, wie bereits laberkopp geschrieben hat, aus. Es geht mir darum, dass ich Funktion der Digitaltechnik vereinfachen möchte. Bis zu 4 Variablen geht das ja noch per Hand, ab da wirds dann aber schon sehr zeitaufwendig. Für 11 variablen unmöglich. Daher fällt das Karopapier auch raus. Klar, könnte ich alle 2048 Zustände in den arduino Code schreiben, das wäre allerdings nicht wirklich fachmännisch in meinen Augen. Und um diese 100 Zustände mit einem 100fachen Switch-case anzusteuern, ist auch die frage :D
Blumerika schrieb: > Es geht mir darum, dass ich Funktion der Digitaltechnik vereinfachen > möchte. Bis zu 4 Variablen geht das ja noch per Hand, ab da wirds dann > aber schon sehr zeitaufwendig. Für 11 variablen unmöglich. Blumerika schrieb: > Und um diese 100 Zustände mit einem 100fachen Switch-case anzusteuern, > ist auch die frage :D Erkläre doch bitte mal Dein Problem. Du hast dich ganz sicher in irgend einer Gedanken-Sackgasse verlaufen.
Blumerika schrieb: > Und um diese 100 Zustände mit einem 100fachen Switch-case anzusteuern, > ist auch die frage :D Wie wäre es mit einer 16Bit-Array mit den 100 Einträgen? Da stehen dann die 11-Bit-Kombinationen drin. Je nachdem was Du machen willst, kannst Du - mit dem Array-Index die zugehörigen 11 Bit auslesen - mit den 11 Bit die Liste durchsuchen, um den Index zu finden. Gruß Dietrich
Blumerika schrieb: > Und um diese 100 Zustände mit einem 100fachen Switch-case anzusteuern, > ist auch die frage Keine Frage. Das liest man einfach aus der Tabelle aus. Du redest aber bisher nur von 11 Ausgängen - aber wovon sollen diese denn abhängig sein? Bei z.B. 10 Eingangsvariablen und 11 Ausgangsvariablen ist eine 10 x 11 Tabelle die allgemeinste Lösung, es ist ja nicht gesagt dass es überhaupt logische Zusammenhänge gibt, die eine Vereinfachung zulassen. Und eine einfache Lösung ist es auch - Tabelle schreiben und fertig. Deine 100 switch-Anweisungen werden durch einen einzigen Befehl ersetzt: Ausgangsvektor = Tabelle [Eingangsvektor]; Da fehlen nicht nur Erklärungen, was das ganze soll, sondern zuerst mal die einfachsten Programmiergrundlagen. Georg
Blumerika schrieb: > Klar, könnte ich alle 2048 Zustände in den arduino Code schreiben, das > wäre allerdings nicht wirklich fachmännisch in meinen Augen. > Und um diese 100 Zustände mit einem 100fachen Switch-case anzusteuern, > ist auch die frage :D Möglicherweise ist die Zuordnung ja nicht rein zufällig, sondern unterliegt logischen Gedanken. Dann könnte man die Logik als Programm nachbilden, das wäre sicher wesentlich schlauer.
Die Ausgänge sind Intern als Ports organisiert. Diese wiederum "hören" auf Bytes die in den Port geschrieben werden. Das Prinzip, das dahinter steht, folgt der booleschen Algebra.
Komm drauf an, wie disjunkt diese 100 Zustände sind? Wenn sie gar keine gemeinsamen Zustände haben, dann kann auch das beste Minimierungs-Programm nichts machen. Wenn du einen numerischen Widerstandswert als Bitmuster für dein Widerstandsnetzwerk umrechnen willst, hilft das "iterative durch 2-Teilen" Pseudocode
1 | wert = eingabewert // 0 ... 4095 |
2 | bits = 11 |
3 | |
4 | for n = bits to 0 |
5 | {
|
6 | if (wert / 2^n >= 1) |
7 | {
|
8 | port(n) = 1 |
9 | } |
10 | else |
11 | {
|
12 | port(n) = 0 |
13 | } |
14 | n = n-1 |
15 | } |
In anderen Fällen macht man eine Look-Up-Table, z.B. für Segment-Anzeigen oder Character-ROM für ASCII-Zeichen. Also, alles halb so wild.
Ups, fehlt natürlich noch
1 | wert = wert - 2^n |
in der positiven if-Abfrage.
Eine Tabelle wäre da wahrscheinlich das Sinnvollste. Für die elf Transistoren braucht man jeweils zwei Byte, wenn man nicht tricksen will. Das sind dann für 100 Zustände 200 Byte, also selbst für einen kleinen Mikrocontroller nicht viel. Elf Ausgänge zu berechnen, halte ich für deutlich aufwändiger.
Die Frage war nach einem KV-Diagramm für 2048 Zustände, wenn ich das richtig verstehe. 100 davon sind definiert, der Rest "don't care", also frei wählbar. Dann füllt man diese Kästchen so, dass möglichst große Bereiche zusammenfassbar werden, um wenige Minterme zu erhalten.
Blumerika schrieb: > Es geht mir darum, dass ich Funktion der Digitaltechnik vereinfachen > möchte. Bis zu 4 Variablen geht das ja noch per Hand, ab da wirds dann > aber schon sehr zeitaufwendig. Für 11 variablen unmöglich. Daher fällt > das Karopapier auch raus. > Klar, könnte ich alle 2048 Zustände in den arduino Code schreiben, das > wäre allerdings nicht wirklich fachmännisch in meinen Augen. braucht man auch nicht, Du brauchst nur Deine 100 Zustände, da frägst Du dann die 11 Werte der Transistoren ab und dann schaltest Du entsprechend dem Wert die Ausgaberegister. Fertig. > Und um diese 100 Zustände mit einem 100fachen Switch-case anzusteuern, > ist auch die frage :D Ja das ist auch nicht gut. Da macht man eine indizierte Datenabfrage. ca. so hab es nicht im Compiler getestet: static const int transistors = { 0b11111000001, 0b11111000011, 0b11111000101, ... ,}; int get_transistors(int nValue) { return transistors[nValue]; } extreme schnell, speicherplatzsparend und simple
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.