Forum: Mikrocontroller und Digitale Elektronik [BASCOM] "IF" Abfrage "verkürzen" mit mehreren Definitionen


von Denis I. (prytek)


Lesenswert?

Guten Abend

Ich habe ein Problem mit einer einfachen IF Abfrage:

Ich habe ein "Byte" an Zahlen, welche ich in 4 IF-Abfragen auswerten 
möchte.

z.B. die Zahlen 1, 5, 9, 13, 17, .... usw..

Für einen Zahlenwert von 255 wären das in einer Viertelung mindestens 63 
Werte.

Ich möchte jetzt aber nicht 63 IF-Abfragen machen, sondern die vier 
Zahlenstränge in je einer Abfrage unterbringen.

Derzeit war DAS mein letzter Versuch:
1
If Rotary =(1 | 5| 9 | 13 | 17 | 21 | 25 | 29 | 33 | 37 | 41 | 45 | 49 | 53 | 57| ...) Then
2
...
3
End If
Ich habe es mit Kommata versucht und diversen anderen 
Trennmöglichkeiten.


Entweder sehe ich den "Wald" derzeit nicht mehr, oder ich habe ein 
Syntax Problem....


Kann mir bitte einer helfen bei dem Problem?

Danke und Grüße

von Marc H. (marchorby)


Lesenswert?

Select Case Rotary

  Case 1 : Print "1"

  Case 2 : Print "2"

  Case 3 To 5 : Print "3-5"

  Case Is >= 10 : Print ">= 10"

  Case Else : Print "Not in Case statement"

End Select

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Bascom bietet dafür das select case -Statement.

Das aber ist gar nicht nötig; Dich interessiert der MOD -Operator 
(modulo).

http://avrhelp.mcselec.com/index.html?mod.htm

von google (Gast)


Lesenswert?

Was soll nach der IF-Abfrage kommen? Anders gefragt, was willst Du 
erreichen?

von Karl M. (Gast)


Lesenswert?

1
if ((Rotary and 0b11) = 0b01) then
2
else
3
endif

von Denis I. (prytek)


Lesenswert?

Danke für diese schnellen Antworten!

Nach der Abfrage, also dem "Then" wird einfach ein Pin auf H gesetzt.


Ich lese mich jetzt mal in die Case bzw. Mod Befehl ein.

Vlt. fällt einem noch was anderes ein :)

Danke

: Bearbeitet durch User
von MWS (Gast)


Lesenswert?

Denis I. schrieb:
> Vlt. fällt einem noch was anderes ein :)

Das war bereits der optimale Einfall, solange die Reihe einer Regel 
gehorcht, hier durch 4 teilbar und Rest immer 1.

Wär's nicht so, so könnte man eine Reihe "Data"-Anweisungen nehmen und 
per Schleife alles durchprobieren. Aber viel zuviel Aufwand, wenn's 
durch Modulo zu lösen ist.

von Paul B. (paul_baumann)


Lesenswert?

Versuche es mal mit Select-Käse, äh Case

Dim Eingabe As Byte
Input "Gib einen Wert ein! (0-255) " , Eingabe

Select Case Eingabe

 Case 0 To 63 :    Print "Liegt zwischen 0 und 63"
 Case 64 To 127 :  Print "Liegt zwischen 64 und 127"
 Case 128 To 192 : Print "Liegt zwischen 128 und 192"
 Case 193 To 255 : Print "Liegt zwischen 192 und 255"
 Case Else :       Print "Eingabe war Käse!"

End Select

Print "MfG Paul"

Edith sagt: So schnell kann ich nicht tippen...

: Bearbeitet durch User
von Denis I. (prytek)


Lesenswert?

Ich habe mich gerade auf Lookup() eingeschossen.

So wie es aussieht bekomme ich es aber nicht in eine "IF" Abfrage rein.

Mein Gedanke war:

gedankenspielan
Wenn "Rotary" einen Wert entspricht der in "Lookup(taba , A1l)" Tabelle 
zu finden ist, dann schalte ggf. PIN XY auf H.
gedankenspielaus

Also ungefähr so:
1
If Rotary = Lookup(taba , A1l) Then
2
...
3
End If
4
5
A1l:
6
Data 1 , 5 , 9 , 13 , 17 , ...

"Taba" habe ich als Byte bestimmt.

Ich habe insgesamt ja 4 DATA Tabellen, mit je unterschiedlichen Werten 
der 255, welche in vier "IF" Abfragen ausgewertet werden sollen.

Die vorangeführte Tabelle und diese 3:

