Saturday, August 8, 2020

Oscillator TTL

Postaviť dobrý oscilátor riadený kryštálom nie je jednoduché. Musí byť necitlivý na zmeny napájacieho napätia a teploty ale hlavne musí vždy kmitať. Na nete je zopár schém, ale väčšinou pre ne platí, že sa to dá aj lepšie. Buďto preťažujú kryštál, alebo pracujú na hranici v inom parametri. Známa schéma s dvomi hradlami preťažuje oscilátor, ten má preto veľmi nízke Q a obvod sa nemusí vždy rozkmitať. A ak je aj iná schéma lepšia tak nakoľko TTL rodina má veľa typov a radov, vyvstáva otázka ktorý rad a konkrétny typ použiť. Občas sa dokonca vyskytnú aj chyby typu, že niekto použije známu schému s 7404 hradlami, ale v rámci nejakej nepozornosti, nevedomosti alebo optimalizácie počtu čipov sa rozhodne použiť 7414, čo je Schmitt ekvivalent 7404. Takýto oscilátor určite nebude kmitať na očakávanom kmitočte.

” I have a 16 MHz quartz crystal that I’ve hooked up with a Pierce oscillator circuit (diagram attached) and which oscillates at the wrong frequency, around 40 kHz.”
“A Schmitt trigger won’t work in this kind of circuit. Use a 74HC04 instead. I think the first inverter in your CMOS Crystal Oscillator circuit has to be linear, and should be unbuffered.”
“Thank you, that was the problem.”

Krátke zhrnutie je takéto: nikdy nepoužívat Schmittove hradlá a radšej nikdy nepoužívať buffered typy. Pokiaľ možno používať CMOS typy, Pierce topológiu oscilátora a vyhýbať sa LS alebo ešte starším TTL. Prvý stupeň oscilátora by mal pracovať v lineárnom režime. Pre oscilátory sú výhodné špeciálne unbuffered typy ako napr. 74HCU04, 74LVCU04. Čo sú buffered a unbuffered je vysvetlené napr. v "Texas Instrument - Application Report SCHA004 - October 2002". Ďalšie výborné zdroje informácii o oscilátoroch sú "Texas Instrument -Application Report SZZA043 - January 2004" a šlabikár oscilátorov "Fairchild Semiconductor Application Note 118 October 1974".

Ja som sa trošku pohral s oscilátormi v rámci návrhu NCB48 a nakoniec som použil hotový oscilátor. Ono je to tak, buďto má čip vlastný oscilátor (8085, 8048, 74HCT4060), alebo to nebude robiť to čo má:-) Výrobca to má väčšinou zvládnuté na stopro a my len pripojíme kryštál a pár pasívnych súčiastok, alebo použijeme hotový oscilátor, alebo prídeme s nejakým nie moc dobrým riešením. Lenže nie vždy sa podarí nájsť požadovaný hotový oscilátor na trhu, TTL oscilátory už vymierajú a aj výber frekvencií je nižší ako u samotných kryštálov. Tiež môže nastať situácia, že potrebujeme tri rôzne oscilátory, ale kúpiť sa dajú len po 10 kusov. Namiesto kupovania 30ks by bolo lepšie mať univerzál 3ks a osadiť si ich podľa potreby.

Preto som sa rozhodol vyskúšať obvody od Philipsu špecificky navrhnuté pre oscilátory. Prvý je 74LVC1GX04. Kombinuje v sebe funkčnosť buffered a nebuffered hradiel 7404, je typu CMOS, funguje od 1.65V do 5.5V a je v miniatúrnom puzdre TSOP6.



Navrhol som dve doštičky. Jedna má vývody ako štandardný Half-Can TTL oscilátor a má rozmery DIP-8. Napájanie +5V je klasika pin 8, GND je pin 4, výstup je pin 5. Pin 1 je NC. Osadil som ju do NCB48. Používa 1206 SMD rezistory a kondenzátory. Preto je obtiažne na nej experimentovať a hľadať použiteľné hodnoty pasívnych súčiastok.
Druhá doštička je experimentálna, osadzuje sa klasickými odpormi a kondenzátormi. Ja som ju osadil iba zdierkami zo socketov. Takže môžem bez letovania vymieňať súčiastky a hľadať rozsah použiteľných hodnôt.

Druhý obvod, ktorý som vyskúšal je 74HCT6323A. Puzdro SOT96-1, rozsah napájania 3-6V. Je trošku drahší, ale obsahuje preddeličku. Preto sa môže použiť kryštál, ktorý kmitá na násobku požadovanej frekvencie. Podobne ako u 74LVC1GX04 som vytvoril dve verzie. Jedna je s vývodmi ako Full-Can TTL oscilátor a má rozmery DIP-14. Používa 1206 SMD súčiastky.

Druhá verzia je zase experimentálna, osadená zdierkami na rýchlu výmenu klasických súčiastok.



