Forum: Analoge Elektronik und Schaltungstechnik 11 Transistoren mit dem Arduino ansteuern


von Blumerika (Gast)


Lesenswert?

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ß :)

von Michael B. (laberkopp)


Lesenswert?

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.

von Thomas G. (Gast)


Lesenswert?

ich würde zwei Shifter in serie nehmen.

https://www.arduino.cc/en/Tutorial/ShiftOut
Example 2

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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.

von Georg (Gast)


Lesenswert?

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

von Blumerika (Gast)


Lesenswert?

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

von Route_66 H. (route_66)


Lesenswert?

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.

von Dietrich L. (dietrichl)


Lesenswert?

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

von Georg (Gast)


Lesenswert?

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

von Michael B. (laberkopp)


Lesenswert?

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.

von Amateur (Gast)


Lesenswert?

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.

von M.N. (Gast)


Lesenswert?

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.

von M.N. (Gast)


Lesenswert?

Ups, fehlt natürlich noch
1
wert = wert - 2^n

in der positiven if-Abfrage.

von Dussel (Gast)


Lesenswert?

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.

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

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.

von Frank (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.