přiřazení hodnot 0/1 do proměnné byte
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.
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.
přiřazení hodnot 0/1 do proměnné byte
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
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
Kód: Vybrat vše
byte status = (vstup1 * 128) + (vstup2 * 64) + (vstup3 * 32) + (vstup4 * 16) + (vstup5 * 8) + (vstup6 * 4) + (vstup7 * 2) + vstup8;
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
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.
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
Jestli chceš posuny, tak třeba takhle, ale myslím, že si tím moc nepomůžeš:
Zpátky potom:
Kód: Vybrat vše
status = (vstup1 << 7) | (vstup2 << 6) | (vstup3 << 5) | (vstup4 << 4) | (vstup5 << 3) | (vstup6 << 2) | (vstup7 << 1) | vstup8 ;
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
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.
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
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.
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
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
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
(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ů.
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ů.
Kdo je online
Uživatelé prohlížející si toto fórum: Google [Bot] a 15 hostů