PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eine Byte Variable aufteilen in einzelne 8 Bits



NXTman
20.12.2012, 22:23
Hallo,
Ich habe eine Byte Variable (bild) diese ist mit 8 Bits gefüllt also:

Dim bild as byte
bild = 01000000

wie kann ich diese Variable jetzt aufsplitten bzw. die einzelnen Bits auslesen?

also z.B.:
Bit 2 aus bild = 1
Bit 3 aus bild = 0

geht das irgendwie?

BlaueLed
20.12.2012, 22:34
Hallo,
Ich habe eine Byte Variable (bild) diese ist mit 8 Bits gefüllt also:

Dim bild as byte
bild = 01000000

wie kann ich diese Variable jetzt aufsplitten bzw. die einzelnen Bits auslesen?

also z.B.:
Bit 2 aus bild = 1
Bit 3 aus bild = 0

geht das irgendwie?

Hi,

probiers mal mit:

Bit8 = bild.7
Bit7 = bild.6
Bit6 = bild.5

usw.

Gruß Kay

Thomas E.
21.12.2012, 01:16
Dim bild as byte
bild = 01000000

Das crasht mit Sicherheit, denn die Zahl 1000000 passt nicht in eine Byte-Variable. Ich nehme an, du willst eine Binärzahl reinscheiben - das geht dann so: bild = &b01000000

Der Zugriff auf einzelne Bits erfolgt so, wie es "BlaueLed" beschrieben hat. Wenn du die Varable als Binärzahl ausdrucken willst, kann ich dir nur den Befehl "BIN" ans Herz legen. Dieser kann nämlich einen String daraus erstellen (einfach mal in die Hilfedatei gucken).

EDIT: Mit den Befehlen "BITS" und "NBITS" geht eine Manipulation von einzelnen Bits in einer Variable noch komfortabler.

Kampi
21.12.2012, 14:57
Hey,

alternativ kannst du einzelne Bits auch per Shift "raus" shiften. Du machst dafür eine Kopie deiner Variable und dann shiftest du die um z.B. 7 Stellen. Damit hast du dann das 8. Bit an Position 1 von der Kopie.
Beispiel:

Bild = 1111 0000
Bild1 = Bild

Damit ist Bild1 = 1111 0000
Und anschließend

Shift Bild1 , 7 , Right

Dann sieht Bild1 so aus:

Bild1 = 0000 0001

(Ist ungetestet und somit nicht auf Korrektheit der Syntax überprüft).

NXTman
21.12.2012, 16:13
Also, ich habe jetzt mein Programm geschrieben. Es ist zur Ansteuerung einer LED-Matrix.
Ich würde mich sehr freuen, wenn ihr mal drüberschauen könntet.
Es gibt ein paar Errors, die ich mir nicht erklären kann.



$regfile = "m8def.dat"
$crystal = 1000000

Config Portb = Output
Config Portd = Output

Spalte Alias Portd
Zeile Alias Portb

Declare Sub Leer()
Declare Sub Zeichnen()

Dim Bild1 As Byte
Dim Bild2 As Byte
Dim Bild3 As Byte
Dim Bild4 As Byte
Dim Bild5 As Byte
Dim Bild6 As Byte
Dim Bild7 As Byte
Dim Bild8 As Byte
Dim Led1 As Bit
Dim Led2 As Bit
Dim Led3 As Bit
Dim Led4 As Bit
Dim Led5 As Bit
Dim Led6 As Bit
Dim Led7 As Bit
Dim Led8 As Bit

Dim Zeit As Integer

Do

Select Case Zeit

Case 640 : 'Bild1

Bild1 = Bits(0 , 7) 'Im ersten Schritt wird das Bild gesetzt
Bild2 = Bits(1 , 7)
Bild3 = Bits(2 , 7)
Bild4 = Bits(3 , 7)
Bild5 = Bits(4 , 7)
Bild6 = Bits(5 , 7)
Bild7 = Bits(6 , 7)
Bild8 = Bits(7)


Call Zeichnen() 'Das bild Zeichnen
Call Leer() 'Und die Bildfäche wieder leeren

Case 1280 : 'Bild2

Call Zeichnen()
Call Leer()

Case 1920 : 'Bild3

Call Zeichnen()
Call Leer()

Case 2560 : 'Bild4

Call Zeichnen()
Call Leer()

Case 3200 : 'Bild5

Call Zeichnen()
Call Leer()

