na techto mikrocontrollerech jsou opravdu krasne porty. To ze jsou soucasne vstupy a vystupy (s otevrenym kolektorem, slabym pullupem a tranzistorem, ktery je pritahne nahoru po zmene z L na H), to je hardwaroveho hlediska skvela vec. A to, ze se daji ovladat po bitech, to je skvela vec zase ze softwaroveho hlediska.
8052 a jeho klony jsem mel rad, posledni projekt s nimi jsem delal pred par lety.
Dostal jsem do nej scanner s OCR. Byl to klon 8052 od ST, jmenuje se uPSD3234, delaji ho i ve verzi s USB. Takovy velky projekt se uz samozrejme neda delat v assembleru, delal jsem to v SDCC – open source kompilator C, ale rekneme si to uprimne, ten kompilator neni nic moc. Alespon pred par letama byl dost zabugovany a nepreklada optimalne. Je ovsem pravda, ze 8051 neni processor urceny pro preklad C. V assembleru se s nim pracuje dobre.
Takovy velky projekt se uz samozrejme neda delat v assembleru – v Assembleru se dělaly i tisíckrát větší projekty. ;-) Základem každého assembleristy je naučit se udržovat si přehled a vytvořit si ve svém díle systém. Řekl bych, že existuje jistá bariéra, kterou když člověk při svém potýkání se s Assemblerem překoná, dokáže pak v (makro)Assembleru naprogramovat opravdu cokoli a se srovnatelnou produktivitou, jako v kterémkoli jiném tuctovém imperativním jazyce. Je to věc, která se dá naučit, podobně jako se Javař může naučit udržovat si systém v hierarchii tříd a navrhovat je tak, že ví, že se do toho časem nezamotá. Osobně výhodu „klasických“ vyšších jazyků spatřuji především v jejich přenositelnosti. Dobře napsaný program v Assembleru je totiž určitě čitelnější, než třeba program v C, protože součástí každého dobrého assemblerského kódu je komentář v takovém rozsahu, který není obvyklý u žádného jiného jazyka (tím ovšem nemyslím komentáře typu „načti do registru X hodnotu F0“ za instrukcí typu LDX #F0; když potkám takový komentář, vždycky si vzpomenu na Vrchní, prchni – „že vám do toho kecám, ale ty stěrače, ostřikovače, to snad nemusíte hlásit, to přece vidí“).
ad slabý pullup s tranzisotrem – přiznám se, že tuto vlastnost jsem snad v životě v žádném návrhu nepoužil a ani mě zrovna nenapadá, k čemu by se to použít dalo (aniž by to byla nějaká prasárnička – možná jsem purista, ale směr toku informace by měl být v daný moment vždy jasný). Nechám se podat. :-)
Obecně se tenhle trik používá při arbitráži, kdy mezi sebou rovnocenná zařízení vybírají šéfa, viz třeba
http://www.esacademy.com/en/library/technical-articles-and-documents/miscellaneous/i2c-bus/general-introduction/bus-arbitration.html
Jiný příklad použití byla třeba Plug&Play podpora dodatečně dobastlená do specifikací ISA sběrnice.
Mrkněte i na 1-Wire, to je teprv lahůdka – jeden drát, na kterém probíhá obousměrná komunikace procesoru s periferií, z obou stran otevřené kolektory a někde pull-up odpor (a když na to přijde, tak si z toho bere periferie i potřebné napájení). Viz http://hw.cz/Rozhrani/ART1215-Sbernice-1-Wire.html
Prenositelnost, to je presne ta vec, kvuli ktere to bylo psano v C – ten samy algoritmus byl kvuli ladeni prelozitelny i pro PC, takze kdyz jsem neco precetl a OCR na tom zhavarovalo, stahnul jsem si obrazek do PC a ladil jsem algoritmus OCR az na tomto konkretnim obrazku neudelal chybu. Pak jsem nechal prohnat tim novym OCR sadu testovacich obrazku a pokud vsechno dopadlo dobre, mohl jsem program prelozit pro chip.
S prenositelnosti assembleru 8052 mam jeste jednu historku – prijimac IR, ktery prijata a vydekodovana data poslal po RS485 do PC. V nem, jak jinak 8052. Jeden uart hardwarovy, druhy uart softwarovy. Terminaly poslaly pres IR packet, ten se pres tento prijimac poslal do PC. Pozdeji bylo ovsem potreba udelat i fixni terminal, pripojeny primo po 485. Potiz byla v tom, ze terminal mel Ziloga, IR prijimac 8052. Nezbylo nez v makrech pro assembler ziloga nadefinovat instrukce 8052 a puvodni program z prijimace prelozit temito makry pro Zilog. Podarilo se :-)