Použitý kryštál 16.666MHz a zapojenie preddeličky /2 dáva na výstupe z oscilátora 8.333MHz so striedou perfektných 50%. Namiesto 2k2 rezistoru som musel použiť kondenzátor 47p (fungoval aj 68 a 78), presne ako sa píše v datasheete. Rozmermi aj frekvenciou pasuje do Atari XF-551.
Všetky doštičky sa dajú objednať na OSH Park https://oshpark.com/profiles/archeocomp

Saturday, November 16, 2019

Blog wait-state

Do 8-bitovej retro komunity pribudol nový blog z najväčšej die.. z Prievidze :-)
wait-state.blogspot.com

Marián tu bude popisovať svoje počiny. Hneď na úvod má lahôdku v podobe nádherne prevedenej úpravy Consul klávesnice a jednej historickej perličky.

Wednesday, October 2, 2019

DCF-77 decoder

Niekde som čítal, že dnes sa už asi nikto do projektov s 8048 nebude púšťať. Napísal som program pre 8048 na dekódovanie časového signálu DCF-77 z Mainflingenu. Vysiela sa od roku 1970 výkonom cca 50kW a ako jediný v Európe ešte nejakú dobu určite bude. Program je síce bohato okomentovaný, ale aj tak by som ho o pár rokov asi márne lúštil, tak tu je rámcový opis. Program je na Githube tu: https://github.com/ncb85/ncb48/tree/master/dcf77

Ako sa vysiela DCF-77 je krásne vidno tu: DCF-77 Live


Na obrázku je vyznačené, kde sa nachádzajú minúty a hodiny (formát je BCD+parita - dvojkové číslo sa číta zprava, nie zľava ako je zvykom)

Signál má sekundový takt. Logická 1 má na začiatku sekundy 200ms vysokú úroveň, po zvyšok je signál v nízkej úrovni. Logická 0 má na začiatku sekundy 100ms vysokú úroveň, zvyšok nízku. 8048 má hodiny 4.9152MHz, čo dáva takt timer prerušenia 40Hz. To znamená, že sekunda je vzorkovaná 40x. Pre logickú 1 musí byť prvých 8 vzoriek vo vysokej úrovni a pre 0 iba štyri vzorky. 8 a 4 sú celkom výhodné čísla. Jeden byte je 8 bitov.

Takto nejako:
jednotka         1111111100000000000000000000000000000000
nula                1111000000000000000000000000000000000000
60. sekunda    0000000000000000000000000000000000000000

Jeden byte RAM používam ako posuvný register. Pri každom prerušení nasuniem aktuálnu logickú úroveň do byte zprava. Bit naľavo vypadáva. Potom si rozdelím byte na dve polovice. A spočítam koľko jednotiek je v každej polovici. Ak nájdem jednu polovicu takú a druhú onakú, tak máme prechod z jedného stavu do druhého. Vtedy si nastavím ďalší pomocný byte ako counter a počítam čas od do. Vyhodnocujem dĺžku vysokej úrovne pulzu a kontrolujem min./max. šírku obidvoch častí pulzu. Výsledkom sú v sekundovom takte pulzy 1 alebo 0 (ako na obrázku hore), alebo chyba. Toto sa deje v prerušení od timer, preto aj názov - timer.asm   Z princípu funkcie vyplývajú dve veci: program (ale nie čas hodín) je 4 prerušenia (0.1s) oneskorený za vysielaním a prerušenie sa vykonáva 40x za sekundu ale výstup z neho (PULSE_VALID) je iba 1x za sekundu.

O úroveň vyššie je decoder.asm. Nepracuje už v prerušení, ale v hlavnej slučke. Tam z pulzov vychádzajúcich z timer.asm dekóduje čas. Čas je priamo v BCD. Výsledný čas okrem kontroly na paritu kontrolujem aj formálne, aby nebol napr. 28:62. Ako je známe maximum je 23:59 :-) Kontrolujú sa aj bity 1 a 20, ktoré majú vždy pevnú hodnotu 0 resp. 1. Okrem toho kontrolujem prítomnosť kompletnej sekvencie pulzov. Aj posledná sekunda (samé 0) sa musí objaviť len v dobe pre ňu určenej. Po uplynutí aktuálnej minúty sa nastavuje nový čas z vysielania, samozrejme ak prešiel všetkými kontrolami. Kontroly sú také poctivé, že zatiaľ som nikdy nevidel falošný čas.

Aktuálny čas 8048 sa posúva pri každom prerušení v clock.asm S výhodou sa využíva inštrukcia DA A na počítanie s BCD číslami. A nakoniec sa aktuálny čas zobrazuje. Dá sa aj staticky aj multiplexne. Pre rôzne moduly displayov sú rôzne asm file. dis2x595.asm je pre 8-miestny multiplexovaný modul z eBay (hľadaj 74HC595 LED display), disNx595.asm je pre statické 2,3,4 miestne zreťazené moduly z eBay (hľadaj 74HC595 static LED display)

