www.elektronik.si
Kako se v Pythonu najlepše manipulira s biti v bajtu

www.elektronik.si -> Raspberry Pi sekcija

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Ned Jul 21, 2019 10:36 am    Naslov sporočila:  Kako se v Pythonu najlepše manipulira s biti v bajtu
----------------------------------------------------------------------------
Običajno rad upravljam naprave preko i2c portexpanderja. definiram nek bajt in za posamezne bite tega bajta definiram aliase. V Bascomu je to zelo preprosto:
Koda:
dim pcfbajt as byte
rele3 alias pcfbajt.3  ' in tako še ostale bite

In tako enostavno lahko testiram vsebino vsakega bita posebej in tudi upravljam vsak bit posebej.
Koda:
rele3 = 1
i2csend pcfbajt


Kako nekaj takega najpreprosteje in z čim manj kode naredim v Pythonu?
Sem iskal kak ukaz ki bi bil analogen bascovemu alias a nisem našel.

Avtor: RivenKraj: Vojnik PrispevekObjavljeno: Ned Jul 21, 2019 3:41 pm    Naslov sporočila:  
----------------------------------------------------------------------------
https://wiki.python.org/moin/BitManipulation

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Ned Jul 21, 2019 3:53 pm    Naslov sporočila:  Hvala, poučna stran,
----------------------------------------------------------------------------
Riven je napisal/a:
https://wiki.python.org/moin/BitManipulation


Sedaj je treba to še naštudirati.
Ampak že vidim: Bascom veliko preprostejši.

Vilko

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Ned Jul 21, 2019 5:06 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Mislim, da bom delal takole:

Koda:
#      definiram pomožne spremenljivke
bit1 = 0x01
bit2 = 0x02
bit3 = 0x04
bit4 = 0x08
bit5 = 0x10
bit6 = 0x20
bit7 = 0x40
bit8 = 0x80

#      defniram spremeljivko bajt
bajt = 0
print (bin(bajt))
#      v spremenljivki bajt dvignem bit 3
bajt = bajt + bit3
print (bin(bajt))
#      v spremenljivki bajt dvignem še bit 6
bajt = bajt + bit6
print (bin(bajt))
#      v spremenljivki bajt zrušim  bit 3
bajt = bajt - bit3
print (bin(bajt))
#      bite lahko dvigam z or
bajt = bajt | bit3
print (bin(bajt))
#      in rušim z and, le da pri tem moram
#      uporabiti komplement
bajt = bajt & (255 - bit3)
print (bin(bajt))
#      bit lahko tudi testiram
if ((bajt & bit3) > 0 ):
    print ("Bit 3 je 1")
else:   
    print ("Bit 3 je 0")

print ("KONEC")


Razlaga: Definiral si bom pomožne spremenljivke od bit0 do bit 7 in z njimi delal operacije na spremenljivki bajt. Kar me še moti je print ukaz, ki odreže ničle izpred prvega bita.
Rezultat gornjega programa je sledeč:
Koda:
0b0
0b100
0b100100
0b100000
0b100100
0b100000
Bit 3 je 0
KONEC


V programu, ki upravlja naprave bom seveda pomožne spremenljivke imenoval drugače recimo:

motor1 = 0x01
motor_roleta1_gor = 0x02
motor_roleta1_dol = 0x04
lučdvorišča = 0x08

In tako dalje. Ostane mi samo še, da vsebino spremenljivke bajt, ki jo bom verjetno poimenoval kot i2cbajt, pošljem na i2cbus

Avtor: igo PrispevekObjavljeno: Ned Jul 21, 2019 9:02 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Za postavljanje bita na 0 ne smeš uporabiti
bajt = bajt - bit3 , saj bo prišlo do prenosa, če je bit3 že enak 0.

Uporabi definicije
NiBit0 = 0xfe
Nibit1 = 0xfd
...
Torej maske iz enic in ene ničle (1111 1110, 1111 1101, ...).

Potem pa
bajt = bajt & NiBit3
z AND funkcijo izklopiš posamezen bit.

Avtor: RivenKraj: Vojnik PrispevekObjavljeno: Pon Jul 22, 2019 8:03 am    Naslov sporočila:  
----------------------------------------------------------------------------
Tako kot je že iGo napisal, način kot je tisti, ne smeš uporabiti.
Zakaj enostavno ne napišeš funkcije, ki ti maskira bit, setira bit, ali resetira bit?

Primer (ki je bdw. tudi na linku ki sem ga dodal):
maska = 1 << st_mest (s to masko potem setiraš bit, pogledaš če je na 0, ali ga resetiraš?)

To potem vkljucis v funkcijo in lahko s tem delas kar zelis. Ne potrebuješ odkrivati tople vode, ker je v tem primeru že odkrita.

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Sre Jul 24, 2019 5:52 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Ja, razumem. Samo and in or prideta v poštev in ne plus in minus.

Stran 1 od 1

Powered by phpBB © 2001,2002 phpBB Group