Int -> Bit shifting

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

bibibo
Pokročilý člen
Pokročilý člen
Príspevky: 626
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Int -> Bit shifting

Príspevok od používateľa bibibo » 25 Okt 2022, 19:40

Ahojte,
potreboval by som trochu pomoct s nasledujucim problemom. Pouzivam zatial v testovacej prevadzke HomeAssistant. Mam tam nejake senzory prostredia a tepelne cerpadlo. S tepelnym cerpadlo komunikujem cez Modbus TCP. Problem je, ze to tepelne cerpadlo resp. modbus ma registre napr. Fault Flag alebo Status Flag a kazdy z tychto registrov ma 8 bitov. Modbus mi vsak vrati cislo v desiatkovej sustave, takze neviem sledovat kazdy bit.
Napr.:
Bit0 - Kompresor ON/OFF
Bit1 - Fan ON/OF
atd.

Na tomto linku https://community.home-assistant.io/t/4 ... al/54657/8 uzivatel pnbruckner vysvetluje ako je to mozne urobit, ale vobec tomu nerozumiem. Pomoze niekto ?
0

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1148
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: Int -> Bit shifting

Príspevok od používateľa Atlan » 25 Okt 2022, 19:59

Zoberies register s danym cislom a otestujes bit0 vysledok 1 alebo 0 zapises do registra kompresor.
Prevedies posun v pravo a znova otestujes bit0 vysledok zapises do registra fan.
0

miso156
Pokročilý člen
Pokročilý člen
Príspevky: 648
Dátum registrácie: 06 Dec 2020, 11:46
Bydlisko: Banska Stiavnica
Vek: 38

Re: Int -> Bit shifting

Príspevok od používateľa miso156 » 25 Okt 2022, 20:06

Povedzme ze v registri je hodnota 0000 1100 co je v dekadickom tvare 12 a ty chces ziskat hodnotu druheho bitu (treti z prava, lebo bity sa pocitaju o nuly).

Takze najskor posunies odsah registru 2 krat do prava tym, ze register podelis 4.
(2 na druhu)
(keby si chcel treti bit, delis 8-ickou, teda 2 na tretiu)
(delenie je //)

Po tomto ukone je v registri cislo 0000 0011 co je 3.

Teraz podelis (celociselne) obsah registru 2-kou a zvysok po deleni je tvoj vysledok. To vsetko zabezpeci funkcia mudulo (%). A teda 3 / 2 je 1 a zvysok je 1. Tym si uspesne ziskal hodnotu druheho bitu.
0
"No pain, no gain." (KC238)

bibibo
Pokročilý člen
Pokročilý člen
Príspevky: 626
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Re: Int -> Bit shifting

Príspevok od používateľa bibibo » 25 Okt 2022, 21:05

Super. Diky moc. Uz mi to je jasnejsie.
0

Používateľov profilový obrázok
Mek
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1275
Dátum registrácie: 15 Okt 2015, 20:49
Bydlisko: Žilina
Vek: 37
Kontaktovať používateľa:

Re: Int -> Bit shifting

Príspevok od používateľa Mek » 25 Okt 2022, 21:56

Da sa to aj jednoduchsie.
Napriklad, cely bajt je 00101000 a je v premennej "a"
a ty chces vytiahnut tu druhu jednotku (4. bit sprava)

Kód: Vybrať všetko

if (a & 0b00001000)
{
...
}
0
... byvaly spravca Hospudky u amplionu, Martinekk-ov brat. Nemam vystudovane elektro, je to len moje hobby. Povolanim som SW inzinier.
Moja databaza suciastok: ELPARTS
Moj velky elektro projekt: MEGA TRANSISTOR CLOCK

bibibo
Pokročilý člen
Pokročilý člen
Príspevky: 626
Dátum registrácie: 05 Nov 2009, 00:00
Bydlisko: Bratislavský kraj

Re: Int -> Bit shifting

Príspevok od používateľa bibibo » 29 Okt 2022, 11:39

Diky, pani. trochu som sa k niecomu priucil.
Nakoniec som sa docital, ze HomeAssistant pouziva pre Teplate nejaky jazyk Jinja a urobil som to takto:

Kód: Vybrať všetko

{% if states('sensor.compresor')|int|bitwise_and(1) > 0 %}
0

Napísať odpoveď