-         

Ergebnis 1 bis 10 von 10

Thema: Eine Byte Variable aufteilen in einzelne 8 Bits

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    17.10.2009
    Beiträge
    62

    Eine Byte Variable aufteilen in einzelne 8 Bits

    Anzeige

    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/

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    10.03.2005
    Ort
    Schifferstadt
    Alter
    35
    Beiträge
    318
    Zitat Zitat von NXTman Beitrag anzeigen
    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
    ...::: AVRFreak :::...

  3. #3
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Zitat Zitat von NXTman Beitrag anzeigen
    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.
    Grüße
    Thomas

  4. #4
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    27
    Beiträge
    3.517
    Blog-Einträge
    9
    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

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    17.10.2009
    Beiträge
    62
    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.

    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
    Die Errors sind diese:

    Klicke auf die Grafik für eine größere Ansicht

Name:	1DxvH.png
Hits:	41
Größe:	4,3 KB
ID:	24077


    Error Nr. 1 ist hier:
    Code:
    Bild(0) = Bits(0 , 7)
    Error Nr. 2 ist hier:
    Code:
    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...
    Geändert von NXTman (21.12.2012 um 16:30 Uhr)
    Meine Website: http://nxtman.net/

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Searcher
    Registriert seit
    07.06.2009
    Ort
    NRW
    Beiträge
    1.410
    Blog-Einträge
    101
    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
    Hoffentlich liegt das Ziel auch am Weg
    ..................................................................Der Weg zu einigen meiner Konstruktionen

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    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.

  8. #8
    Moderator Robotik Visionär Avatar von radbruch
    Registriert seit
    27.12.2006
    Ort
    Stuttgart
    Alter
    54
    Beiträge
    5.781
    Blog-Einträge
    8
    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:
    http://www.roboternetz.de/community/...ent-ansteuern?

    Gruß

    mic

    Atmel’s products are not intended, authorized, or warranted for use
    as components in applications intended to support or sustain life!

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    17.10.2009
    Beiträge
    62
    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:

    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
    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?
    Geändert von NXTman (21.12.2012 um 18:36 Uhr)
    Meine Website: http://nxtman.net/

  10. #10
    Erfahrener Benutzer Roboter Experte Avatar von Thomas E.
    Registriert seit
    29.12.2011
    Beiträge
    638
    Zitat Zitat von NXTman Beitrag anzeigen
    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.
    Grüße
    Thomas

Ähnliche Themen

  1. 3 String Werte in eine Byte-Variable bekommen.....
    Von mull im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 13.03.2008, 12:23
  2. Wertebereich in eine Byte- Variable legen
    Von Muddel im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 11.07.2006, 22:50
  3. Eine Variable in einem Bereich in ein Byte schreiben/lesen
    Von Kaiser-F im Forum C - Programmierung (GCC u.a.)
    Antworten: 19
    Letzter Beitrag: 22.06.2006, 12:39
  4. einzelne Bits in Byte-Variablen aendern
    Von feldmueller im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 02.05.2006, 18:31
  5. Auf einzelne Bits in einem Byte zugreifen?
    Von MarkusLudwig im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 25.02.2006, 19:21

Berechtigungen

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