Aktuelle Zeit: 25.09.2020 06:55

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Erkennen von einzelnen Bits
BeitragVerfasst: 23.10.2005 16:27 
Offline

Registriert: 16.04.2005 19:38
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:
;___________________________________________________________________________
;
; 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:
;    ******************************************
;    *|--------------------------------------|*
;    *|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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 23.10.2005 16:34 
Offline
Benutzeravatar

Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Ganz nett, das ganze geht aber auch mit "Bitwert=(Bytewert & (1 << Bit)) >> Bit"

Code:
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]


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 23.10.2005 16:51 
Offline
-= Anfänger =-
Benutzeravatar

Registriert: 29.08.2004 03:07
Als Prozedur:
Code:
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: 23.10.2005 18:05 
Offline
Badmin
Benutzeravatar

Registriert: 08.09.2004 20:02
Hier noch eine Version in ASM:
Code:
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


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  
cron

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye