ein Stringvariable aus einem bit

mat-sche

Neues Mitglied
22. Apr. 2008
12
0
1
Sprachen
Hallo Forenjaner,

ich habe ein Byte, in dem ich einzelne Bits ändere. Die Information ob das Bit 1 oder 0 ist benötige ich dann als ein String. Wie mache ich das am einfachsten?

Dim Pcf8574_1_sram As Byte

Wa_rabatten Alias Pcf8574_1_sram.0 ' Beregnung Rabatte zu Steffen
Wa_rasen_hinten Alias Pcf8574_1_sram.1
Wa_rasen_vorn Alias Pcf8574_1_sram.2
Wa_gew_haus Alias Pcf8574_1_sram.3
Wa_rondel Alias Pcf8574_1_sram.4
Licht_mitte_vorn Alias Pcf8574_1_sram.5
Licht_mitte_hinten Alias Pcf8574_1_sram.6
Licht_brunnen Alias Pcf8574_1_sram.7

Ich nuzte zum schalten einiger Relais einen PCF. Dieser kann aber nur Byteweise angesprochen werden, deshalb die Aufteilung des Byte in einzelne Bits.
Dann wollte ich über:
Str(pcf8574_1_sram.1) mir das Bit in einen String wandeln, geht das überhaupt so? Der Compailer meckert jedenfalls nicht.

Könnt Ihr mir irgendwie weiterhelfen?

Grüße MAT
 
Sortier mal nochmal Deine Gedanken...
Wo brauchst Du einen String, und wozu?



CodeBox BascomAVR
Dim Pcf8574_1_sram As Byte
reserviert irgendwo im Arbeitsspeicher (SRAM - aber das hat nichts mit dem SRAM im Namen zu tun) ein Byte, Bascom referenziert die konkrete Speicheradresse durch den verwendeten Namen.


CodeBox BascomAVR
Wa_rabatten Alias Pcf8574_1_sram.0 ' Beregnung Rabatte zu Steffen
Wa_rasen_hinten Alias Pcf8574_1_sram.1
Wa_rasen_vorn Alias Pcf8574_1_sram.2
Wa_gew_haus Alias Pcf8574_1_sram.3
Wa_rondel Alias Pcf8574_1_sram.4
Licht_mitte_vorn Alias Pcf8574_1_sram.5
Licht_mitte_hinten Alias Pcf8574_1_sram.6
Licht_brunnen Alias Pcf8574_1_sram.7
Hier erzeugst Du quasi acht einzelne Bitvariablen, aber nicht irgendwo im SRAM, sondern auf den konkret angegebenen Bits (im vorher angelegten Byte) - Diese neuen Variablen sind nur andere Namen für dieselben Bits.
Jedesmal wenn Du "Wa-rondel" lesen läßt, wird in Wirklichkeit Bit4 von Pcf8574_1_sram gelesen; jedesmal wenn Du das Bit schreibst, wird das Bit im Byte geschrieben.

Weist Du dem Byte 'ne 42 zu, sind "Wa_rasen_hinten", "Wa_gew_haus" und "Licht_mitte_vorn" gesetzt, und alle anderen aus.

Änderungen des Bytes bzw der einzelnen Bits betreffen aber nur das Byte im SRAM, klar?
Wenn der Portexpander diese Änderung realisieren soll, mußt Du das Byte (als ganzes -> byteweise) aus dem SRAM in den Portexpander übertragen.
Sofern ich mich recht erinner, ist das ein I²C-Portexpander, als muß Dein Controller das via I²C übertragen.

Wo sind jetzt Deine Strings?
 
Hi LotadaC,

vielen Dank für Deine Antwort!
==>> Sortier mal nochmal Deine Gedanken... "
Die sind schon klar und geordnet:hmmmm::) .

Das alles was Du kommentierst ist schon richtig und auch so von mir gewollt.

==>> Wo sind jetzt Deine Strings? "

Und genau die versuche ich mir zu erstellen. Ein Bit kann ja bekanntlich die Info über 0 oder 1 enthalten. Diese Information von dem Bit benötige ich als einen String.
* Bit: "Wa-rondel" = 1 und jetzt brauche ich eine Möglichkeit die in einen String zu convertieren... ==>> str("Wa-rondel") vllt?
 
