Einfache Schreibweise einer 5-Bit Wahrheitstabelle
Hallo BASCOM-Freunde ^^.
Für mein aktuelles Projekt, einer 24-Port RGB-Steuerung mit 2 Mikrocontrollern, wobei ein Controller die RGB-Steuerung UND WEITERE FUNKTIONEN übernimmt, der 2te dann nur für die Steuerung der 24 Ausgangsports zuständig ist. Zwischen beiden Controllern besteht eine permanente 5-Bit-Anbindung (sprich über 5 I/O-Pins), da mit eine Datenbus-Anbindung für diese Zwecke doch etwas aufwändig ist.
Mein Problem dabei ist die Wahrheitstabelle. Momentan ist noch nicht ganz raus, ob ich alle möglichen der 31 Wahrheitszustände auch aufbrauchen werde, aber es ist durchaus real.
Meine Frage nun ist die Folgende:
Gibt es in BASCOM eine (einfache) Möglichkeit, massiv Code einzusparen? Bei 30 geschriebenen Zeilen sind bereits gut 40% des 8KB-Speichers weg, und das ist schlecht. Das Programm selbst für jeden angesteuerten Zustand ist (noch) recht simpel und überschaubar, aber der Controller ist noch zu weitaus mehr fähig, weshalb ich den Platz später gern auch anderweitig nutzen würde.
Der Code zeigt die Wahrheitstabelle... Es müssen dabei immer ALLE Pins benannt sein, auch die inaktiven, damit es zu keinem Logikfehler kommen kann...
Code:
If Bit1 = 0 And Bit2 = 0 And Bit3 = 0 And Bit4 = 0 And Bit5 = 1 Then Programmwahl = 1 ' 00001
If Bit1 = 0 And Bit2 = 0 And Bit3 = 0 And Bit4 = 1 And Bit5 = 0 Then Programmwahl = 2 ' 00010
If Bit1 = 0 And Bit2 = 0 And Bit3 = 0 And Bit4 = 1 And Bit5 = 1 Then Programmwahl = 3 ' 00011
If Bit1 = 0 And Bit2 = 0 And Bit3 = 1 And Bit4 = 0 And Bit5 = 0 Then Programmwahl = 4 ' 00100
If Bit1 = 0 And Bit2 = 0 And Bit3 = 1 And Bit4 = 0 And Bit5 = 1 Then Programmwahl = 5 ' 00101
If Bit1 = 0 And Bit2 = 0 And Bit3 = 1 And Bit4 = 1 And Bit5 = 0 Then Programmwahl = 6 ' 00110
If Bit1 = 0 And Bit2 = 0 And Bit3 = 1 And Bit4 = 1 And Bit5 = 1 Then Programmwahl = 7 ' 00111
If Bit1 = 0 And Bit2 = 1 And Bit3 = 0 And Bit4 = 0 And Bit5 = 0 Then Programmwahl = 8 ' 01000
If Bit1 = 0 And Bit2 = 1 And Bit3 = 0 And Bit4 = 0 And Bit5 = 1 Then Programmwahl = 9 ' 01001
If Bit1 = 0 And Bit2 = 1 And Bit3 = 0 And Bit4 = 1 And Bit5 = 0 Then Programmwahl = 10 ' 01010
If Bit1 = 0 And Bit2 = 1 And Bit3 = 0 And Bit4 = 1 And Bit5 = 1 Then Programmwahl = 11 ' 01011
If Bit1 = 0 And Bit2 = 1 And Bit3 = 1 And Bit4 = 0 And Bit5 = 0 Then Programmwahl = 12 ' 01100
If Bit1 = 0 And Bit2 = 1 And Bit3 = 1 And Bit4 = 0 And Bit5 = 1 Then Programmwahl = 13 ' 01101
If Bit1 = 0 And Bit2 = 1 And Bit3 = 1 And Bit4 = 1 And Bit5 = 0 Then Programmwahl = 14 ' 01110
If Bit1 = 0 And Bit2 = 1 And Bit3 = 1 And Bit4 = 1 And Bit5 = 1 Then Programmwahl = 15 ' 01111
If Bit1 = 1 And Bit2 = 0 And Bit3 = 0 And Bit4 = 0 And Bit5 = 0 Then Programmwahl = 16 ' 10000
If Bit1 = 1 And Bit2 = 0 And Bit3 = 0 And Bit4 = 0 And Bit5 = 1 Then Programmwahl = 17 ' 10001
If Bit1 = 1 And Bit2 = 0 And Bit3 = 0 And Bit4 = 1 And Bit5 = 0 Then Programmwahl = 18 ' 10010
If Bit1 = 1 And Bit2 = 0 And Bit3 = 0 And Bit4 = 1 And Bit5 = 1 Then Programmwahl = 19 ' 10011
If Bit1 = 1 And Bit2 = 0 And Bit3 = 1 And Bit4 = 0 And Bit5 = 0 Then Programmwahl = 20 ' 10100
If Bit1 = 1 And Bit2 = 0 And Bit3 = 1 And Bit4 = 0 And Bit5 = 1 Then Programmwahl = 21 ' 10101
If Bit1 = 1 And Bit2 = 0 And Bit3 = 1 And Bit4 = 1 And Bit5 = 0 Then Programmwahl = 22 ' 10110
If Bit1 = 1 And Bit2 = 0 And Bit3 = 1 And Bit4 = 1 And Bit5 = 1 Then Programmwahl = 23 ' 10111
If Bit1 = 1 And Bit2 = 1 And Bit3 = 0 And Bit4 = 0 And Bit5 = 0 Then Programmwahl = 24 ' 11000
If Bit1 = 1 And Bit2 = 1 And Bit3 = 0 And Bit4 = 0 And Bit5 = 1 Then Programmwahl = 25 ' 11001
If Bit1 = 1 And Bit2 = 1 And Bit3 = 0 And Bit4 = 1 And Bit5 = 0 Then Programmwahl = 26 ' 11010
If Bit1 = 1 And Bit2 = 1 And Bit3 = 0 And Bit4 = 1 And Bit5 = 1 Then Programmwahl = 27 ' 11011
If Bit1 = 1 And Bit2 = 1 And Bit3 = 1 And Bit4 = 0 And Bit5 = 0 Then Programmwahl = 28 ' 11100
If Bit1 = 1 And Bit2 = 1 And Bit3 = 1 And Bit4 = 0 And Bit5 = 1 Then Programmwahl = 29 ' 11101
If Bit1 = 1 And Bit2 = 1 And Bit3 = 1 And Bit4 = 1 And Bit5 = 0 Then Programmwahl = 30 ' 11110
Zuletzt noch eine Frage:
Für das Ansteuern einer Ausgangs-Pinbank: Da ich 24 Ausgänge beschalten muss, bedeutet dies immer 3 komplette Pinbänke. Kann ich zum Ansteuern folgende Schreibweise verwenden?:
Code:
If Programmwahl = 1 then
Portb = &B10101010 : Portc = &C10101010 : Portd = &D10101010
Habe zu der oberen Schreibweise leider nicht viel gefunden, weshalb ich sicherheitshalber noch einmal nachfrage.
Danke euch.
LG - Maik
Liste der Anhänge anzeigen (Anzahl: 1)
Aaaah - jetzt hats Klick gemacht. Daaaaanke seeehr. Bin dir ein Bier schuldig ^^.
Mit Pin und Port hatte ich schon immer meine ganz kleinen schwierigkeiten, sobald ich aber direkt im Programm stecke, ist das weg. Weiß auch nicht - vermutlich der Unterschied zwischen Theorie und Praxisnähe, was im Kopf nen Schalter umlegt.
Klar, kein Thema. Es war nur ein Beispiel, nach jedem Case in der Select eine Variable zu definieren. Im späteren Programm rufe ich hingegen gleich die anschließend fertig geschriebenen Unterprogramme auf, mit "Call XYZ", also "Case &B00000101 : Call Sub Muster_5" ...und die dazu passende Call ^^.
Bislang bin ich nun gewappnet. Morgen muss ich wieder auf Montage, da habe ich dann abends Zeit zum Programmieren, wenn ich das nicht verschwitze. Ein Regal mit 24 Fächern soll in unterschiedlichen Modulen leuchten - habe dazu eigens ein 12V_10A Vorschaltgerät gekauft. Dauert aber halt noch etwas.
Vorteil: Das Programm auf dem ATMega8, welches die Farben ansteuert, ist im Großen und Ganzen schon fertig. Allerdings will ich noch ein Display und Cursortaster einbinden, plus eben die Auswahlmöglichkeit der unterschiedlichen Module.
Die Haupt-Steuerplatine für die ersten 12 Ports schaut dann so aus:
Anhang 29501
Zur Erläuterung: Die Pinbank rechts neben dem ATMega8 hat oben 4 Taster als Eingang, darunter Spannungsversorgung und Display-Ansteuerung.
Die Ausgänge des ATMega8 sind an den Hardware-PWM-Registern angeschlossen, OC1A, OC1B und OC2. Sie steuern die Farben und das Fading.
Die untersten Transistoren schalten die Spannungsversorgung und werden durch den ATMega8515 angesteuert.
Die Pinbänke links werden anschließend zur 2ten Platine gelegt, welche die letzten 12 Ports beinhaltet.
Finde das echt klasse und ärgere mich tierisch, dass ich das nicht schon viel früher mit dem Programmieren begonnen habe...
LG - Maik