Pridal som aj modul s čipom DS1302 zálohovaným batériou CR2032, aby sa mohli hodiny aj vypínať. DS1302 je obvod hodiniek s tepelne nekompenzovaným externým kryštálom 32.768kHz a za deň si v kľude ubehne aj pár sekúnd od presného času. Za mesiac to ide do minút. Po zapnutí sa preberie čas z DS1302 a po rozlúštení časového signálu, čo môže trvať aj dlhšiu dobu, sa čas upraví na presnú hodnotu.

Pripojenie prijímača DCF je do vstupu T0. Momentálne su pulzy invertované, lebo ich prevádzam na TTL úroveň jedným NPN tranzistorom - výstup je z kolektoru. Ak by boli pulzy neinvertované, je treba zmeniť inštrukciu JT0 na JNT0 (v timer.asm)
_TCIN2   CLR C
         JT0 _TCIN3
Výstup na riadenie display a komunikácie s DS1302 je na porte P1.
P1.0 data pin of display
P1.1 clock pin of display
P1.2 latch pin of display
P1.3 data pin of DS1302
P1.4 clock pin of DS1302
P1.5 CE pin of DS1302

Sunday, June 2, 2019

SAP48 1. Programmer

Pre ROM/EPROM typy členov rady MCS-48 potrebujeme aj programátor a čítačku programovej pamäte. Na programovanie sú potrebné dve napätia 25V a 23V, prípadne 21V a 18V, podľa toho či máme NMOS alebo HMOS obvod. Tesly sú NMOS. Pri ROM verziach je treba znížiť napätie VDD na 12V a druhé napätie PROG odpadá. Programátor TL866 (de facto nový bastler štandard) a podobné už 8748 nepodporujú. Asi kvôli tým dvom napätiam. Arduino Mega stojí cca 7,- EUR a má 8kB RAM a my potrebujeme 1kB alebo 2kB na dáta programovej pamäte 874X a pár byte na premenné programu. Arduino Uno je lacnejšie, ale má iba 2kB RAM, čiže pár byte by pri 8749 chýbalo. Takže som navrhol shield pre Megu so zero insertion force socketom a pár súčiastkami k tomu.



Na doske sú dve LED pre kontrolu ALE signálu. Ak svietia približne rovnakým jasom, tak je čip funkčný a generuje ALE signál. Ak nesvietia rovnako, niekde je problém a pokus o programovanie čipu by bol fatálny. Prúd LED v kľudovom stave nie je rovnaký, ale ALE (ale to sú náhody) signál je silne nesymetrický a jeho prítomnosť pôsobí tak, že obidve svietia rovnako silno. Pri inej svietivosti LED to môže byť trošku rozdielne, ale vždy by sa mali približne vyrovnať.

Ďalšia LED ukazuje prítomnosť napájacieho napätia 5V a posledná signalizuje keď je na PROG vstupe vysoké programovacie napätie. Potrebné napätia sú stabilizované pomocou troch kusov LM317. Vo Willem programmeri je hardwarovo nemožné mať na PROG vysoké napätie ak je na EA nízke. Čo by bolo mimochodom tiež fatálne. Tu je to ošetrené iba softwarovo. Na rozdiel od Willlema a legendárnej konštrukcie "Univerzální programátor pamětí" v červenom AR 11/88 je tu ale PROG pin v neaktívnom stave naozaj floating a nie na 5V, čiže tak ako je to v dokumentácii výrobcu. Ale asi to nie je katastrofické, lebo Willem vie naprogramovať tieto čipy aj viac krát a nie iba prvý a posledný raz. Willem vytvára nižšie napätie 23/18V z vyššieho 25/21V zaradením 3 kusov diód .. čo nie je celkom dokonalé:-) Pretože požadovaná delta je v prvom prípade 2V a v druhom 3V.

Obslužný program je napísaný v jazyku Arduina. Komunikuje cez sériovú linku 9600 baud, 8-bit dáta, 1-stop bit, no parity. Je možné využívať aj zabudovaný terminál v Arduino prostredí, ale doporučujem použiť napr. Hyperterminál. Cez terminál nahráme Intel HEX do pamäti Arduina, skontrolujeme a naprogramujeme. Okrem programovania je možné aj iba čítať obsah ROM a EPROM programovej pamäte vložených čipov. Čítanie EPROM zároveň aj vyhodnotí, či je čip zmazaný (obsahuje samé nuly). Vždy napíše Chip is erased, ready to be programmed. alebo !!!Chip is not erased!!! ak EPROM nie je zmazaná. Program je tak trochu aj "blbuvzdorný". Podarilo sa mi poslať do Arduino program trošilínka presahujúci 1024 byte a pohoda. Nadbytočné byte odignoroval a 8748 správne naprogramoval.

