www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik switch case mit assembler?


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: crazy horse (Gast)
Datum:

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

Autor: Stephan Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also 8051 stimmt schonmal ;-)
Ist ein ADuC832
mfg Markus

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christof Rieger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Philipp Sªsse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rufus T. Firefly (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Philipp Sªsse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: ...HanneS... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.