přiřazení hodnot 0/1 do proměnné byte

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
epzlin
Příspěvky: 37
Registrován: 17 črc 2019, 19:22
Reputation: 0

přiřazení hodnot 0/1 do proměnné byte

Příspěvek od epzlin » 31 pro 2020, 18:19

Zdravím,
potřeboval bych nasměrovat, jak udělat:

řekněme, že čtu 8 digitálních vstupů do proměnných byte vstup1, vstup2, vstup3,...a tyto stavy chci dostat do proměnné byte status ve formátu BIN
Přílohy
Bez názvu.png

AstroMiK
Příspěvky: 593
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: přiřazení hodnot 0/1 do proměnné byte

Příspěvek od AstroMiK » 31 pro 2020, 20:48

Kód: Vybrat vše

byte status = (vstup1 * 128) + (vstup2 * 64) + (vstup3 * 32) + (vstup4 * 16) + (vstup5 * 8) + (vstup6 * 4) + (vstup7 * 2) + vstup8;
Pak záleží na tom, jak si tu výslednou proměnnou zobrazíš.
Třeba:

Kód: Vybrat vše

Serial.print('B');
Serial.println( status , BIN);


Pokud by ti šly ty vstupní piny nějak šikovně popořadě, tak můžeš použít přímé čtení registrů PINB a PIND.
Je to nejrychlejší a zabere to nejmíň prostoru pro program.
Popisoval jsem to tady:
viewtopic.php?f=40&p=8208#p8208

(otočil jsem v tom příspěvku pojmenování registrů 'PINB' a 'PIND', ale jinak je to správně)

epzlin
Příspěvky: 37
Registrován: 17 črc 2019, 19:22
Reputation: 0

Re: přiřazení hodnot 0/1 do proměnné byte

Příspěvek od epzlin » 01 led 2021, 13:48

Něco takového mě také napadlo...ale nešlo by to nějak šikovněji přes bitový posun/součet/součin? Jen hádám.

Dál je potom otázka, jak z té proměnné "status" zpětně získat informaci o jednotlivých vstupech.

AstroMiK
Příspěvky: 593
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: přiřazení hodnot 0/1 do proměnné byte

Příspěvek od AstroMiK » 01 led 2021, 15:05

Jestli chceš posuny, tak třeba takhle, ale myslím, že si tím moc nepomůžeš:

Kód: Vybrat vše

status = (vstup1 << 7) | (vstup2 << 6) | (vstup3 << 5) | (vstup4 << 4)  | (vstup5 << 3)  | (vstup6 << 2)  | (vstup7 << 1) | vstup8 ;  
Zpátky potom:

Kód: Vybrat vše

vstup1 = bitRead(status, 7);
vstup2 = bitRead(status, 6);
vstup3 = bitRead(status, 5);
vstup4 = bitRead(status, 4);
vstup5 = bitRead(status, 3);
vstup6 = bitRead(status, 2);
vstup7 = bitRead(status, 1);
vstup8 = bitRead(status, 0);

epzlin
Příspěvky: 37
Registrován: 17 črc 2019, 19:22
Reputation: 0

Re: přiřazení hodnot 0/1 do proměnné byte

Příspěvek od epzlin » 01 led 2021, 19:30

Super! Syntax bitRead() jsem vůbec neznal, ale hned mě napadlo, že by mohlo existovat i syntax bitWrite() a opravdu!

Takže se to dá jednoduše udělat takto, i bez bitových posunů:
bitWrite(cislo, 0, 0); // (promenna, pozice z prava, data 0/1)

tím si zapíšu hodnotu přímo kam potřebuju. Přesně toto jsem hledal. Úžasné, takže do jednoho byte jsem schopen uložit a číst až 8 stavů 0/1. To se hodí zejména při používání eeprom.

AstroMiK
Příspěvky: 593
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: přiřazení hodnot 0/1 do proměnné byte

Příspěvek od AstroMiK » 01 led 2021, 20:08

No vidíš.

Já jsem znal jen funkce bitSet() a bitClear(), ale bitWrite() mne nějak minula.
Takže i já jsem se něco naučil. ;)

Uživatelský avatar
gilhad
Příspěvky: 786
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: přiřazení hodnot 0/1 do proměnné byte

Příspěvek od gilhad » 02 led 2021, 02:39

epzlin píše:
01 led 2021, 19:30
To se hodí zejména při používání eeprom.
Problem s eeprom je omezeny pocet zapisu a kdyz tam budes zapisovat po bitech tak ten prislusny byte odrovnas podstatne driv (protoze se prepisuje jako jeden celek) - takze si nedriv tu hodnotu sestav v RAM a az ji budes mit celou, tak ji teprve zapis pomoci https://www.arduino.cc/en/Reference/EEPROMUpdate (ktere zapisuje pouze pokud se hodnota meni a tak tu bunku setri)

epzlin
Příspěvky: 37
Registrován: 17 črc 2019, 19:22
Reputation: 0

Re: přiřazení hodnot 0/1 do proměnné byte

Příspěvek od epzlin » 02 led 2021, 15:26

gilhad píše:
02 led 2021, 02:39
Problem s eeprom je omezeny pocet zapisu
Ano vím o tom. Všude se to zmiňuje. Nicméně to není tak horké. Atmel myslím udává (nejen pro řady AVR) 100.000 zápisů. Realita je ovšem trochu lepší. V jednom projektu co mi běží druhým rokem mám nyní 520.000 zápisů a stále funguje zcela správně.

Kdysi jsem to ze zajímavosti zkoušel kolik vydrží eeprom v Uno/nano (klon) a začalo to zlobit někde kolem 1.500.000 zápisů!

AstroMiK
Příspěvky: 593
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: přiřazení hodnot 0/1 do proměnné byte

Příspěvek od AstroMiK » 02 led 2021, 21:28

(Už trochu OT)

Nejde jen o ten okamžik, kdy se ze zapsané číslo nepodaří správně přečíst, ale jde i o trvanlivost zápisu.

Takže do těch 100 000 zápisů vydrží zapsaná data při pokojové teplotě garantovaně 100 let (podle kat. listu).
Když to ale přepíšeš 1 000 000x, tak ti nikdo nezručí, že se ta data neztratí za týden.

Taky jsem jednou zkoušel, co vydrží EEPROM (AT24C16).
Podle kat listu měla vydržet 1 000 000 zápisů.
Zjišťoval jsem, po kolika zápisech dojde k 10. chybě na každé z 20 testovaných buněk.
Po 10. chybě jsem příslušnou buňku už přestal trápit.
Některé buňky jsem přepisoval v cyklech 10x stejným číslem, některé při každém cyklu na střídačku přepínanými bity.
Po každém zápisu následoval pokus o přečtení.
Všechny chyby se logovaly a běželo to nepřetržitě asi 2 týdny.
První chyby se začaly objevovat kolem 4,5 milonu zápisů. Všech 20 buněk bylo zničených zhruba po 8 milionech zápisů.
eeprom_kill.gif
eeprom_kill.gif (10.52 KiB) Zobrazeno 3125 x

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Google [Bot] a 15 hostů