Popis ovládania:
Cvýber typu 8748 (1kB) alebo 8749 (2kB)
Tvstup do testovacieho menu, kde je možné nakalibrovať napätia a otestovať funkčnosť tranzistorových spínačov
Lnahrá Intel HEX do RAM pamäte programátora
Hpošle obsah RAM pamäte programátora do terminálu vo forme Intel HEX
Pnaprogramuje obsah RAM pamäte programátora do čipu v sockete
Rprečíta obsah ROM/EPROM vloženého čipu a uloží ho RAM pamäte programátora
Vporovná obsah RAM s obsahom ROM/EPROM na čipe v sockete

Schéma je tu
Program je na GITHUBe tu

Doporučujem osadiť najskôr súčiastky, potom lišty s headrami a nakoniec socket. Rezistor R22 sa neosádza pozri DOPLNENIE. Pri R25 4k7 nie je dobre vidno hodnotu na doske. Programátor vyžaduje nastavenie správnych napätí ručne pomocou trimrov na doske. Preto nemožno bez prestavenia napätí striedať EPROMkové NMOS s EPROMkovými HMOS čipmi a ani ROM čipmi. Ja som nastavil 5.1V, 18.1V a 21.0V na vyskúšanie HMOS. Stabilizátor pre 5V má veľký úbytok a potrebuje chladič. Čip vložíme do programátoru, až keď sú všetky napätia skontrolované (položka menu T) a v nízkom stave, a tiež iba vtedy keď je Arduino napájané cez USB. Pre pokrytie aj HMOS aj NMOS napätí 21V-25V a 18V-23V je treba aby P1 a P2 mali hodnotu 2k. EPROM potrebujeme sem tam aj vymazať. Slnečný svit je slabý, ale kto nemá mazačku nemusí zúfať, pretože UV sterilizátor na zubné kefky z eBay funguje výborne a schváli ho aj manželka.

Programátor som otestoval na pár HMOS čipoch, aj násobne na tom istom čipe a s testom v doske NCB48 a bez nehody. Na oživenie bastlenia na MCS-48 by pre začiatok mohol tento komplex schém, dosiek a programov stačiť. Pár dosiek NCB48/SAP48 a súčiastok ešte nájdem, tak kto chce nech napíše. Rád by som zrealizoval programátor s SMD súčiastkami. Ešte by som ho rád celý vtesnal do 3D tlačenej krabičky ako napr. zmienený TL866.



DOPLNENIE: ozvali sa mi používatelia a záujemci o SAP48 a pri výmene skúseností a komunikácii sa zistilo nasledovné. HMOS verzia 8748H/8749H má občasný problém. Symptóm je taký, že sa naprogramuje pár byte a potom sa zistí chyba a programovanie sa zastaví. Pri inej konštalácii hviezd ten istý čip na druhý deň môže prejsť až do konca bez chyby. Identický problém (pri Willem programátore) aj s riešením je popísaný na vintage computer fóre tu: http://www.vcfed.org/forum/showthread.php?24379-Needed-Microcontroller-programming-(D8749). Príspevky #4,#6,#9,#11,#14
Takže sme ja a Marián osadili R22 odporom 1M s paralelne pripojeným kondíkom 4n7 (ja som našiel iba 680k odpor) a programovanie už zbieha bez zaváhania. Bude sa jednať o nejakú chorobu HMOS 8748/49, ktorá zdá sa postihuje aj HMOS EEPROM INTEL D2816. V datasheetu k D2816 na strane 2-31 dole v odstavci Vpp Pulse "píšou něco o tom, že Vpp musí růst exponenciálně (RC waveform)" ako si všimol Melsoft.

Zmenu som uviedol aj do schémy. Zatiaľ asi nikto neprogramoval NMOS verziu, ale tá by podľa linkovanej témy mala byť bezproblémová aj bez modu. Aj ja aj Marián aj Melsoft sme už bez problémov programovali aj TESLA NMOS MHB8748. Nakoľko sme už mali MOD z programovania HMOSov, tak sme len zvýšili napätia a fungovalo to aj na NMOS.
DOPLNENIE 2: zoznam podporovaných typov môžeme rozšíriť aj o 8741 a 8742. Marián vyskúšal a funguje.

NCB48 3. Software

S MON48 monitorom sa pracuje jednoducho. Veď som ho aj spáchal za jeden veľkonočný predĺžený víkend:-) Napíše sa program, assembler/linkerom sa vytvorí HEX. Potom sa HEX pošle (buďto cez send file funkciu terminálu, alebo copy/paste do terminálu). Monitor spracuje HEX a uloží do programovej pamäte. Ladený program sa môže spustiť voľbou G alebo H. Aj keď je EA pin nastavený na internú pamäť programu, pri prekročení poslednej adresy sa MCU samo prepne na používanie externej programovej pamäte. Pri 8748 máme síce iba 64 byte pre dáta, ale pre vlastný program máme rozsah 400H-FFFH. Pri 8749 máme 128 byte pre dáta, ale pre vlastný program iba 800H-FFFH. Po návrate cez inštrukciu RET sa vypíše obsah flagov a môžeme prezerať obsah dátovej RAM cez príkaz I. Ak je monitor nepotrebný, tak spúšťame program od 000H tlačítkom reset s prepnutím na externú pamäť a máme k dispozícii celý rozsah 000H-FFFH