B1l:
Data 2 , 6 , 10 , 14 , 18 , ...

A2l:
Data 3 , 7 , 11 , 15 , 19 , ...

B2l:
Data 4 , 8 , 12 , 16 , 20 , ...


Wo ist mein Fehler?

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Denis I. schrieb:
> Ich habe mich gerade auf Lookup() eingeschossen.

Das erscheint mir unnötig umständlich.

Wenn ich es recht verstanden habe, möchtest Du folgendes erreichen:

- für die Werte 0, 4, 8, 12, 16 etc. bis 252
  soll Funktion A aufgerufen werden

- für die Werte 1, 5, 9, 13, 17 etc. bis 253
  soll Funktion B aufgerufen werden

- für die Werte 2, 6, 10, 14, 18 etc. bis 254
  soll Funktion C aufgerufen werden

- für die Werte 3, 7, 11, 15, 19 etc. bis 255
  soll Funktion D aufgerufen werden


Dann wird Dein Code mit MOD (Modulo) recht überschaubar:
1
DIM Wert AS BYTE
2
DIM Eingedampft AS BYTE
3
4
...
5
6
Eingedampft = Wert MOD 4
7
8
SELECT CASE Eingedampft
9
10
  CASE 0 : CALL Funktion_A
11
12
  CASE 1 : CALL Funktion_B
13
14
  CASE 2 : CALL Funktion_C
15
16
  CASE 3 : CALL Funktion_D
17
18
END SELECT

von Kurt B. (kurt-b)


Lesenswert?

Rufus Τ. F. schrieb:

>
> Eingedampft = Wert MOD 4
>

Vill liegst am (nicht)Verstehen vom MOD 4

 Kurt

von Denis I. (prytek)


Lesenswert?

1
$regfile = "attiny2313.dat"
2
$crystal = 8000000
3
4
Config Portb.2 = Output
5
Config Portb.3 = Output
6
Config Portb.4 = Output
7
Config Portb.5 = Output
8
9
A1 Alias Portb.2
10
B1 Alias Portb.3
11
A2 Alias Portb.4
12
B2 Alias Portb.5
13
14
Dim Rotary As Byte                                          'der wird in 255 Schritten übergeben von anderer Stelle
15
Dim Machwas As Byte
16
17
Declare Sub Funktion_a()
18
Declare Sub Funktion_b()
19
Declare Sub Funktion_c()
20
Declare Sub Funktion_d()
21
22
Do
23
24
   Machwas = Rotary Mod 4
25
26
If Machwas = 0 Then
27
      Call Funktion_a
28
   Elseif Machwas = 1 Then
29
      Call Funktion_b
30
   Elseif Machwas = 2 Then
31
      Call Funktion_c
32
   Elseif Machwas = 3 Then
33
      Call Funktion_d
34
   End If
35
Loop
36
End
37
38
39
40
Funktion_a:
41
A2 = 0
42
B1 = 0
43
B2 = 0
44
A1 = 1
45
Return
46
47
Funktion_b:
48
A2 = 0
49
B2 = 0
50
A1 = 0
51
B1 = 1
52
Return
53
54
Funktion_c:
55
B2 = 0
56
A1 = 0
57
B1 = 0
58
A2 = 1
59
Return
60
61
Funktion_d:
62
A1 = 0
63
B1 = 0
64
A2 = 0
65
B2 = 1
66
Return

@ Kurt:

Ja das kann sein, aber habe inzwischen eine kleine Ahnung was Mod macht.


Ich habe jetzt einen Dummy Code eingefügt mit den hier besprochenen 
Parametern.

Nur mir wird gerade nicht klar wie der Code im richtigen Syntax zusammen 
gebracht wird.
Ich sitze anscheinend schon zu lange heute vor dem PC...


*Was ich verstanden habe:*

"Modu" macht bei einem "4" Zahlenwerte von 0 bis 3 aus dem "Rotary".
Damit rufe ich dann meine Unterprogramme auf und springe danach wieder 
zurück.

Die "Call Case" Funktion wird in der Hauptschleife ausgeführt.
Ähnlich wie Gosub XY?

Der Schlauch auf dem ich gerade stehe ist groß..... Mist

EDIT:

Der Code macht jetzt das was ich möchte bzw. nur jeden 4ten Wert macht 
er das..., aber ich kann mir doch nicht Modu zusammen reimen.

Kann mir das bitte einer erklären?
Aus der Bascom hilfe werde ich nicht ganz schlau draus....

: Bearbeitet durch User
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.