Erkennen von einzelnen Bits

Hardware- und Elektronikbasteleien, Ansteuerung von Schnittstellen und Peripherie.
Fragen zu "Consumer"-Problemen kommen in Offtopic.
Porter
Beiträge: 1
Registriert: 16.04.2005 19:38

Erkennen von einzelnen Bits

Beitrag von Porter »

Hallo,

ich beschäftige mich hauptsächlich mit der Ansteuerung von PIO – und CTC Schaltkreisen.
Beim Umstieg von PowerBasic (MS – DOS) auf PureBasic habe ich festgestellt das es an Befehlen zur direkten Hardwareansteuerung mangelt. Dieses Problem konnte ich mit der ‚InpOut32.dll’ einwandfrei lösen. Das nächste Problem war, wenn ich ein Byte ausgelesen habe, ein einzelnes Bit zu erkennen. Um dieses zu lösen, habe ich mich entschlossen den ‚Windows Dll Salat’ zu erweitern und eine von mir so genannte ‚8bit_ident.dll’ geschrieben. Mit der Übergabe eines Byte und Aufruf einer von 8 Prozeduren gibt die Dll den Wert eines Bit zurück. Ich habe diese Dll seit ca. 5 Monaten bei vielen Steuerprogrammen ohne Probleme im Einsatz.

Die Dll muss natürlich kompiliert und ins ‚System’ Verzeichnis kopiert werden.

Für Interessenten ist hier der Quellcode der Dll und ein Testprogramm zur Darstellung der Funktion
(Testprogramm geschrieben von meinem Sohn, alias coder)

Ich würde mich über eure Kritik freuen. :wink:

Dll Quellcode:

Code: Alles auswählen

;___________________________________________________________________________
;
; rp 05.2005
;
;DLL Name : 8Bit_ident.dll 
;DLL,ermittelt den Wert der einzelnen Bit eines Byte  
; aufgerufen wird die Prozedur für das zu ermittelnde Bit (Bit0...7)
; Rückgegeben wird immer "Bitwert" als Ergebnis, 0 oder 1
;
;___________________________________________________________________________
;___________________________________________________________________________

  ProcedureDLL Bit7(Bytewert)   ;Bit7=128
    If Bytewert<128 
    Bitwert=0
    EndIf
   
    If Bytewert>127
    Bitwert=1
    EndIf     
   ProcedureReturn Bitwert
  EndProcedure
 ;___________________________________________________________________________
  
  ProcedureDLL Bit6(Bytewert)   ;Bit6=64
    
    A=Bytewert/2
    B=A/2
    C=B/2
    D=C/2
    E=D/2
    F=E/2
    
    Bitwert= F % 2 
     
   ProcedureReturn Bitwert
  EndProcedure
 ;___________________________________________________________________________

  ProcedureDLL Bit5(Bytewert)   ;Bit5=32
    
    A=Bytewert/2
    B=A/2
    C=B/2
    D=C/2
    E=D/2
    
    Bitwert= E % 2 
       
   ProcedureReturn Bitwert
  EndProcedure
 ;___________________________________________________________________________
  
  ProcedureDLL Bit4(Bytewert)   ;Bit4=16
     
    A=Bytewert/2
    B=A/2
    C=B/2
    D=C/2
    
    Bitwert= D % 2 

   ProcedureReturn Bitwert
  EndProcedure
 ;___________________________________________________________________________
 
  ProcedureDLL Bit3(Bytewert)   ;Bit3=8
    
    A=Bytewert/2
    B=A/2
    C=B/2
    
    Bitwert= C % 2 
      
   ProcedureReturn Bitwert
  EndProcedure
 ;___________________________________________________________________________
 
  ProcedureDLL Bit2(Bytewert)   ;Bit2=4
     
    A=Bytewert/2
    B=A/2
    
    Bitwert= B % 2 
        
   ProcedureReturn Bitwert
  EndProcedure
 ;___________________________________________________________________________
 
  ProcedureDLL Bit1(Bytewert)   ;Bit1=2
      
    A=Bytewert/2
 
    Bitwert= A % 2 
 
   ProcedureReturn Bitwert
  EndProcedure
 ;___________________________________________________________________________
  
  ProcedureDLL Bit0(Bytewert)  ;Bit0=Wert 1 
     
   Bitwert=Bytewert % 2
  
  ProcedureReturn Bitwert      ;entscheidend für Rückgabe des Ergebnis
  EndProcedure
 ;___________________________________________________________________________
;_____________________________________________________rp ©2005______________
Testprogramm Quellcode:

Code: Alles auswählen

;    ******************************************
;    *|--------------------------------------|*
;    *|Testprogramm für DLL :  8Bit_ident.dll|*
;    *|--------------------------------------|*
;    ******************************************
  