Popis príkazov monitora (dajú sa ukončiť CTRL-C), upload HEX nepotrebuje príkaz:
Ddump programovej pamäte, zadáva sa číslo stránky
Idump internej dátovej pamäte, autodetektne veľkosť 64 alebo 128 byte
Edump externej dátovej pamäte 256 byte v 8155
Smodifikácia programovej pamäte, zadáva sa adresa 000..FFF potom vstup jedného alebo viac byte
Mmodifikácia internej dátovej pamäte
Xmodifikácia externej dátovej pamäte
Gskok na adresu 400H
Hskok na adresu 800H


Ukážka uploadu Intel Hex a následný DUMP page 3, obsah pamäte je MON48.

Dve banky
Pri spúšťaní programu pomocou H a všeobecne pri programoch dlhších ako 2048 byte je tu rodinný MCS-48 zádrhel. Program counter PC je interne iba 11 bitový. To implikuje rozdelenie programového pamäťového priestoru 4kB na dve banky po 2kB. Pre úspešný skok z jednej banky do druhej musíme použiť dve inštrukcie. Jednu na nastavenie klopného obvodu pre bit 12 PC. A potom skočiť pomocou JMP alebo CALL v rámci 11 bitového priestoru, ale skončíme v druhom priestore. Taký malý hviezdny teleport:-) A pri zavolaní RET nastane zábava. Nakoľko je všetkých 12 bitov adresy uložených na stacku, tak sa ako očakávame vrátime do pôvodnej banky, ale klopný obvod pre bit 12 PC ostane nezmenený. Čo sa asi tak stane pri ďalšom JMP alebo CALL? A čo treba urobiť po návrate z teleportu do pôvodnej banky, aby sa program správal predvídateľne? Domáca úloha:-)

Prerušenia
Prerušenia sú dve, z pinu INT a z interného timer/countera. Po celú dobu prerušenia je bit 12 PC vždy nula. Preto sa v obsluhe prerušenia nedá volať žiadna rutina z hornej banky. Ďalší interrupt je zakázaný, povolí sa až vykonaním inštrukcie RETR. RETR zároveň obnoví aj banku registrov a flag F0. Vo flagu F1 sa preto môže posielať jednobitová informácia z prerušenia. Pri pretečení timer/countera sa nastaví flag TF, a vynulovať sa dá tento flag iba vykonaním inštrukcie JTF. Pre návrat z volaní CALL by sa mali v rámci interuptu používať inštrukcie RET, pretože nepovoľujú nové prerušenie.

Meranie času
Interný timer má na vstupe signál, ktorý sa získa tak, že CPU delí frekvenciu kryštálu 3, potom 5 a nakoniec 32 krát. Čo dáva takt 32 inštrukčných cyklov. Counter/timer počíta do 256 (čiže 8192 inštrukčných cyklov) a pretečie, v prerušení si môžeme počítať už čas. Existuje zopár kryštálov, ktoré sa dajú vydeliť na celé čísla. 9.8304MHz a 6.144MHz sa používajú aj pre konštrukcie s CPU 8085. 11.0592MHz zase pre zapojenia s o generáciu novším MCU 8051. Kryštál 3.6864MHz vyhovuje predpisu 3 až 4 MHz pre programátor a zároveň je vhodný aj na presný čas. Tu je tabuľka bežných kryštálov:

FrequencyRateNote
1228800100pre taktovačov
1105920090CMOS sa fláka
983040080
737280060
614400050TESLA tu asi končí
491520040
368640030SAP48
245760020pre padavky

V stĺpci Rate je počet prerušení za sekundu.

Matematické rutiny
V tej dávnej soc.dobe som mal k dispozícii na strednej škole kufríkač SB8035 (jediný kus pre celú školu a ani o ten nemal nikto záujem) a na ňom som si napríklad overil rutiny na sčítanie, odčítanie, násobenie a delenie 16-bitových čísel. Trošíčka problém bol, že násobenie a delenie som vtedy vedel iba v cykle, postupným pripočítavaním alebo odpočítavaním. Literatúra s lepšími algoritmami v socíkovských školách neexistovala, poradiť tiež nemal kto. Takže násobenie 65536 x 1 trvalo 65536 iterácii programu. Delenie 65536 / 1 rovnako. Ešte stále si pamätám, ako pri takýchto hraničných hodnotách na chvíľu zhasol display na SB8035 a potom zobrazil správny výsledok. Dnes už to viem aj rýchlejšie, iterácii stačí toľko, koľko bitov majú operandy. Treba pozrieť GITHUB.

