Forum: Mikrocontroller und Digitale Elektronik switch case mit assembler?


von Markus (Gast)


Lesenswert?

Wollte mal fragen ob es ne Art Switch Case Anweisung auf Assembler gibt.
Muss nämlich zwischen 35 verschiedenen Eingangskombinationen entscheiden
können. Und mit cjne jedesmal kriegt man ja nen halben Kilometer Source
noch dazu ist es total unübersichtlich.
mfg Markus

von thkais (Gast)


Lesenswert?

Das kann man in Assembler wunderbar mit einer Sprungtabelle lösen.
Allerdings ist die Ausführung abhängig vom Prozessortyp, den ich nun
leider nicht erraten kann...
Es gibt zu dieser Frage auch schon einige Antworten hier im Forum - die
Such-Funktion hilft hier weiter.

von crazy horse (Gast)


Lesenswert?

Das schnellste ist "jmp @A+DPTR".
DPTR mit Anfangsadresse einer Sprungtabelle laden, die switch-Variable
nach A, fertig.
Heist natürlich im schlimmsten Fall, eine Tabelle mit 256
Sprungvektoren  (wobei die meisten natürlich zur default-Routine
zeigen) zu basteln, sollte man also vorher eingrenzen.

von crazy horse (Gast)


Lesenswert?

@thkais: er hats doch verschlüsselt gesagt - cjne kenn ich nur vom 8051.

von Stephan Müller (Gast)


Lesenswert?

mir fällt nur das hier ein:

mov eax, WERT
cmp eax, 1
jz  case1
cmp eax, 2
jz  case2
cmp eax, 3
jz  case3
jmp ende

case1: ...
jmp ende
case2: ...
jmp ende
case3: ...
jmp ende
...

ende: ...

so spontan ;)
is auch ganz übersichtlich finde ich..
du kannst die case routinen auch gleich oben beim vergleich reinpacken,
nur dann wirds erst recht unübersichtlich ..
vor allem musst du dann aufpassen, was du mit was überhaupt
vergleichst, ev. helfen dann push pop anweisungen..

mfg
Stephan

von Markus (Gast)


Lesenswert?

Also 8051 stimmt schonmal ;-)
Ist ein ADuC832
mfg Markus

von Peter D. (peda)


Lesenswert?

Einfache Version für A = 0..127:

add a, acc
mov dptr, #switchtab1
jmp @a+dptr

switchtab1:
ajmp case0
ajmp case1
...
ajmp case127


Peter

von Christof Rieger (Gast)


Lesenswert?

ggf. kannst du a noch eins oder zweimal nach links rotieren und erhällst
so Platz für zwei oder vier Befehle in deiner Tabelle.
Wenn dir drei Befehle für dein Case-Bearbeitung genügen kannst du dir
so die switchtab1: mit den ajmp case n sparen.

von Philipp Sªsse (Gast)


Lesenswert?

Wenn die 35 Fälle nicht brav von null bis 34 liegen, sondern im
Extremfall von null bis 255 verstreut, lohnt sich eine Tabelle mit
jeweils Indexwert und Adresse.

Dann werden der Reihe nach die Indexwerte geladen und mit dem
switch-Wert verglichen, bis er paßt. Beim passenden wird dann die
zugehörige Adresse geladen und indirekt angesprungen. Braucht einen
Bruchteil des Platzes mit minimaler Performanceeinbuße.

(Sorry, kein Code mangels 8051-Assembler-Kenntnissen)

von Markus (Gast)


Lesenswert?

Erstmal Danke für die ganzen Antworten! Ich glaub ich habe vergessen was
zu erwähnen oder verstehe euch falsch. Wie ich das lese geht ihr davon
aus, dass der MC 1 Byte empfängt und das die 35 verschiedenen
Kombinationen beinhaltet. Dem ist aber nicht so. Es wird ein komplettes
Datenwort in der Form $E35% geschickt. Das $ sagt dem MC dass ein Befehl
kommt, das % zeigt das Ende an.Also nicht weiter wichtig für meine
Frage. An erster Stelle kann ein E für Einzelwandlung oder ein K für
kontinuierliches Wandeln stehn (2 Möglichkeiten) an der dritten Stelle
können die zu Wandelnden Kanäle stehen 1-3 (3 Möglichkeiten)und an der
vierten Stelle wird mit 1-7 gesagt in welchen Zeitabständen der MC
wandeln und verschicken soll (7 Möglichkeiten). Multipliziere ich alle
Möglichkeiten miteinander (2x3x7) komme ich auf 42Möglichkeiten. So war
das gemeint. Und das mit der Sprungtabelle funktioniert ja nur wenn ich
nur eine Variable habe. Korrigiert mich falls ich falsch liege.
Ich suche etwas um dies hier zu realisieren:

case Wort =>"E35"   :  =>wandlung=1
case Wort =>"E26"   :  =>wandlung=2
   ......

Das Beispiel hat jetzt keinerlei Sinn oder beinhaltet tiefgründigere
Gedanken ;-)

Über weitere Tipps wäre ich sehr dankbar
mfg Markus

von Rufus T. Firefly (Gast)


Lesenswert?

Welcher Prozessor mag Stringbearbeitungsfunktionen als Assemblerbefehler
integriert haben?

Du solltest Deine Steuerwörter mit einem simplen Algorithmus in einen
einzelnen numerische Werte umwandeln und ab da mit der Sprungtabelle
weitermachen ...

sowas in der Art wie
wenn E dann Wert = 0
wenn K dann Wert = 100

Wert += zu wandelnde Kanäle * 10

Wert += Zeit

E35 wird so zu 35
K17 wird so zu 117

Alles klar?

von Philipp Sªsse (Gast)


Lesenswert?

Dann lieber direkt in einen kompakten Tabellenzeiger wandeln:

lade zweiten Char     ;da haben wir jetzt '1', '2' oder '3'
dec
and 3                 ;jetzt ist es 0, 1 oder 2
swap nibbles          ;macht $00, $10 oder $20

wenn 1. Char = 'E'
  or $08

den 3. Char mit and $07 mit obigem verodern

Schon haben wir den String in ein Byte von null bis 47 verwandelt. Also
brauchen wir nur eine Tabelle mit 48 Adreßeinträgen, aus der wir über
dieses Byte indirekt laden und diese Adresse wird dann angesprungen.

Allerdings: dabei gehen wir davon aus, daß es keine Übertragungsfehler
oder falsche Syntax gibt. Bei einem unsinnigen String würde das
Programm wild irgendwohin springen!

von ...HanneS... (Gast)


Lesenswert?

Kannst du nicht die 3 Kriterien getrennt (nacheinander) auswerten?

Das eine stellt den Messmodus (Wandlungsart) ein,
das andere den Quellkanal,
das dritte stellt den Timer, wann gemessen werden soll.

So hast du für jedes Kriterium eine einfache Auswertung.

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.