Port-Abfrage und Einlesen in Variable für Select-Case-Vergleich

Dominik

Neues Mitglied
10. Okt. 2008
19
0
0
Zürich
Sprachen
  1. BascomAVR
Hallo.

Ich beginne gerade mal mit dem Kontrollerboard USB-AVR ATmega8 (myAVR). Das Heft ist für Assembler geschrieben und erklärt (ausführlich) und angeschnitten in Basic.

Ich möchte nun in Basic programmieren.

Wie kann ich die Eingänge kontrollieren und in eine Variable setzen, die dann mit SELECT-CASE die vorhandenen Eingänge vergleicht und richtig abzweigt?

Grüsse und mal schauen ob mir da jemand einen Tip geben kann...
Dominik
 

Anhänge

  • AVR-Praxis_Forumsbeitrag.jpg
    AVR-Praxis_Forumsbeitrag.jpg
    151,2 KB · Aufrufe: 32
Pseudocode:
Code:
char auswahl;
if(pin1_gesetzt){
auswahl=a;
}else if(pin2_gesetzt){
auswahl=b;
}

select (auswahl){
case a: mach was; break;
case b: mach was anders; break;
// default: break;
}

Das select/case kannste aber auch getrost weg lassen, kannst gleich mit if abfangen was passieren soll ;)

Grüße
 
Hallo BlackDevil.

Hm, somit müsste ich statt DIM EINGANG AS STRING ändern in DIM EINGANG AS CHAR damit der Status (0 (inaktiv) oder 1 (aktiv)) in die Variable EINGANG gelesen werden kann?

Würde es eben gerne ohne if-then-else machen, deshalb das Interesse mit select-case.

Dominik
 
Hallo Dominik !

So ganz verstehe ich das jetzt nicht.... :hmmmm:

Du schreibst etwas von Assembler und von C, dein Programmbeispiel ist aber in BASCOM.

Was denn nun, oder habe ich etwas übersehen? :hmmmm:


Die Aussage von BlackDevil...
Das select/case kannste aber auch getrost weg lassen, kannst gleich mit if abfangen was passieren soll
kann ich so nicht bestätigen!

Select-Case ist weit aus "mächtiger" und flexibler als das Schlichte IF-Then-Else.
Kommt eben auf den Verwendungszweck an. ;)



Wichtig wäre aber nun erst mal die Frage mit der Programmiersprache zu klären!

Gruß,
Cassio
 
select/case ist zwar mächtiger, aber vom prinzip her das gleiche. Select/case wird gerne für Zustandsautomaten oder Menüs (ein Menü ist ja im grunde ein Zustandsautomat) genommen, für die einfache Portabfrage tuts auch if/else.

Weis gar nich, kann select/case auch was anderes auser char? Ich kenns nur mit char ... if(true)=> dann braucht man eh if/else um den char zu setzen ...
 
Hallo Cassio.

Was ist denn alles in Assembler und was in C in meinem Ausschnitt im JPG?? Ich habe meiner Meinung nach nichts von C im meinem beigefügten Bild geschrieben - auch nicht in Assembler :confused: Ich habe keine Ahnung von C und von Assembler nur PORTx, PINx und DDRx.

Mein Ziel für diesen Thread:
Ich möchte nur abfragen, welche Ports/Pins usw. aktiv oder inaktiv sind (0 oder 1) und danach in eine Variable schreiben (in Bascom!). Danach diese Variable mittels den SelectCase-Fällen vergleichen.

Das ist eigentlich alles was ich wissen möchte...

Grüsse und hm, bin mal gespannt ob das überhaupt geht.. ich denke jedoch es sollte sicher möglich sein.
 
Hi Dominik,

Mein Ziel für diesen Thread:
Ich möchte nur abfragen, welche Ports/Pins usw. aktiv oder inaktiv sind (0 oder 1) und danach in eine Variable schreiben (in Bascom!). Danach diese Variable mittels den SelectCase-Fällen vergleichen.

Das ist eigentlich alles was ich wissen möchte...

