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?
Meine Website: http://nxtman.net/
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.
Grüße
Thomas
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).
Schaut ruhig mal auf meiner Homepage vorbei:
http://kampis-elektroecke.de
Oder folge mir auf Google+:
Daniel Kampert
Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.
Gruß
Daniel
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.
Die Errors sind diese:Code:$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
Error Nr. 1 ist hier:
Code:Bild(0) = Bits(0 , 7)Error Nr. 3 hat keinen BezugError Nr. 2 ist hier:
Code:Led(i) = Bild(i).i
Gruß nxtman
Edit:
Error Nr. 2 Hat sich erledigt. Codestelle falsch!
Edit 2:
Errors haben sich komplett erledigt. Code aktualisiert. Funktioniert aber trozdem nicht...
Geändert von NXTman (21.12.2012 um 16:30 Uhr)
Meine Website: http://nxtman.net/
Was nicht?Funktioniert aber trozdem 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
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
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.
Hallo
So ähnlich schätze ich das auch ein.Ich halte es daher nicht für lohnend, dir zu helfen, deinen jetzigen Ansatz lauffähig zu machen.
Ist das ein Zufall:
https://www.roboternetz.de/community...ent-ansteuern?
Gruß
mic
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
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:
Zeigt genau das, was sie zeigen soll.Code:$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
Gruß nxtman
#####Edit####
Frage: Kann ich in Bascom eine Schleife machen, die ungefähr eine Sekunde läuft?
Geändert von NXTman (21.12.2012 um 18:36 Uhr)
Meine Website: http://nxtman.net/
Lesezeichen