- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 8 von 8

Thema: Daten bit für bit ausgeben, nur wie?

  1. #1
    Gast

    Daten bit für bit ausgeben, nur wie?

    Anzeige

    E-Bike
    hallo,
    hab ein kleines problem. Möchte mit der C-Control Daten an einem Port (zB. Port 1) Bit-weise rausgeben, was noch kein problem ist. Zusätzlich möchte ich aber noch ein Clock-Signal an einem anderen Port (zB. Port 2) ausgeben und das soll für die Zeit anstehen wie das Bit am Port 1.
    also ein beispiel: ausgegeben soll die bitfolge 0100 0001 (ASCII code für A)

    define daten port[1]
    define clock port[2]

    daten=0
    pulse clock

    daten=1
    pulse clock

    daten=0
    pulse clock

    daten=0
    pulse clock
    .
    .
    .
    .

    so ist das eine Variante. Ich bin damit aber nicht flexibel. Wenn ich jetzt mit der Methode ein paar Werte überwache die sich ändern, wirds etwas aufwendig. Wie kann ich nun die Routine für jeden Buchstaben und jede Zahl der C-Control von vornherein sagen, so das im Program nur gesagt wird, gebe einen bestimmten Wert aus. Das Program geht dann automatisch zu den Routinen die vorher den Buchstaben/Zahlen zugewiesen wurden und macht dann die serielle Ausgabe der Daten und am anderen Port das Clock-Signal.

    Ich hoffe das ich mein Problem in einer verständlichen Form beschreiben konnte und das mir hier jemand helfen kann. Bin auch für andere Lösungen offen.

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.08.2004
    Ort
    Stuttgart
    Alter
    49
    Beiträge
    851
    Hallo Gast!

    Das mit dem Byte mit Clock und Bitweise senden ist eigentlich recht einfach. Man baut sich eine Zählschleife auf die das Byte roliert und bei jedem Schritt eben das niederste Bit ausgibt.

    Code:
    Define Daten    Port[1]
    Define Clock    Port[2]
    Define ii       Byte[1]
    Define SendVal  Byte[2]
    
      Clock = Off
      Data = Off
    
    #MainProg
      SendVal = 65
      GoSub PutVal
      Pause 50
      SendVal = 66
      GoSub PutVal
      Pause 50
      SendVal = 67
      GoSub PutVal
      Pause 50
      GoTo MainProg
    
    #PutVal
      For ii = 1 To 8
        If (SendVal And &H01) = &H01 Then Daten = On Else Daten = Off
        Pulse Clock
        SendVal = SendVal Shr 1
      Next ii
      Return
    Das sendet nun im Sekundentakt die seriellen Daten von 'A' Pause 'B' Pause 'C' Pause ... bis Reset gedrückt wird.

    Wegen dem Shr, das ist ein Shift-Befehl rechts um ein Bit. Siehe auch meine Seite: http://www.wieselsworld-online.de/ha...iebeoperatoren

    Damit kannst du dein Schieberegister extern mit Daten laden und parallel ausgeben. Ob negative oder positive Flanke ist gleichgültig wegen dem Pulse-Befehl. Die meisten Schieberegister reagieren sowiso auf die fallende Flanke mit der Datenübernahme. Wenn das noch gesetzt werden muss, dann ist der Code abzuändern mit Strobe:

    Code:
    Define Daten    Port[1]
    Define Clock    Port[2]
    Define Strobe   Port[3]
    Define ii       Byte[1]
    Define SendVal  Byte[2]
    
      Clock = Off
      Data = Off
      Strobe = Off
    
    #MainProg
      SendVal = 65
      GoSub PutVal
      Pause 50
      SendVal = 66
      GoSub PutVal
      Pause 50
      SendVal = 67
      GoSub PutVal
      Pause 50
      GoTo MainProg
    
    #PutVal
      For ii = 1 To 8
        If (SendVal And &H01) = &H01 Then Daten = On Else Daten = Off
        Pulse Clock
        SendVal = SendVal Shr 1
      Next ii
      Pulse Strobe
      Return

    Wenn du Zeit hast probier mal folgende Änderung im Code aus ob das auch funktioniert:

    Code:
    #PutVal
      For ii = 1 To 8
        Daten = ((SendVal And &H01) = &H01)
        Pulse Clock
        SendVal = SendVal Shr 1
      Next ii
      Return
    Ich weis nicht ob das CC-Basic packt mit der Compilierung. Probiers einfach mal, ich hab jetzt keine Lust das extra auszuprobieren.

    Grüsse Wolfgang

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Wie heißen die passendes Befehle, wenn ich immer in einer Variablen, z.B. einem Byre nur das erste, oder nur das 3. Bit austauschen, oder setzen bzw auslesen möchte?

    Und wie heißen die Schieberegister befehle, um z.B. um eins nach rechts, 2 nach links...

    MFg Moritz

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.08.2004
    Ort
    Stuttgart
    Alter
    49
    Beiträge
    851
    Hallo RCO

    Wie heißen die passendes Befehle, wenn ich immer in einer Variablen, z.B. einem Byre nur das erste, oder nur das 3. Bit austauschen, oder setzen bzw auslesen möchte?
    Wie wäre es mit

    Define Eingang Port[1]
    Define EinzelBit Bit[5]
    Define GanzesByte Byte[1]

    'Bit 5 im Byte von Port holen und im Byte ersetzen
    GanzesByte = &B10101010
    EinzelBit = Eingang
    Print GanzesByte

    'Bit 5 löschen
    GanzesByte = &B10101010
    EinzelBit = On
    Print GanzesByte

    'Bit 5 löschen
    GanzesByte = &B10111010
    EinzelBit = Off
    Print GanzesByte

    Einfach nicht?

    Und wie heißen die Schieberegister befehle, um z.B. um eins nach rechts, 2 nach links...
    Wert = Wert Shl 1
    Wert = Wert Shl 2

    Grüsse Wolfgang

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Ja, danke aber wenn man mehrere Varaiblen verwendete, wird das mit dem Einzlenen Bit aufwendig, vor allem wenn man von 5 oder 6 Verschiedenen Variablen immer verschiedene Bits auslesen möchte.

    MFg Moritz

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.08.2004
    Ort
    Stuttgart
    Alter
    49
    Beiträge
    851
    ... aber wenn man mehrere Varaiblen verwendete, wird das mit dem Einzlenen Bit aufwendig, vor allem wenn man von 5 oder 6 Verschiedenen Variablen immer verschiedene Bits auslesen möchte.
    OK, dann eben mit der harten Methode


    Bit 5 setzen:
    ByteWert = ByteWert Or &B00010000

    Bit 5 löschen:
    ByteWert = ByteWert And &B11101111

    Bit 5 umkehren:
    ByteWert = ByteWert Nor &B00010000


    Das geht auch noch bissche übler \/ ...

    Bit 5 bis 8 setzen:
    ByteWert = ByteWert Or &B11110000

    Bit 5 bis 8 löschen:
    ByteWert = ByteWert And &B00001111

    Bit 5 und 8 umkehren:
    ByteWert = ByteWert Xor &B10010000


    Das ganze mal in Kombination:


    Bit 1 und 3 setzen und Bit 2 löschen:
    ByteWert = (ByteWert Or &B00000101) And &B11111101

    Klammer weil And vor Or in der Rangordnung der Operanden ist, sonst würde zuerst &B00000101 mit &B11111101 Und-Verknüpft werden und dann das Resultet mit ByteWert Oder-Verknüpft werden und das wäre sicher falsch. Aber das steht alles im Handbuch der C-Control.

    Diese Binärwerte sind deine Maske die Bit für Bit das ganze Byte lang verknüpft wird mit dem entsprechenden Operanden (And / Or / Nor / Nand / Xor)

    Das kann man jetzt aber nicht nur auf Bytewerte (8-Bit) anwenden sondern auch auf Word-Werte (16-Bit)


    Unteres Byte des Words löschen ( Bit 1-8 ):
    WordWert = WordWert And &HFF00


    Grüsse Wolfgang

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Danke, ich gleub das reicht erstmal, aber jetzt kappier ich mal nen par mehr Quelltexte, hab diese ganzen Kombinationen schon nen parmal gelesen und konnte mir nciht viel daraus erschließen.

    Ich wollte nämlich Daten über RC5 übertragen, die haben aber nur 5 Adress und 6 Datenbits, also muss ich ADress auf 3 verkürzen, und 2 Bits klauen um Die Adresse von 6 mit 2 Adressbits auf 8 zu verlänger, deshalb das ganze setzen und lesen.

    Wie würde ich denn das Auslesen der letzten 2 Bits einer Variablen am sinnvollsten machen?

    Und dieses C-control Handbuch, ist das MSR?
    Das ist nämlich nicht unter 20 Wuro u kriegen, oder doch?

    Danke für die ausfühliche Antwort!

    MFg Moritz

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    02.08.2004
    Ort
    Stuttgart
    Alter
    49
    Beiträge
    851
    Hallo RCO!

    Ich habe gar keine Bücher über C-Control oder Programmierung. Mache das aus dem Kopf. Kann dir also keinen Buchtip geben.

    Aber wegen deinem Problem

    Wie würde ich denn das Auslesen der letzten 2 Bits einer Variablen am sinnvollsten machen?
    Code:
    Define DieVariable Byte[10]
    
      If (DieVariable And &H80) = &H80 then GoTo Bit8Gesetzt
      If (DieVariable And &H40) = &H40 then GoTo Bit7Gesetzt
      ...
    
    #Bit7Gesetzt
      ...
    
    #Bit8Gesetzt
      ...
    Oder du schiebst sie dir nach links auf die billigeren Plätze 1 und 2:

    Code:
    Define DieVariable Byte[10]
    Define DieBits Byte[11]
    
      DieVariable = DieVariable And &HC0
      DieBits = DieVariable Shr 6
    Jetzt sind die Bits 7 und 8 von DieVariable in den Bits 1 und 2 verschoben von DieBits.

    Also: DieVariable:8 => DieBits:2
    und DieVariable:7 => DieBits:1

    Grüsse Wolfgang

Benutzer, die dieses Thema gelesen haben: 0

Derzeit gibt es keine Benutzer zum Anzeigen.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen