PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitfolge in einer Variablen speichern



Duesentrieb
04.08.2013, 08:50
Hallo,

wie kann ich einzelne Bits als Serie zusammen fassen um mir eine einzelauswertung bei Statusänderung zu ersparen?

Hier ein Beispiel:

16 Tatster sthen als Variable zur verfügung:
Dim Taster(16) as Bit

Nun möchte ich eine Zusammenfassung erstellen in der alle Bits hintereinander dargestellt werden. Das soll dann so aussehen:
Status_Taster = 1111001100000001

Danach soll die Prüfung und Ausgabe erfolgen:
if Status_Tasteralt = Status_Taster then
else
Status_Tasteralt = Status_Taster
Print Status_Taster
End If

Ich dachte ich könnte sie über ein & verbinden (Status_Taster = Taster(1) & Taster(2) & .....). Leider geht das so nicht.
Weis jemand einen Weg?

Rone
04.08.2013, 09:12
Hallo!

Es gibt in Bascom keine Bit-Variablen. Wenn Du ein Array(16) anlegst, sind das 16 BYTE! In jedem Byte wird dann 1 BIT benutzt.
Dim Taster As Word ---Word hat passenderweise 16Bit

MfG

radbruch
04.08.2013, 09:28
Hallo

So vielleicht:


Dim Status_tasteralt As Word , Status_taster As Word

Status_tasteralt = 0

Do

Status_taster = 0

'Taster schalten Portpin gegen GND, 0 bedeutet "Taster betätigt"
If Pinc.0 = 0 Then Set Status_taster.0
If Pinc.1 = 0 Then Set Status_taster.1
If Pinc.2 = 0 Then Set Status_taster.6
If Pinc.3 = 0 Then Set Status_taster.7

If Pind.0 = 0 Then Set Status_taster.8
If Pind.1 = 0 Then Set Status_taster.9
If Pind.2 = 0 Then Set Status_taster.14
If Pind.3 = 0 Then Set Status_taster.15

If Status_tasteralt <> Status_taster Then
Status_tasteralt = Status_taster
Print Status_taster
End If

Loop
End

Gruß

mic

P.S.: Alternative Ausgabe:

Print bin(Status_taster)

Duesentrieb
04.08.2013, 10:46
Hallo und Danke für eure Hinweise bzw. Hilfen.
Dann werde ich mich mal nach einer anderen Lösung umsehen

Sauerbruch
04.08.2013, 14:27
Es gibt in Bascom (http://www.rn-wissen.de/index.php/Bascom) keine Bit-Variablen.

Das ist nicht ganz richtig, wie den Bascom Language-Fundamentals zu entnehmen ist:


Data Types
Every variable in BASCOM has a data type that determines what can be stored in the variable. The next section summarizes the elementary data types.

Elementary Data Types


Bit (1/8 byte). A bit can hold only the value 0 or 1. A group of 8 bits is called a byte.






Byte (1 byte). Bytes are stores as unsigned 8-bit binary numbers ranging in value from 0 to 255.






Integer (two bytes). Integers are stored as signed sixteen-bit binary numbers ranging in value from -32,768 to +32,767.



(usw...)

Die Lösung von Radbruch zum Erfassen des aktuellen Taster-Status hat (mit Verlaub) den Fallstrick, dass zu der If-Abfrage in diesem Fall auch eine Else-Anweisung gehört:
Wenn z.B. PINC.0 Low ist, wird zwar das Bit status_taster.0 auf 1 gesetzt. Ist der Eingang aber irgendwann wieder High, wird die If-Anweisung einfach übersprungen, aber das Bit bleibt gesetzt! Man müsste es also mindestens mal so schreiben:




If PINC.0 = 0 then status_taster.0 = 1 else status_taster.0 = 0
If PINC.1 = 0 then status_taster.1 = 1 else status_taster.1 = 0
...


Einfacher wäre es natürlich so:



status_taster.0 = NOT PINC.0
status_taster.1 = NOT PINC.1
...


Und noch einfacher wäre es, wenn die 16 Taster an zwei "ganzen" Ports liegen (also z.B. PINC.0 - PINC.7 und PIND.0 - PIND.7):



Dim status_taster as Word

status_taster = PINC
shift status_taster, left, 8
status_taster = status_taster + PIND



Dann werde ich mich mal nach einer anderen Lösung umsehen

Vielleicht sind das ja ein paar Denkanstöße :-)

radbruch
04.08.2013, 15:18
Die Lösung von Radbruch zum Erfassen des aktuellen Taster-Status hat (mit Verlaub) den Fallstrick, dass zu der If-Abfrage in diesem Fall auch eine Else-Anweisung gehört:Das ersetzt die else-Zweige:

Status_taster = 0

Sauerbruch
04.08.2013, 15:49
Das ersetzt die else-Zweige:

Status_taster = 0

Okay - 1:0 für Dich... :-)

Rone
04.08.2013, 16:38
@Sauerbruch

dort wird nur erklärt welche Daten-Typen es gibt
Dim A As Bit >>>>>1BYTE ist weg

MfG

for_ro
04.08.2013, 18:16
Dim A As Bit >>>>>1BYTE ist weg

Hallo Rone,
das liegt halt daran, dass der Speicher in Bytes organisiert ist und hat nichts mit Bascom zu tun.
Der Compiler merkt sich aber, dass von dem benutzten Byte noch 7 Bit frei sind. Kommt dann ein
Dim B As Bit
wird das zweite Bit desselben Bytes verwendet.

Rone
06.08.2013, 00:50
Hallo for_ro,
kann Dir voll und ganz zustimmen. Hätte es nur selber ausprobieren müssen.
Danke nochmal für die Richtigstellung.

MfG