Assembler/Linker
Na preklad MON48 som použil Telemark Assembler vo verzii 3.2, ktorá beží natívne pod Windows. Telemark upozorní, ak nájde relatívny skok mimo aktuálnej stránky. S kratším kódom pre MCS-48 som vyskúšal aj Macro Asembler AS, ktorý je použitý na BIOS pre NCB85 a tiež ASXXXX assembler, ktorý je použitý pre programy na CP/M kompilované pomocou SmallC kompilátora. ASXXXX má aj linker a možnosť projektov pozostávajúcich z viacerých zdrojových file. Obidva tieto assemblery tiež správne detekujú nepovolené relatívne skoky mimo stránky. Vyskúšal som aj XASM48 čo je Avocet 8048 Cross Assembler pre moje obľúbené CP/M. S Wordmasterom by to bolo super CP/M vývojové prostredie. Už len nejaký ten programátor 874x pre NCB85 chýba.

Záver
MON48 má ešte rezervy, viac ako 256 byte z 1024 je stále nevyužitých. Je možné dorobiť breakpointy, fill alebo iné príkazy. Bolo by zaujímavé naportovať Petr(a)48 na NCB48 a terminál. Ale zatiaľ sú moje vedomosti o Petrovi nedostatočné. Pohodlie Arduina alebo aspoň ISP programovania rady MCS-51 procesory rady MCS-48 s alebo bez EPROM nikdy neponúknu. Ale práve prítomnosť EPROM, prípadne externej EPROM ich robí magickou. Mazať si EPROMku cez priehľadné okienko UV svetlom a sledovať stopky, zapísať program do EPROM napätím 25 voltov, to je dnes už rarita. Presne takýto zážitok ponúka NCB48 a SAP48.
MON48 je na GITHUBe tu

NCB48 2. Hardware

NCB48 je maličká a pomerne hutná doštička s MCU z rodiny MCS-48, periférnymi čipmi UART 8251, RIOT 8155 a ROM/RAM externou pamäťou programu. Môže byť použitá ako výukový, vývojový, ladiaci počítač, čo vyžaduje verziu MCU s internou EPROM, ale aj ako samostatne fungujúci počítač kde sa dajú s výhodou využiť verzie CPU bez EPROM. Pre prvé využitie je k dispozícii monitor MON48 s možnosťou nahratia programu cez sériový port, výpisu registrov, pamäti a spúšťania vlastných programov. Program nahraný do externej programovej pamäte RAM sa potom spustí z menu monitora ak sa jedná o program na adresách 400H alebo 800H. Alebo od adresy 000H stlačením druhého tlačítka RESET s preklopením EA pinu do externého módu. V internom móde EA pinu MCU plynule prechádza medzi internou ROM s monitorom a externou programovou pamäťou pri prechode cez adresu 400H alebo 800H, podľa použitého čipu. Pri prepnutí na externú pamäť máme pre vlastný program k dispozícii celý rozsah 4kB 000..FFFH v externej pamäti.



Ďalej doska obsahuje obvod 8155, ktorý pridáva 256 byte externej dátovej RAM, jeden 14 bitový čítač/časovač a tri paralelné brány. Vstup do timeru v 8155 je odvodený z oscilátora 74HCT4020 a má frekvenciu 76.8kHz. Pri režime 8155 timera kedy sa po dopočítaní generuje jeden impulz s periódou 1/f to zodpovedá cca 4.3 inštrukčnému cyklu pri kryštáli 4.9152MHz, 6.3 cyklu pri kryštáli 6.144MHz, a 11.3 cyklom pri kryštáli 11.0592MHz. Pri prerušení z timeru 8155 je jedna perióda dostatočne dlhá na to, aby interrupt bol vždy detektnutý a zároveň je dostatočne krátka na to, aby sa po návrate z prerušenia nevyvolalo hneď ďalšie. Pinom P2.4 MCU sa volí medzi IO a MEM v 8155.

Pre sériovú komunikáciu nezávislú od rýchlosti MCU tu je klasická 8251A so samostatným oscilátorom a voľbou prenosovej rýchlosti v rozmedzí 19200-1200 baud pomocou jumpera. Pre MCU sa môže použiť ľubovoľný kryštál 1-11MHz. Pre NMOS verzie max 6MHz. Na ukladanie programu je tu programová RAM. Prístup do nej je vďaka pomocnej logike možný nielen signálom PSEN, aby sa dal z nej spúšťať program ale aj signálmi RD a WR, aby sa dala modifikovať a prehliadať.

Pre nasadenie dosky ako samostatného počítača sa dajú použiť aj verzie MCU bez EPROM, čiže 8035/8048, 8039/8049 alebo 8040/8050. Vtedy je treba mať na pozícii externej pamäte programu EPROMku. Použiť sa dajú aj 24 pinové aj 28 pinové EPROM. Zlatá kombinácia 8050, 8251, 8155 a 2732 nám dáva riadiaci počítač s omračujúcimi hodnotami 4kB programovej pamäte, 512 byte RAM, dvomi timermi, sériovým portom a cez 30 IO pinov pri dych berúcej rýchlosti.

