pristup k bitovo orientovanej pamati

Zdravim, poradi mi niekto figel ako na x51 pristupovat k casti pamati, ktora je bitovo orientovana. Potrebujem na adresy 0x20 az 0x24 (teda 0x00 az 0x28 bitovo) ulozit 5 cisiel a potom postupne po bitoch ich testovat ci je tam 1 alebo 0. Pouzit JB 0x00, skok ide , ale ja to potrebujem do cyklu a tam som skoncil. Dakujem

Zajimavej problem :slight_smile:

Neni k tomu ani potreba bitova oblast, data muzou bejt kdekoli, stajne budes prohazovat A jak zdesenej :slight_smile:
V cyklu muzes testovat bit nahranim bytu do A, pak logickej soucin s registrem, ve kterym je “1” na miste testovanyho bitu. Nasledna instrukce JZ nebo JNZ (jump if A is/not zero) urci, zda je tam 1 nebo 0.
dal provedes na tom registru rotaci vlevo (1 se posune napr. z bitu 0 na 1) (do A, nahrat registr, provest rotaci, registr vratit, znova do A nacist testovany byte) a znova soucin + JZ/JNZ… tim zpracujes dalsi bit… a tak porad dokola, dokud neprojdes 1 byte.
Potom se vrhnes na dalsi :wink:

Muzu se zeptat, k cemu to slouzi? :slight_smile: mimochodem na avr by to bylo “nepatrne” jednodussi a rychlejsi :wink:

EDIT: Ted me napadlo jeste rychlejsi a jednodussi reseni: staci testovany byte rotovat pres C a po kazde rotaci testem C zjistis hodnotu toho bitu :wink:

Holt ani do hospody nevede jen 1 cesta a napoprvy vzdy nenajdes tu nejkratsi :smiley:

potrebujem ho seriovo poslat na pin brany a popritom este nastavit jeho casovanie, aby som generoval spravny priebeh na vystupe. Popisany postup som skusal, ale je to dost zdlhavy a ja to potrebujem kazdych 20us. Vecer ma napadlo, este jedno riesenie. Mam dost pamate dat, ktoru nevyuzijem , tak tych 5bytov rozpisem na 40bytovom mieste a budem jednoducho kontrolovat po bytoch a vyhodnocovat s nepriamym adresovanim cez register a porovnanim CJNE. Vzdy su viacere cesty, len treba najst tu najvyhodnejsiu. Preto ma programovanie bavi :slight_smile:

Aky pouzivas mcu? Ak klasiku 89C5x, tak ta ma max pracovny kmitocet 24Mhz, kt. je este interne deleny, takze jeden stroj. cyklus trva pri 24Mhz 0,5us. Chces posielat 5bajtov seriovo. Treba si uvedomit, ze instrukcie na nastavenie vystup. pinu trvyju najmenej jeden stroj.cyklus, cize najkratsie 0,5us, z toho vyplyva, ze ked posielas 40bitov x 0,5us = 20us… a to je len nastavenie prislusneho pinu, k vysled.casu treba pripocitat este dalsie operacie, kt. su nutne k spacovaniu udajov, takze pochybujem, ze to za 20us zvladne obycajna 89C5x. Mozes vyskusat iny mcu od ATMELu, napr. AT89S2051, kt. ma funkciu X2, s ktorou dosiahnes 0,25us na stroj. cyklus pri 24Mhz xtale…

Predpokladam, ze myslel 1 bit/20us, jinak by vazne neuspel :smiley: Kdyz jsme u tech rychlejsich - verze LP maji jednocyklovy jadro… nebo x51 od silabs pracuji do 100MHz :wink:

Mozno myslel 20us/1bajt…poslat 1bit za 20us zvladne x51 urcite :wink:

prikladam nejake verzie
test_x51_3.txt (3.72 KB)
test_x51_2.txt (3.57 KB)
test_x51_1.txt (1.87 KB)

nebol som dlhsie na nete, ale posielam jeden paket pre DCC riadenie modelov zeleznice, kde log1 ma priebeh 58us v kladnej polvlne a 58us v zapornej, log0 je min 100us v kladnej a 100us v zapornej. Urobil som to tak, ze casovac mi pocita tych 58us a ja som potreboval pristupovat jednotlivo k vysielanym bitom. V jednom pakete je ich celkovo 40 a poteboval som testovat aky ma nasledovat. pouzivam 89x51 a nakoniec som tych 40 bitov rozpisal na 40 bytov a porovnavam ako byty teda log1 som zapisal 0x01 a log0 0x00. Cely cyklus spracovania trva asi 12us a zvysnych 46us sa bude mcu bavit s ostatnymi ulohami.