Avtor: mag. Vladimir Mitrović
E-pošta: vmitrovic12@gmail.com
V predhodnem nadaljevanju smo spoznali osnove problematike, namen in shemo MLDL vezja za kalkulator HP-41C s približno 20 čipi, katere želimo nadomestiti z mikrokontrolerjem.
Če sem popolnoma iskren, vezje, katerega sem realiziral s pomočjo mikrokontrolerja ne podpira vseh funkcionalnosti originalnega MLDL vezja:
originalni MLDL ima EPROM in statični RAM, ki je namenjen za razvoj in pomnenje programa v strojnem jeziku,
”moj” MLDL uporablja Flash pomnilnik mikrokontrolerja za pomnenje programov, ki so razviti na nek drugi način (kot originalni ROM moduli), in v tem nadaljevanju ga bomo imenovali AVR-modul.
Ta vsebina je samo za naročnike
Vendar pa to bistveno ne zmanjšuje zahtevnosti naloge: odpadlo je spremljanje signala, ki omogoča vpis podatkov v RAM, je pa ostalo spremljanje vseh ostalih signalov na vodilu.
Slika 7 prikazuje shemo AVR-modula in način, po katere je povezan s portom kalkulatorja HP-41C. Opazili bomo dve vodili: krmilno-podatkovno, s signali Fi1, Fi2, Sync, Isa, Dta in Pwo, ter napetostno z linijami Vcc, Vbat in GND. S komunikacijo krmili kalkulator, medtem ko AVR-modul spremlja signale na vodilu in odgovarja takrat, ko se to od njega pričakuje.
Hardverski izzivi
Tudi tukaj se srečamo s prvim problemom: tehnologija, katero uporablja HP-41C je, iz današnje perspektive gledano, zastarela, in zahteva napajalno napetost Vcc = 6,5 V, kar je hkrati tudi amplituda vseh signalov na krmilno-podatkovnem vodilu. Z druge strani AVR-modul predstavlja celoto s kalkulatorjem, napaja se iz njegove baterije in njegova poraba mora biti čim manjša. Preučilo bomo nekaj faktorjev, ki vplivajo na porabo mikrokontrolerja, od katerih je prvi napetost napajanja. Mikrokontroler troši toliko manj, kolikor nižja je napajalna napetost, zato sem v končnici izbral 3 V napetost.
Zato je bilo potrebno najti način, kako učinkovito zmanjšati amplitudo vseh ”dohodnih” signalov na vodilu iz 6,5 na 3 V. Pokazalo se je, da je idealna rešitev 6-bitni CMOS buffer 4050, katerega vhodi so tolerantni na previsoko napetost, zato se lahko uporabi tudi za premik logičnih nivojev (level-shifter). Pri napajalni napetosti 3 V je tudi amplituda izhodnih impulzov prav tako 3 V, točno toliko, kolikor zahteva mikrokontroler, medtem ko so vhodi z lahkoto prenašali dvakrat višjo napetost na vodilu kalkulatorja. V končni verziji je uporabljen HC4050, ker se je standardna CMOS izvedba pri tako nizki napajalni napetosti pokazala kot prepočasna.
Samo ena linija vodila, Isa, je dvosmerna, in po njej AVR-modul pošilja podatke kalkulatorju takrat, ko kalkulator to zahteva. Ta del je bilo precej težje rešiti: amplitudo signala mikrokontrolerja je bilo potrebni dvigniti na 6,5 V in jo ”vtisniti” na Isa linijo v trenutkih, ko je prosta. Po obsežnem raziskovanju sem opazil čip HCT126. Ta štirikratni buffer s 3-state izhodi je, kot tudi celotna HCT družina, namenjen za napajalno napetost 4,5-5,5 V. Vendar v tehničnih specifikacijah je kot najvišja dovoljena napetost navedena 6,5 V, in to me je spodbudilo – točno toliko sem potreboval. Nisem naklonjen preobremenjevanju čipov do njihovih skrajnih meja, vendar sem poizkusil in vezje je delovalo, (in še vedno dela) odlično! Za razliko od HC4050, HCT126 prav mora biti v HCT tehnologiji, da bi lahko pravilno interpretiral logične nivoje, ki mu jih postavlja mikrokontroler pri svoji delovni napetosti 3 V.
Tako je bil problem usklajevanja napetostnih nivojev uspešno rešen, vendar je to bil šele začetek dela!
Kalkulator se lahko nahaja v treh različnih stanjih: RUN (procesor je aktiven), STANDBY (prikazuje rezultat na displeju, ali pa je procesor neaktiven) in SLEEP (kalkulator je ugasnjen). Ko ga vključimo, se kalkulator nahaja v STANDBY režimu in pričakuje, da pritisnemo neko tipko. S pritiskom na tipko kalkulator preide v RUN režim, vpiše znak, izvrši funkcijo ali program in se vrne v STANDBY. Po 10 minutah neaktivnosti se kalkulator izklopi in gre v SLEEP režim.
Največja poraba kalkulatorja je v RUN režimu in znaša okoli 20 mA. Da bi čim manj vplival na porabo baterije, mora tudi mikrokontroler biti aktiven samo takrat, ko je kalkulator v RUN režimu: samo takrat lahko kalkulator naslavlja AVR-modul in od njega nekaj zahteva. V katerem režimu se nahaja kalkulator lahko mikrokontroler ugotovi tako, da spremlja signal na vodilu in sam preide v SLEEP režim, ko ne pričakuje, da ga lahko kalkulator ”pokliče”. To spada v analizo softvera, ki jo bomo naredili kasneje, zadržimo se sedaj samo na hardverskem vidiku.
Da bi se poraba mikrokontrolerja dovedla na najmanjšo možno vrednost, sem v AVR-modul vgradil elektronsko vezje, ki izključi napajalno napetost mikrokontrolerja in drugih čipov, ko je tudi kalkulator ugasnjen.
Poleg spremljanja stanja na krmilno-podatkovnem vodilu, lahko režim, v katerem se nahaja kalkulator, ugotovimo tudi s primerjavo Vbat in Vcc napetosti na napetostnem vodilu. Pri popolnoma novih baterijah bo napetost Vbat znašala do 6,4 V, in se zmanjševala, ko se baterija prazni. Kalkulator ima vgrajen DC-DC pretvornik, ki za vezja kalkulatorja zagotavlja delovno napetost Vcc = 6,5 V neodvisno od stanja baterije. DC-DC pretvornik se aktivira, ko je kalkulator vklopljen; ko je kalkulator izklopljen se Vcc zmanjša pod Vbat.
Stanje teh napetosti primerja komparator, ki ga tvorijo tranzistorja Tr1 (uporabljamo samo njegov BE spoj kot diodo) in Tr2 ter upor R1. Ta enostavni komparator deluje tako:
Dokler je kalkulator izklopljen, Vcc < Vbat in ves tok, ki teče skozi R1 bo tekel tudi v bazo tranzistorja Tr1. Zato tranzistorja Tr2 in Tr3 ne bosta prevajala in bo vhodna napetost napetostnega stabilizatorja znašala 0 V – mikrokontroler bo ostal brez napajanja. Skupna poraba AVR-modula v tem režimu je tok, ki teče preko upora R1 in je manjši od 1 µA. To je večkratno manjši tok, kolikor troši kalkulator v izklopljenem režimu, zato AVR-modul ne more bistveno vplivati na trajanje baterije. Dokler je kalkulator vklopljen, je Vcc > Vbat in ves tok, ki teče preko upora R1, teče v bazo tranzistorja Tr2. Odvisno od njegovega tokovnega ojačenja bo kolektorski tok Tr2 v razponu 400-800 µA, Tr3 bo pričel prevajati in bo zagotovil vhodno napetost napetostnega stabilizatorja, tako bo tudi mikrokontroler pričel delovati. Opazili boste, da samo kolektorski tok tranzistorja Tr2 prihaja iz DC-DC pretvornika kalkulatorja, medtem ko Tr3 zajema tok direktno iz baterije, kar spet jamči manjšo skupno porabo.
Napetostni stabilizator je pazljivo izbran: poleg tega, da zagotavlja stabilno izhodno napetost že pri napetostni razliki vhod-izhod samo 30 mV, ima 78LC30 tudi izjemno majhno lastno porabo, tipično 1,1 µA. Pri maksimalnem izhodnem toku približno 50 mA (precej več, kot bo potreboval mikrokontroler), je bil 78LC30 idealna izbira za uporabo v AVR-modulu! Družina napetostnih stabilizatorjev 78LC se proizvaja samo v SMD ohišju, kar lahko predstavlja problem v amaterskih pogojih, ampak se je v moj projekt odlično vklopil!
Pojasnimo še vpliv svetleče LED-ice na skupno porabo AVR-modula. Med razvojem modula je bilo koristno vedeti, kdaj je mikrokontroler v spanju (v SLEEP režimu) in kdaj je aktiven. Takšna signalizacija ni potrebna v končnem proizvodu, zato signalna LED-ica v njega niti ni vgrajena. S tem niti ni pomembno, koliko takšna signalizacija troši, ampak je bila to priložnost ugotoviti minimalen tok skozi LED-ico, pri katerem še vedno opazno sveti. Kot najbolj občutljive so se pokazale bele LED-ice, ki so postale ”vidne” že pri okoli 0,5 µA toka – vrednost upora R3 na sliki 7 ni napačno označena! Tukaj ne gre za neko vrsto posebej občutljive LED-ice; od nekaj no-name LED-ic, ki sem jih imel pri roki so se vse obnašale podobno. Rdeče, zelene, rumene, modre… vse so postale vidne šele pri 30-50 µA.
Fotografija na sliki 8 prikazuje testni modul, ki je narejen na univerzalni tiskani ploščici s ”klasičnimi” komponentami. Štirikratno vezje in konektor za programiranje so uporabljeni med razvojem programa in te komponente so, skupaj z LED-ico, izpuščene na finalni verziji.
Fotografija na sliki 9 prikazuje finalni modul, ki je narejen na tiskani ploščici dimenzij 24×14 mm, da bi ga lahko montiral v originalno ohišje. Tukaj so vse komponente v SMD izvedbi, HCT126 pa je zamenjan s čipom 74AHCT1G126, kot je to na shemi na sliki 7 tudi prikazano. AHCT1G vsebuje samo en 3-statebuffer, prav toliko, kolikor sem potreboval in je znatno manjši – in tako sem na ploščico komaj uspel namestiti vse potrebne komponente. Na rob ploščice je položenih 6 spajkalnih mest, na katera se lahko prispajka konektor za priključek programatorja, da bi se, po potrebi, mikrokontroler lahko preprogramiral.
Softverski izzivi
Kot smo v uvodu pojasnili, AVR-modul ”nadomešča” originalni ROM modul HP-41C kalkulatorja s kolekcijo programov ali podatkov. Takšni moduli imajo dano strukturo: na začetku naslovnega prostora je direktorij z imeni modulov in posameznih programov, ki se nahajajo v modulu in na naslovih, na katerih so nameščeni. Nato sledijo sami programi in podatki. Kapaciteta običajnega modula je 4, dvojnega modula pa 8 kilobesed, pri čemer je vsaka beseda dolga 10 bitov. Nekateri od originalnih modulov imajo fiksne naslove v naslovnem prostoru kalkulatorja, medtem ko so naslovih drugih odvisni od tega, v katero od štirih rež so vloženi.
Pri AVR-modulu je vsebina ROM modula shranjena v Flash pomnilniku in je organizirana na identičen način kot v originalnem modulu, da bi ga lahko kalkulator prepoznal. Da bi prihranili pomnilniški prostor, je vsaka 10-bitna beseda razbita na 8-bitni in 2-bitni del, pri čemer so po štiri 2-bitni deli spojeni v en bajt – tako so štiri 10-bitne besede shranjene v pet bajtov Flash pomnilnika. Za to skrbi algoritem v programu mikrokontrolerja in kalkulator ne ”vidi” te razlike v načinu shranjenih podatkov v njegovem lastnem ROM modulu in v AVR-modulu. Če jo uporabljamo na opisani način, bo kapaciteta Flash pomnilnika mikrokontrolerja ATmega328P dovolj velika, da shranimo 5 ROM modulov.
Program v mikrokontrolerju spremlja signale na krmilno-podatkovnem vodilu in odvisno od kombinacije signalov, opravi določene akcije. Pomen posameznih signalov in njihov časovni razpored (timing) so pojasnjeni v literaturi, vendar sem se moral sam prepričati, kako to izgleda v resnici. Ker nisem imel boljšega instrumenta, sem napisal program, ki ”bere” stanje bitov na vodilu vsakih 10 µs in jih shrani v RAM mikrokontrolerja. Snemanje se prične v trenutku, ko se dogodi neka aktivnost na vodilu in traja toliko časa, dokler se ne posname 400 vzorcev. Nato program pošlje pridobljene podatke v terminalni emulator, od koder jih je bilo enostavno prevzeti in prenesti v Excel. Z malo spretnosti sem dobil prikaz, kot ga vidite na sliki 10.
Po analizi posnetka je bilo jasno, kako je potrebno napisati program AVR-modula. In tukaj je bilo nujno zagotoviti čim nižjo porabo. Potem ko mikrokontroler dobi napajalno napetost na prej opisani način, se bo program zagnal, inicijaliziral tisto, ker je potrebno in zaustavil procesor (Power-down mode). V tem stanju mikrokontroler troši zelo malo energije, v funkciji so ostali samo nekateri mehanizmi, ki lahko ponovno zaženejo procesor. Eden od njih je sprememba stanja na priključkih porta D, ki jo povzroči aktivnost na krmilno-podatkovnem vodilu. Zbujeni procesor se bo sinhroniziral s taktnimi impulzi na vodilu, da bi lahko spremljal, ali kalkulator naslavlja enega od modulov, ki so vpisani v flash pomnilniku. Ta del programa, pa tudi vsi deli, ki spremljajo aktivnost na vodilu, berejo naslove in podatke, ki jih pošilja kalkulator oziroma pošiljajo podatke kalkulatorju, je pisan v asemblerju. Če ugotovi, da ni naslovljen eden od njegovih modulov, bo program ponovno uspaval mikrokontroler; če pa je, bo poslal zahtevani podatek ali ukaz iz tabele v Flash pomnilniku in uspaval MCU do naslednje zahteve.
Dokler je aktiven, mikrokontroler dela na frekvenci 6 MHz. Tukaj je bilo zaželeno izbrati čim nižjo frekvenco, ker je od nje odvisna poraba mikrokontrolerja. To je izbrano s poizkusom: na nižjih frekvencah mikrokontroler ni bil dovolj hiter, da bi mogel spremljati signale na vodilu. Interesantno je, da pri frekvenci 8 MHz program iz neznanega razloga ni delal dobro.
Dokaz, da vse deluje tako, kot bi moralo, je prikazan je na sliki 11: kalkulator prepozna modul VLAM vpisan v razvojni komplet. Ko se je pokazalo, da lahko AVR-modul uspešno nadomesti ”goro” logičnih integriranih vezij, sem s pomočjo ustreznih programov sam prebral vsebino štirih komercialnih modulov in jih ”premestil” v AVR-modul. Tukaj je bilo veliko ”ročnega dela”, vendar je postopek uspešno zaključen.
Seveda HP-41C ne uporabljam vsak dan, to je bolj trofeja iz nekih bivših časov. Vendar pa občasno preverim, ali AVR-modul še vedno deluje in v preteklih dveh letih, ni niti enkrat odpovedal!
https://svet-el.si