Zapojenie sa vyvíjalo a menilo. Prvá verzia bola s TTL logikou, ale súčiastok bolo už priveľa. Reset bol riešený s RC členom, tranzistorom a Schmitt hradlom. Celé sa to postupne zjednodušilo do výslednej podoby s jedným TTL oscilátorom, binárnou deličkou a jedným GAL. Súčasná podoba stále nie je 100%. Vynechanie Schmitt triggera sa prejavilo. RESET po zapnutí napájania nie je spoľahlivý. EA pin sa nastaví správne, ale MCU sa nie vždy rozbehne. Ručný RESET cez tlačítka je spoľahlivý. Prekvapivo ma najviac potrápil obvod UART 8251. Nenápadný vstup CLK, ktorý v NCB85 na seba žiadnym spôsobom neupozornil tu robil problémy. Nedá sa kŕmiť ani signálom ALE z CPU ani výstupom z 74HCT4060. Podarilo sa mi síce rozkmitať 74HCT4060 pri prihnutých hodnotách odporov aj s kryštálom 19.6608MHz, ale ani to nestačilo. UART potrebuje rýchle hodiny. S CPU síce UART komunikuje, ale piny Rx a Tx nereagujú. Preto tu je na rozdiel od NCB85, použitý 74HCT4020 a samostatný oscilátor. Z pomocných IC z prvej verzie neostal vo výslednej ani jeden jediný. Oscilátor funguje 4.9152MHz, ale aj 2.4576MHz. Podľa skúseností z NCB85 by mal fungovať aj oscilátor 9.8304MHz. Na doske sú vyznačené baud rates pre oscilátor 4.9152MHz.

Schéma je tu
GAL logika je tu

NCB48 1. Intel MCS-48

Není to první případ, kdy zákazníci útočí na adresu TUZEXU a zahraničních dodavatelů a obviňují je z podobných úmyslů. Častý je také názor: To jistě zase TUZEX nakoupil ve výprodeji vadné výrobky a podobně. Ptáme sa z čeho vychází tato kritika? Je skutečne vinou TUZEXU, že počítač ATARI 800 XL platí čs. zákazník dvěma měsíčnimi platy, když v NSR jich za jeden plat dostane cca 10?
Z Atari zpravodaje 1987/06.

Intel predstavil radu MCS-48 cca v roku 1976. V roku 1986 vyšli v Amatérskom Rádiu články o modernej a perspektívnej súčiastke TESLA MHB8035/8048/8748. V tej dobe boli PMD85 plné desiatok IO, boli veľké, potrebovali poriadny zdroj, ktorý vážil zopár kg a tu som si čítal o jednom jedinom IO v púzdre DIP40, ku ktorému stačí pripojiť kryštál, tri kondenzátory a napájať ho 5V/50mA. Bolo to prevratné. A pritom ten obvod bol rýchlejší ako CPU v PMD85. Navyše 8748 mala svoju EPROM a každý si ju mohol naprogramovať svojím programom. Skrátka bol to malý zázrak a ja som po ňom hned zatúžil.



Na jednom čipe 8748 je 8 bitové CPU, EPROM 1kB, 64 byte RAM a tri 8 pinové brány. (pozn. 64 byte RAM naozaj nie je preklep). Dva testovacie vstupy, jeden prerušovací vstup a jeden 8 bitový časovač. To je všetko. Typ 8048 má 1kB ROM pamäť programu, kde sa obsah nastavuje pri výrobe čipu. Typ 8035 nemá definovaný obsah ROM. O stupienok vyššie sú typy 8039/8049/8749. Majú už luxusných 128 byte RAM a 2kB ROM/EPROM (8039 nemá definovaný obsah ROM) a typ 8040/8050 má dokonca nepredstaviteľných 256 byte RAM, ale nemá verziu s EPROM. Iba verziu s 4kB ROM (8050), alebo bez definovaného obsahu ROM 8040.

RAM / CODEundef.  ROM  EPROM
64 / 1 kB803580488748
128 / 2 kB803980498749
256 / 4 kB80408050none

MCS-48 používa Harwardskú architektúru, kde sú samostatné pamäťové priestory pre program a pre dáta. Intel 8080 mal Neumannovskú architektúru, kde program a dáta zdieľajú spoločnú pamäť. Inštrukčná sada je brutálna, nemá odpočítavanie, a tak trochu očakávane nemá ani násobenie a delenie, ale to nemala ani 8080. Nemá podmienené CALL a RET. Nemá ani compare a chýba jej Zero flag. Má ale inštrukcie JZ a JNZ, JB a user flagy F0, F1. User flag F0, flagy CY a AC sa ukladajú na stack pri každej CALL inštrukcii a prerušení. Inštrukcia RETR ich pri návrate obnoví.

