PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten bit für bit ausgeben, nur wie?



16.08.2004, 01:24
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.

BlueNature
16.08.2004, 02:00
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.



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/handbuch2.htm#Schiebeoperatoren

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:



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:



#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

RCO
16.08.2004, 10:58
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

BlueNature
16.08.2004, 11:23
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

RCO
16.08.2004, 11:28
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

BlueNature
16.08.2004, 12:00
... 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 \:D/ ...

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) :Ostern


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


Grüsse Wolfgang

RCO
16.08.2004, 12:23
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

BlueNature
16.08.2004, 12:34
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?




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:



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