OpenWindow(0, 0, 0, 400, 300, #PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_MinimizeGadget, "8-bit Erkennung"); Window erstellen
  
  
    If OpenLibrary(0, "8bit_ident.DLL") ;Programmbibliothek '8bit_ident.DLL' laden
       Bit7 = IsFunction (0,"Bit7")    ;Test der einzelnen Funktionen
       Bit6 = IsFunction (0,"Bit6")
       Bit5 = IsFunction (0,"Bit5") 
       Bit4 = IsFunction (0,"Bit4") 
       Bit3 = IsFunction (0,"Bit3") 
       Bit2 = IsFunction (0,"Bit2")
       Bit1 = IsFunction (0,"Bit1") 
       Bit0 = IsFunction (0,"Bit0")     
          If Bit7 And Bit6 And Bit5 And Bit4 And Bit3 And Bit2 And Bit1 And Bit0
            DLL_ok=1             ;=1 heißt Funktionen i.o.
          Else
            MessageRequester("Softwarefehler","Bibliothek '8bit_ident.dll' wurde geladen, ist aber beschädigt.",#PB_MessageRequester_Ok) 
            CloseLibrary(0)
            End
          EndIf
    Else
      MessageRequester("Softwarefehler", "Bibliothek '8bit_indent.dll' konnte nicht geladen werden.")           
      End
    EndIf
      

;Oberfläche erstellen

If CreateGadgetList(WindowID(0))
    StringGadget(0, 15, 15, 80, 20, "", #PB_String_Numeric)
    ButtonGadget(1, 120, 15, 100, 30, "Status ermitteln")
    ListIconGadget(2, 15, 80, 200, 200, "Bit", 80)
    AddGadgetColumn(2, 1, "Bitwert", 80)
    ButtonGadget(3, 240, 15, 100, 30, "Exit")
EndIf

Repeat
   Select WindowEvent() 
              Case #PB_Event_CloseWindow:CloseLibrary(0):End
              Case #PB_EventGadget 
                Select EventGadgetID() 
                  Case 1
                    ClearGadgetItemList(2) 
                    Gosub Ubernahme
                  Case 3
                    End
                    CloseLibrary(0)
                EndSelect
    EndSelect 
ForEver
End


Ubernahme:

bytewert$ = GetGadgetText(0)

Bytewert = Val(bytewert$)

If bytewert > -1 And bytewert < 256
 
 ;Hier wird die Dll benutzt
 
Bitwert=CallFunctionFast (Bit0,Bytewert)  ;Bit0 wird ermittelt
ergebnis$ = Str(Bitwert)
AddGadgetItem(2,-1,"Bit 0"+Chr(10)+ergebnis$)

Bitwert=CallFunctionFast (Bit1,Bytewert)  ;Bit1 wird ermittelt
ergebnis$ = Str(Bitwert) 
AddGadgetItem(2,-1,"Bit 1"+Chr(10)+ergebnis$)

Bitwert=CallFunctionFast (Bit2,Bytewert)  ;Bit2 wird ermittelt
ergebnis$ = Str(Bitwert) 
AddGadgetItem(2,-1,"Bit 2"+Chr(10)+ergebnis$)

Bitwert=CallFunctionFast (Bit3,Bytewert)  ;Bit3 wird ermittelt
ergebnis$ = Str(Bitwert) 
AddGadgetItem(2,-1,"Bit 3"+Chr(10)+ergebnis$)

Bitwert=CallFunctionFast (Bit4,Bytewert)  ;Bit4 wird ermittelt
ergebnis$ = Str(Bitwert) 
AddGadgetItem(2,-1,"Bit 4"+Chr(10)+ergebnis$)

Bitwert=CallFunctionFast (Bit5,Bytewert)  ;Bit5 wird ermittelt
ergebnis$ = Str(Bitwert) 
AddGadgetItem(2,-1,"Bit 5"+Chr(10)+ergebnis$)

Bitwert=CallFunctionFast (Bit6,Bytewert)  ;Bit6 wird ermittelt
ergebnis$ = Str(Bitwert) 
AddGadgetItem(2,-1,"Bit 6"+Chr(10)+ergebnis$)

Bitwert=CallFunctionFast (Bit7,Bytewert)  ;Bit7 wird ermittelt
ergebnis$ = Str(Bitwert) 
AddGadgetItem(2,-1,"Bit 7"+Chr(10)+ergebnis$)

Else

MessageRequester("Eingabefehler", "Es werden nur Werte zwischen 0...255 akzeptiert.")

EndIf

Return
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Ganz nett, das ganze geht aber auch mit "Bitwert=(Bytewert & (1 << Bit)) >> Bit"

Code: Alles auswählen

bytewert = %10100111

For Bit = 0 To 7
  Bitwert=(Bytewert & (1 << Bit)) >> Bit
  Debug "Bit"+Str(bit)+": "+Str(bitwert)
Next
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Beitrag von Danilo »

Als Prozedur:

Code: Alles auswählen

Procedure TestBit( Bit, Wert )
  If Bit >= 0 And Bit < 32
    ProcedureReturn (Wert >> Bit) & 1
  EndIf
EndProcedure

Debug TestBit(0,%00000001)
Debug TestBit(2,%00000100)
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Hier noch eine Version in ASM:

Code: Alles auswählen

Procedure.l testBit(value.l, bitOffset.l) ; returns 1 if the bit (0-31) is set, or 0 else
  !MOV eax, [esp]
  !MOV edx, [esp+4]
  !BT eax, edx 
  !MOV eax, 0
  !SETC al
  ProcedureReturn
EndProcedure
!UD2
Antworten