RAM 64 byte je rozdelená nasledovne: najskôr 8 registrov R0 - R7, potom je tu 16 byte na zásobník, ktorý má iba 8 úrovní. Nasleduje druhá sada 8 registrov. Takže to je dohromady 32 byte. Pre premenné programu ostáva zvyšných 32 byte. Adresné priestory sú kapitola sama o sebe. 8048 má pamäť programu(internú/externú), pamäť dát(internú/externú), I/O priestor a expandér. Interná pamäť dát sa okrem priameho prístupu cez R0-R7 dá adresovať aj nepriamo cez obsah R0 a R1, externá pamäť dát iba tak. Pamäť programu má counter iba 11 bitový. Na prechod do hornej banky (a potom späť) treba meniť špeciálnou inštrukciou stav klopného obvodu, vyberajúceho banku 2kB.

Nejakým socanovským čachrom sa mi cca v roku 1988 podarilo jednu MHB8748 "zohnať". Nie kúpiť. V socíku sa zháňalo, veci sa nedali kúpiť v obchode. Lenže aj keď som už mal TESLA MHB8748, tak som stále nemal ani programátor a ani mazačku. Do poznámkového bloku (papierového) som si písal program na palubný počítač do auta na báze 8748. S Gorbačovom prišlo uvoľnenie, nežná revolúcia ukázala silu miliónov v uliciach, okupanti rusi museli odísť do svojej ríše zla a k nám sa pomaly vracali pokrok, civilizácia a prosperita. V roku 1992 som si na mojom prvom vlastnom PC/XT vyskúšal assembler pre 8048, potešil sa, ale programátor a mazačka stále neboli. A chvíľku neskôr prišli ATMEL AT89C2051 a vtedy to už pár rokov nebol socík a jeden som si normálne v obchode za cca 90 korún kúpil. AT89C4051 so 4kB Flash bol pre študenta už moc drahý. A v (ešte) socíkovskom dožívajúcom aute r.v. 1974 bol za chvíľu aj palubný počítač vlastnej konštrukcie (AT89C2051+ 4x74164 + 4x7-segm.LED). Ten papierový poznámkový blok s kódom pre 8048 som vtedy niekedy vyhodil. Jedna éra skončila.

Dnes už o tom čipe takmer nepočuť, ale panečku skúste si otvoriť červené AR8/90 stranu 301. Alebo červené AR7/90, stranu 257. Alebo inzerciu v tých istých číslach. A samozrejme musím spomenúť seriál, "JEDNOČIPOVÉ MIKROPOČÍTAČE ŘADY 8048" ktorý bol jeden z mála zdrojov informácii - červené A7,8,9/86. Mimochodom rád by som si pozrel "Příručka programování Mikropočítačů řady 48, Ing. Vojtěch Mužík a kol, Knižnice ČSVTS Mikroprocesorová technika, Svazek 12, Díl 2, 1986" - 162 stran.", ale nemám ju.

Rada MCS-48 bola nesmierne populárna, v klávesniciach do PC sa jej nasadili milióny. V tlačiarňach pre PC, rôznych meracích prístrojoch, v spotrebnej elektronike a v priemysle podobne. Okrem Intelu ju vyrábali aj AMD, Toshiba, Philips, NEC, NSC a iní. OKI a DAEWOO pridali aj CMOS verzie so spotrebou cca 10mA a zopár nových inštrukcií (1988_OKI_Microcontroller_Data_Book.pdf). SIEMENS pridal nejaké nové inštrukcie a ubral nejaké staré.. Moja TESLA MHB8748 prežila aj dve sťahovania a zakaždým na mňa hľadela zo šuflíka ako taká nemá výčitka. Celkovo viac ako 30 rokov. Stále som si hovoril pekná, ale nechaj ju v šuflíku. Je nepoužiteľná, komplikovaná a limitovaná. Strata času, nezmysel. V ďalších článkoch popíšem UVKSC-48:-)


Na obr. UVKSC-48, úplné vývojovo konštrukčno softwarové centrum pre MCS-48, aj s tými Amárami ako knižnicou:-) Za Amára ďakujem Liborovi.

DOPLNENIE Netrvalo to dlho a ozval sa mi jeden fanda, že nech sa páči tu máš naskenoveného toho Mužíka. A keď už som v tom listoval, objavil som že sa tam spomína assembler pre SMEP. Čiže mali sme na škole SM50/50 a kufríkač SB8035, mohlo sa na tom slušne vyvíjať. Ale pre SMEP za odhadom cenu rodinného domu nebol assembler (jedna disketa) ani žiadna literatúra (ani len k textovému editoru a podobne) za cenu (aj s disketou) odhadom 25,- Kčs. Mužík je na stiahnutie Příručka programování Mikropočítačů řady 48, Ing. Vojtěch Mužík a kol, Knižnice ČSVTS Mikroprocesorová technika, Svazek 12, Díl 2, 1986 - 162 stran.