Stránka 1 z 1

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

Napsal: 31 pro 2020, 18:19
od epzlin
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

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

Napsal: 31 pro 2020, 20:48
od AstroMiK

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ě)

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

Napsal: 01 led 2021, 13:48
od epzlin
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.

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

Napsal: 01 led 2021, 15:05
od AstroMiK
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);

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

Napsal: 01 led 2021, 19:30
od epzlin
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.

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

Napsal: 01 led 2021, 20:08
od AstroMiK
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. ;)

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

Napsal: 02 led 2021, 02:39
od gilhad
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)

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

Napsal: 02 led 2021, 15:26
od epzlin
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ů!

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

Napsal: 02 led 2021, 21:28
od AstroMiK
(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 4086 x