Grüsse und hm, bin mal gespannt ob das überhaupt geht.. ich denke jedoch es sollte sicher möglich sein.
aber nicht auf die Art und Weise. Wie gesagt. Du gibst beim Case nur den Wert
an, der mit der Variable verglichen werden soll die bei Select steht. Das wird so
glaube ich nix. Da mußt du dir einen anderen Lösungsweg ausdenken.

Weis gar nich, kann select/case auch was anderes auser char? Ich kenns nur mit char ... if(true)=> dann braucht man eh if/else um den char zu setzen ...
Warum soll Select/Case kein Char können ? Das ist eine normale bedingte
Ausführung so wie If/Then/Else auch.

Select Case kann man ungefähr so beschreiben ...

===== Als IF/THEN/ELSIF/ELSE =====
If Eingang=1
Then ...
Elsif Eingang=5
Then ...
Elsif Eingang>2
Then ...
Elsif Eingang<8
Then ...
Else
...
EndIf

===== Als SELECT/CASE/DEFAULT =====
Select Case Eingang
Case 1
...
Case 5
...
Case >2
...
Case <8
...
CaseDefault
...
EndCase
@Dominik : Vergleich mal meine beiden Beispiele und du siehst ungefähr
wie Select/Case arbeiten. Ob es unter Bascom auch ein Default gibt weiß
ich aber nicht. Evtl heißen die Anweisungen in manchen Sprachen nicht
genau so. Aber das Prinzip ist immer identisch.

Achh ja .. Setz dein Programm bitte das nächste Mal als Code hier rein und
nicht als JPG-Bild. Sonst muß man es erst durch ein OCR laufen lassen um
Kommentare dazu schreiben zu können :rolleyes: ;)

Also das was du machst würde als If/Then ungefähr so aussehen ...
If Eingang=PinB.0 Then ...

oder

If Eingang="PinB.0" Then ...
Ich weiß nicht ob Bascom das als Character-Vergleich oder Integer-Vergleich
interpretiert was du da programmiert hast ...

Gruß
Dino
 
Hi @All,

ja, in BASCOM gibt es quasi auch einen DEFAULT. Der heißt zwar nicht DEFAULT sondern wird mit "CASE ELSE : statements" eingeleitet. Aber das ist sozusagen der Lumpensammler.

Was den Select-Case in BASCOM so sympatisch macht ist die Tatsache, dass man nicht nur an CHAR gebunden ist. Es können so gut wie alle Datentypen (Integer, Word, usw.) verwendet werden.
Weiter können Intervalle formuliert werden. Z.B. so: "CASE 2 TO 5 : statement". Sollte also die Variable 2, 3, 4 oder 5 sein so wird das statement durchgeführt.
Meiner Meinung nach bietet das deutlich mehr flexibilität und vor allem, gegenüber von IF-Anweisungen, der Code bleibt übersichtlich!

Die Hilfe zu BASCOM beschreibt sehr schön, was man damit alles machen kann!

Grüße,
Markus
 
Hallo,

Weiter können Intervalle formuliert werden. Z.B. so: "CASE 2 TO 5 : statement". Sollte also die Variable 2, 3, 4 oder 5 sein so wird das statement durchgeführt.
Meiner Meinung nach bietet das deutlich mehr flexibilität und vor allem, gegenüber von IF-Anweisungen, der Code bleibt übersichtlich!
so kenn ich das auch bei manchen Sprachen :)

Aber was "Select Case" nicht kann ist ...
Im Case eine Bedingung zu definieren die mit der Variable im Select nix zu tun hat.
Also zB so etwas ...
Code:
Select Case Eingang
Case (Ausgang==5)
 ... Tu wat ...
Case (Mittendrin==35)
 ... tu wat anderes ...
CaseEnd

Hinter dem Case muß zwingend nur ein Wert stehen, der mit dem Inhalt der
Variable beim Select verglichen wird. Mehr geht da bei keiner Sprache.
Also nix mit PinB.0 hinter dem Case ;)

Gruß
Dino
 
Ha ja,

was anderes würde ja auch wirklich keinen Sinn machen!
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)