Case 3840 : 'Bild6

Call Zeichnen()
Call Leer()

Case 4480 : 'Bild7

Call Zeichnen()
Call Leer()

Case 5120 : 'Bild8

Call Zeichnen()
Call Leer()

Case 5760 : 'Bild9

Call Zeichnen()
Call Leer()

Case 6400 : 'Bild10

Call Zeichnen()
Call Leer()

Case 7040 : 'Bild11

Call Zeichnen()
Call Leer()

Case 7680 : 'Bild12

Call Zeichnen()
Call Leer()

Case 8320 : 'Bild13

Call Zeichnen()
Call Leer()

Case 8960 : 'Bild14

Call Zeichnen()
Call Leer()

Case 9600 : 'Bild15

Call Zeichnen()
Call Leer()

Case 10240 : 'Bild16

Call Zeichnen()
Call Leer()

Case 10880 : 'Bild17

Call Zeichnen()
Call Leer()

Case 11520 : 'Bild18

Call Zeichnen()
Call Leer()

Case 12160 : 'Bild19

Call Zeichnen()
Call Leer()

Case 12800 : 'Bild20

Call Zeichnen()
Call Leer()

Case 13440 : 'Bild21

Call Zeichnen()
Call Leer()

Case 14080 : 'Bild22

Call Zeichnen()
Call Leer()

Case 14720 : 'Bild23

Call Zeichnen()
Call Leer()

Case 15360 : 'Bild24

Call Zeichnen()
Call Leer()

Case 16000 : 'Bild25

Call Zeichnen()
Call Leer() 'bis hier sollte eine Sekunde vergangen sein, da: Nach jeder gesetzten LED macht er 10 mikrosekunden pause. (64 * 10)*25

Zeit = 0

End Select

Zeit = Zeit + 1

Loop

'&B10000000 = &H80
'&B01000000 = &H40
'&B00100000 = &H20
'&B00010000 = &H10
'&B00001000 = &H8
'&B00000100 = &H4
'&B00000010 = &H2
'&B00000001 = &H1


Sub Zeichnen()

Dim I As Integer

'Zeile
Led1 = Bild1.0
Led2 = Bild2.1
Led3 = Bild3.2
Led4 = Bild4.3
Led5 = Bild5.4
Led6 = Bild6.5
Led7 = Bild7.6
Led8 = Bild8.7

Zeile.1 = 1

Spalte.0 = Led1
Waitus 625
Reset Spalte.0

Spalte.1 = Led2
Waitus 625
Reset Spalte.1

Spalte.2 = Led3
Waitus 625
Reset Spalte.2

Spalte.3 = Led4
Waitus 625
Reset Spalte.3

Spalte.4 = Led5
Waitus 625
Reset Spalte.4

Spalte.5 = Led6
Waitus 625
Reset Spalte.5

Spalte.6 = Led7
Waitus 625
Reset Spalte.5

Spalte.7 = Led8
Waitus 625
Reset Spalte.7


End Sub

Sub Leer()

Reset Bild1
Reset Bild2
Reset Bild3
Reset Bild4
Reset Bild5
Reset Bild6
Reset Bild7
Reset Bild8


End Sub
'end program




Die Errors sind diese:

24077

Error Nr. 1 ist hier:

Bild(0) = Bits(0 , 7)


Error Nr. 2 ist hier:

Led(i) = Bild(i).i

Error Nr. 3 hat keinen Bezug

Gruß nxtman

Edit:

Error Nr. 2 Hat sich erledigt. Codestelle falsch!

Edit 2:

Errors haben sich komplett erledigt. Code aktualisiert. Funktioniert aber trozdem nicht...

Searcher
21.12.2012, 16:44
Funktioniert aber trozdem nicht...

Was nicht?

Wollte gerade auf die Fehler eingehen:
Defaultmäßig beginnt der Index bei Arrays in Bascom mit 1. Kann man anpassen mit "CONFIG BASE". Deshalb ging
"Bild(0) = ..." nicht. Mit config base = 0 wär es gegangen. Indexe dann von 0 bis 7.

Led(i) = ... ging nicht, weil Led nicht als array definiert war. Allerdings kann man Bitarrays wohl nicht einrichten.
Man könnte DIM LED AS BYTE und dann LED.i = BILD(i).i machen.

Gruß
Searcher