Achso, hat also nicht mehr wirklich was mit den Portexpandern zu tun...
STR() ist eine Funktion, die einen String zurückliefert, der der ASCII-Darstellung der übermittelten Variable antspricht.
Genauer gesagt mußt Du STR(Parameter) irgendeinem String zuweisen, die Funktion generiert dann aus dem Parameter die entsprechenden ASCIIs, und legt die in der zugewiesenen Variable ab (geht auch mit Print Str(Parameter), da wird's quasi dem Transmit-Buffer zugewiesen Auf der anderen seite erledigt Print aber auch nötige Konversionen selbst, Print Bytevariable.Bit packt ebenso die "1" oder "0" in den Transmit-Buffer).
In der Online-Hilfe steht jetzt nicht explizites zu Bit-Variablen (und das ist ja der ALIAS bei Dir) - ich würde Trotzdem vermuten, daß da dann ASCII-48 ("0") bzw ASCII-49 ("1") zurückgegeben werden.

Interessant für Dich möglicherweise auch bin(), falls Du mal ein ganzes Byte in Binärdarstellung ausgeben lassen willst (hatte ich letztens gebraucht)
 
Zuletzt bearbeitet:
==>>
In der Online-Hilfe steht jetzt nicht explizites zu Bit-Variablen (und das ist ja der ALIAS bei Dir) - ich würde Trotzdem vermuten, daß da dann ASCII-48 ("0") bzw ASCII-49 ("1") zurückgegeben werden. <<==

Genau darum geht es, bin schon mit Print daran meinen Fehler zu finden, habe nun alles mal so gemacht:

Print #2 , "Str(pcf8574_2_sram.0)" ' Gartenpumpe
Print #2 , Str(pcf8574_1_sram.2)
Print #2 , Str(pcf8574_1_sram.1)
Print #2 , Str(pcf8574_1_sram.4)
Print #2 , Str(pcf8574_1_sram.0)
Print #2 , Str(pcf8574_1_sram.3)
zur Info,
ich baue mir eine Steuerung, mit der ich einzelne Relais über den PCF schalten möchte. Da der PCF, wie schon erwähnt, aber leider nur alles in einem Byte als Übertragung möchte, muss ich in dem Byte die einzellnen Bits verändern und dann das ganze Byte übertragen, nach dem ein einzellnes Bit verändert wurde.

dann brauche ich für eine weitere Verarbeitung die Information zu dem Bit, ob es 1 oder 0 ist. Für die weitere Verarbeitung brauche ich die Info jedoch als eine Stringvariable.
 
Auf der anderen seite erledigt Print aber auch nötige Konversionen selbst
You do not need to convert a variable into a string before you print it.
When you use PRINT var, then you will get the same result as when you convert the numeric variable into a string, and print that string.
The PRINT routine will convert the numeric variable into a string before it gets printed to the serial port.
 
Print #2 , "Str(pcf8574_2_sram.0)" ' Gartenpumpe
Print #2 , Str(pcf8574_1_sram.2)
Print #2 , Str(pcf8574_1_sram.1)
Print #2 , Str(pcf8574_1_sram.4)
Print #2 , Str(pcf8574_1_sram.0)
Print #2 , Str(pcf8574_1_sram.3)
Benutz mal bitte die Bascom-Code-Tags...


CodeBox BascomAVR
Print #2 , "Str(pcf8574_2_sram.0)" ' Gartenpumpe
Print #2 , Str(pcf8574_1_sram.2)
Print #2 , Str(pcf8574_1_sram.1)
Print #2 , Str(pcf8574_1_sram.4)
Print #2 , Str(pcf8574_1_sram.0)
Print #2 , Str(pcf8574_1_sram.3)

wie gesagt, Print macht das selbst, und Print kommt auch mit der Bascom-Bit-Darstellung klar...
also etwa so: print "Brunnenlicht=";Str(licht_brunnen) ("licht_brunnen" ist ja der Alias auf das Bit)
 
Sooooo.... Gedanken geordnet und fehler gesehen aber noch nicht behoben in der Matrix :)
Die Wandlung eines Bits in einen String geht wie ich es annahm und so jetzt nutze.
Nur mal so für die Nachwelt :)

Grüße und Dank ins Forum!
 
also etwa so: print "Brunnenlicht=";Str(licht_brunnen) ("licht_brunnen" ist ja der Alias auf das Bit)
Quatsch, also es sollte natürlich so gehen, aber Print konvertiert wenn nötig selbst, also wennschon dennschon...
print "Brunnenlicht=" ; licht_brunnen

Print ist auf das "Drucken" von Strings ausgelegt, und nimmt nötige Konvertierungen selbst vor.
Soll also ein Byte (oder auch mehrere) selbst über den UART ausgegeben werden (und nicht der/die ASCII), ist Printbin zu verwenden.
 

Ü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)