Archiv verlassen und diese Seite im Standarddesign anzeigen : Eine Byte Variable aufteilen in einzelne 8 Bits
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.
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).
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
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
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. :)
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.