Radius - já to pochopil. Jsem teď naštvanej z jiných věcí, tak mám nejapný poznámky. Přechod na Céčko mi radil už kde kdo. Ale protože jsem samouk, samá práce okolo i doma, tak mám málo času něco louskat. Sice to stále odkládám, ale zřejmě mě to nemine.
Hele, já Ti rozumím. Psal jsem dost dlouho v ASM cca. 5 různých procesorů a přestože některé byli lepší než jiné a i překladače měli různé široké možnosti abstrakce, nikdy to nebylo ono.
Pro představu co bys musel v asm udělat:
Z příchozího ID udělat N-bitové číslo (N je násobek 8 ). Pokud ID chodí jako jednotlivé decimální/hexa znaky tak je to násobení 10/16 s akumulací. Výsledek pak porovnáváš s tím co máš uloženo někde v eeprom/flash a to byte po bytu. Tam kde to souhlasí pokračuješ čtením dalších byte které reprezentují textovou informaci. kterou hodíš na lcd. Jinak přeskočíš na začátek další požky.
Tabulka se skládá z pevného počtu byte pro ID a pevného počtu byte pro TEXT. Pokud bys chtěl variabilní délku textu, musí tam být úvodní nebo ukončovací znak.
Ahoj. Tak jsem se dnes zase částečně propracoval dále. Tu řadu 18F prozatím nemám, takže budu objednávat. Pro přiblížení, co vlastně “leze” ze čtečky, jsem psal sice již výše, ale je to tohle: 02, 10 byte data, 2 byte CRC, 03. A leze to v ASCII, takže to po odfiltrování rovnou posílám na LCD. Fyzická data jsou z terminálu Herkules z mých 3 karet:
V ASCII: STX{30}{46}{30}{31}{35}{43}{41}{44}{39}{46}{36}{30}#ETX nebo v HEXA: #STX0F015CAD9F60#ETX
V ASCII: STX{30}{31}{30}{31}{32}{30}{45}{34}{34}{37}{38}{33}#ETX nebo v HEXA: #STX010120E44783#ETX
V ASCII: STX{30}{31}{30}{31}{32}{32}{43}{42}{34}{45}{41}{37}#ETX nebo v HEXA: #STX010122CB4EA7#ETX
Legenda: 02 je v ASCII start of text-STX, 03 je end of text-ETX, # vkladá jako označení řídících znaků zřejmě terminál Herkules.
V Putty to leze v hexa bez řídících znaků: 0F015CAD9F60 Nezkoušel jsem, zda to jde nastavit jinak, ale nepotřebuji to. Vrhám se do tabulek zatím pro 16 řadu, kde jsem, a to se přiznám bez mučení, nepochopil to násobení 16. To ASCII mám v MCU přeložený i do hexa, ale nějak mi uniká myšlenka. Protože ve výsledku nebudu testovat tolik karet (cca do 50), napadla mě možnost, třídit to pomocí CRC. Tedy pokud se mi nesejdou stejné, jakože určitě ano. Možná k tomu přidat ještě 1 byte ??? Nemám však prozatím fyzicky ID a jmén vlastníků karet. Můžete mi prosím ještě jednou polopatisticky vysvětlit, jak na to. Možná příklad …
Děkuji všem.
Uděláš si buffer a budeš ho číst po každém přerušení od UART. Až bude na konci poslední 3 ETX tak vyhodnotíš, že přišlo něco “platného” a pak podle zbytku vyhodnotíš kdo prošel.
Jak píše kolega přede mnou. Budou Ti chodit znaky. STX - ten vyresetuje přijímací algoritmus. Další znaky budeš zpracovávat tak, že ASCII HEX zkonvertuješ do BIN HEX.
Příklad jak v C
U8 Hex2Bin(U8 c)
{
U8 data x=c-48;
U8 code A]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F};
if(x>22) return 0xFF;
return A[x];
}
Vysledeky téhle operace postupně uložíš do 6 byte, vždy horní a dolní 4bity.
Až příjde ETX, tak z těch 5 byte spočítáš CRC. Je to jen obyčený XOR všech 5 byte postupně přes sebe. Když pak udělaš ješte XOR s posledním byte (CRC) musí Ti vyjít 0x00. Mužeš to klidně počítat pruběžně, jako budou chodit ty dvojice znaků.
Těch 5 byte je ID.
CRC se Ti u takhle jednoduchého algoritmu může snadno sejít. To, že máš v systémů jen 50 ID neznamená, že jinde jich nemají tisíce, proto těch 5 byte.
Tabulka Tě nemine.
Násobení 16 je bitový posun do leva o 4 bity. Dá se tak kumulativně přidávat odspodu. A=(A<<4)+B;
Ahoj. Ještě info ke čtečce. Pokud je trvale přiložena karta, posílá ASCII znaky každých cca 100-200 ms dokola. Proto jsem pořešil čtení tak, že po načtení celého stringu, zablokuju další čtení, převedu do hexa a vyhodnotím správnost dle CRC. Konverzi do hexa už mám hotovou i s výpočtem CRC. Pokud to sedí, posílám na LCD vybrané ID v ASCII a do UARTU dle potřeb buď taky ASCII nebo v hexa. To, že se mi CRC může sejít je také jasné. Chtěl jsem si ušetřit práci
Každopádně jsem potřeboval to násobení 16, které jsem už snad pochopil. Děkuji
Proč vy Cčkaři pořád někomu předhazujete výhody Céčka?
To Johne pochopíš, až v něm začneš programovat. Do té doby je to zbytečná diskuze.
Lebo to spadnutie závoja utkaného z ASM, ktorým sme mali sami dlhé roky zastrený zrak a zubami nechtami sme si ho pred očami dobrovoľne držali, tú krásu z poznania jednoduchosti, prehľadnosti a udržiavateľnosti pri zachovaní obdobného výkonu prajeme každému.
Sme ako misionári, ktorí sami okúsili výhody C-čka oproti ASM a preto sa naše poznanie a skúsenosť snažíme šíriť pre blaho ľudstva ďalej, aj napriek upaľovaniu na pomyslených hraniciach neveriacimi a netečnými.
Nikdy totiž nevieme, aké nové srdce možno i náhodne čítajúce ten ktorý príspevok sa odhodlá vyskúšať krásne krajiny užitočnosti a efektivity.
Nie každému musí byť naša misia po vôli. No čo i len jedna jediná hodina času ušetrená pri používaní C-čka jeho novým adeptom stojí za tú námahu.
Odmietať naučiť sa cca 29 základných príkazov v siedmych skupinách
-
definovanie a deklarovanie funkcií: main(), funkcia(…), return
-
aritmeticke a binárne operátory: =, +, -, *, /, &, |
-
spôsoby porovnania" ==, !=, >, <, &&, ||
-
bitové rotácie: <<, >>
-
definovanie premenných: static, uint8_t, int8_t, uint16_t, int16_t, uint32_t, int32_t
-
podmienkové príkazy: (if, else, else if), (switch, case)
-
cykly: for( ; ; ), while ()
už umožňujúce robiť zmysluplné programy veľkého rozsahu, miesto mnoho desiatok až stoviek pseudokódových skratiek a to pre každú rodinu procesorov zvlášť, hraničí s tvrdohlavosťou.
Námietky na rýchlosť a efektivitu výsledného kódu som si vďaka vlastnej počiatočnej nedôverčivosti odskúšal a výsledky boli viac ako prekvapivé v prospech C-čka. Systémovo naspäť k ASM by som už nikdy nešiel.
Jasné, že keď som minulý rok som robil s ATmega1284 grafickú mnoho fontovú VGA kartu 272x240 pixlov 16 color bez potreby externej pamäte alebo iných programovateľných súčiastok, tak kód pre generovanie video signálu bol písaný v ASM. Zvyšok (fonty, obrázky, UART) v čistom C-čku. Ale to je za cca 12 rokov jediný projekt, kde to malo v ASM zmysel. Aj keď po podrobnejšom oboznámení sa s FT811 už dnes považujem celú tú námahu za stratu času.
Krásu štruktúr, pointrov a ďalších vychytávok je možné odhaľovať postupne podľa potreby. Tých 29 “príkazov” na dlhý začiatok bohate stačí.
Robím k veľkej spokojnosti v GCC na AVR.
A že sa dá v C aj pekne zapotiť? Isto. A pri programovaní v akom jazyku nie
Velmi pěkně a poeticky napsáno Martine. Jo, prostě misionáři
K té Tvé VGA kartě bych doplnil, že si nemyslím, že to byla ztráta času. Obdobný projekt jsem řešil s ARM. Jen jsem se dostal na rozlišení 640x480, grafika/text, za použití pouze C. FT8xx je moc fain a není drahý, ale pokud nepotřebuješ barevnou grafiku a dělá se toho víc kusů, i ty 200Kč stojí za to ušetřit
Uz len preto ze a asm to zaberie tisic riadkov bude to neprehladne. A spravis na tom kopec casu. V Cecku by to bolo rychlejsie.
Res tvrdis ze nemas cas na studium.
V asm to budes robit 100h v C by si sa 50h ucil cecko a 30h to napisal. Tak ze by si usetril cas a navyse sa naucil Ccko.
Projekty ktore som mal a stali zato som nakoniec prepjsal do C cka aby som sa vnich po case zorientoval a vedel robit upravy.
Ahoj. Tak jsem dnes úspěšně dokončil moje slavné dekódování RFID. Šel jsem na to od píky, tj. třídím karty podle všech 5 byte. Následně přiřazuju texty, tj. jména uživatelů. Na rovinu se přiznám, že to bylo peklo , protože jsem pro cca 48 uživatelů + 2 testovací karty, naplnil skoro celou 4kb paměť v 16F648A. Zasekl jsem se na stránkování s různým “posouváním” textů. Pagesel trochu “natáhlo” program. Nakonec mi dost pomohlo makro pro obsluhu LCD. Každopádně všem děkuji za nakopnutí a skvělé rady. S tím Céčkem musím něco udělat
Macro prodlužuje program. Co je v macru se přidává do programu po každém “zavolání” macra. Lepší je call a return.
Ano, ale to nemusí pokaždé vadit. Spíš se divím že nezkusil tu 18F řadu jak jsme se bavili původně, větší projekty jsou na 16F právě kvůli tomu stránkování většinou dost opruz i bez dat, a on s daty pracuje - stačí jeden zapomenutý pagesel a začnou “se dít věci”.
Mikop: Zkus si to na nějakou tu 18F zpětně portovat, uvidíš že budeš příjemně překvapený.
Zase je to otom ze keby to mal v cecku tak to ma presunute na tu 18 raz dva. Hlavne ze mu to chodi. Problem nastane o 6mesiacov s 49uzivatelom.
Inak gratulujem.
ZASE C
Já píšu v asm pro zábavu. Udělal jsem věci v asm a věřím že v c by “hned”, ale …
-
Mám zábavu a nemusím se bavit s tou slepicí se kterou mám společné zvonkové tlačítko
-
Od toho se odvyjí zbytek.
-
Platí pravidlo č 1
-
Když toto vše projde tak si udělám asm podle sebe jak chci já a NE jak mi ho předloží překladač C. Když chi 1 vteřínu strojového času ta bude a tak to bude. Zbytek co píšou v asm si domyslí.
honza3> Pokud potřebuješ na projektu “propálit” co nejvíc času a imponuje Ti představa, že to máš plně pod kontrolou pak… Zbytek si domyslí Ti co píšou v C
Honzo, chápu plně tvůj postoj, ale shodou okolností jsme probírali tohle téma teď se známým, ocituju ti tady co jsem mu dneska psal:
Takže shrnutí: C určitě není nástroj hodný zatracení a dělat v C neznamená automaticky vzdávat se ASM. Je to (obojí) prostě jenom nástroj, volba je na každém - ovšem odmítání určitého nástroje prostě jenom tak ze zásady připomíná vohnouta dělníka který i na šroubky bere kladivo, protože šroubování přeci zdržuje.