for_ro
21.12.2012, 17:34
Hallo NXTman,
ich will dir ja nicht den Spaß nehmen, aber das, was du hier versuchst, ist ziemlich aussichtslos.
Entsprechend deiner Rechnung im anderen Thread gehe ich davon aus, dass du 64 LEDs eine nach der anderen einschalten willst. D.h. du hast nur eine Einschaltzeit von 1/64, wenn alles ohne Verzögerung läuft, was in deinem Programm aber eh nicht der Fall ist.
Versuche mal eine einzelne LED 10ms an- und danach 640 ms auszuschalten. Dann hast du eine Vorstellung von der zu erwartenden Helligkeit.
Weiterhin musst du dich unbedingt mit Timern beschäftigen, wenn du etwas sinnvolles hinbekommen möchtest.
Es ist effektiver, wenn du immer 8 LEDs, die möglichst an einem Port hängen, gleichzeitig einschaltest. Über den anderen Port entscheidest du dann, welche LED Reihe gemeint ist.
Hier im Forum gibt es auch schon eine Menge Beispiele, wie man eine Matrix im Multiplexverfahren schaltet.

Ich halte es daher nicht für lohnend, dir zu helfen, deinen jetzigen Ansatz lauffähig zu machen.

radbruch
21.12.2012, 18:03
Hallo


Ich halte es daher nicht für lohnend, dir zu helfen, deinen jetzigen Ansatz lauffähig zu machen. So ähnlich schätze ich das auch ein.

Ist das ein Zufall:
https://www.roboternetz.de/community/threads/55286-LED-Matrix-möglichst-effizient-ansteuern?

Gruß

mic

NXTman
21.12.2012, 18:27
Ja Radbruch ich bin der selbe, nur irgendwie versteh ichs selber nicht, egal..
Ich habe den alten code aus reinem Zufall(!) wieder gefunden, weil ich sehr ausgiebig im Forum nach ledmatrix gesucht habe gefunden.
Also das Thema, das radbruch genannt hat.

Ich habe den Code auf meine aktuelle Matrix angepasst und noch ein bisschen "optimiert".
So sieht er aus:


$regfile = "m8def.dat"
$crystal = 1000000

Config Portb = Output
Config Portd = Output

'Spalte Alias Portd
'Zeile Alias Portb

Declare Sub Zeilensetzen

Dim Bildspeicher(8) As Byte , Spalte As Byte , Temp As Byte

Bildspeicher(1) = Bits(0 , 1 , 2 , 3 , 4 , 5 , 6 , 7)
Bildspeicher(2) = Bits(0 , 1 , 7)
Bildspeicher(3) = Bits(0 , 2 , 7)
Bildspeicher(4) = Bits(0 , 3 , 7)
Bildspeicher(5) = Bits(0 , 4 , 7)
Bildspeicher(6) = Bits(0 , 5 , 7)
Bildspeicher(7) = Bits(0 , 6 , 7)
Bildspeicher(8) = Bits(0 , 1 , 2 , 3 , 4 , 5 , 6 , 7)

Spalte = 1

Do
Select Case Spalte
Case 1 : Reset Portd.7
Zeilensetzen
Set Portd.0

Case 2 : Reset Portd.0
Zeilensetzen
Set Portd.1

Case 3 : Reset Portd.1
Zeilensetzen
Set Portd.2

Case 4 : Reset Portd.2
Zeilensetzen
Set Portd.3

Case 5 : Reset Portd.3
Zeilensetzen
Set Portd.4

Case 6 : Reset Portd.4
Zeilensetzen
Set Portd.5

Case 7 : Reset Portd.5
Zeilensetzen
Set Portd.6

Case 8 : Reset Portd.6
Zeilensetzen
Set Portd.7
End Select

If Spalte <= 8 Then Spalte = Spalte + 1 Else Spalte = 1

Waitus 500

'hier kann man dann das Bild zusammenbasteln

Loop

End

Sub Zeilensetzen
Portb = Bildspeicher(spalte) And 255
End Sub

Zeigt genau das, was sie zeigen soll.

Gruß nxtman

#####Edit####

Frage: Kann ich in Bascom eine Schleife machen, die ungefähr eine Sekunde läuft?

Thomas E.
22.12.2012, 12:04
Frage: Kann ich in Bascom eine Schleife machen, die ungefähr eine Sekunde läuft?
Wait 1 erzeugt eine Schleife, die etwa eine Sekunde läuft und nichts tut. :)