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.
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