PMD 32-SD pre lenivých

… teda úprava známeho emulátora PMD 32 bratov Bórikovcov pre tých, ktorým sa nechce riešiť plošák, pájkovať slot pre SD kartu a oživovať ATmegu v programátore; zato majú doma Arduino, alebo jeho lacný klon, a vedia si navrch “nacvaknúť” displej z Aliexpressu za pár chechtákov.

Zdrojový kód projektu dostupný tu.
Ten bluescreen na konci je vtip, na osembiťák s 8K RAM nedám ani DOS, nie tak Windows 🙂

V minulosti som tu spomenul PMDčko v článku určenom skôr pre “západné publikum” a po tomto emulátore som pokukoval už dlhšie. Tým, že PMD 32-SD je pôvodne napísané pre AVR, a pod “hračkárskym” Arduinom som si vyskúšal pár malých projektov (floppy radič, digitronové hodiny), vytvoriť jednoduchý variant pre dosku s Mega2560 nečinil žiadny problém.
Navyše, pod túto platformu existuje priehršť rôznych open source doplnkov, či už kvalitnejších (Adafruit) alebo menej (čínske no-name moduly). Takže už nejaký ten piatok je ľahké pripojiť pod Arduino displej za pár eur, ktorý už na doske obsahuje jednoduchý touchscreen a microSD rozhranie – po hardwarovej stránke stačí už iba vyrobiť káblik pre prepojenie s PMD 85.

Starší “monitor” tu už nemám 🙂
PMD 85-2 pripojené cez modulátor na prvý kanál CCIR D/K (“OIRT”) do Tesly 4002A, len tomu ešte musím zladiť vf diel podľa Kottka

Motiváciou pre tento projekt bolo, samozrejme, odskúšať na PMDčku i niečo iné ako ten šeredný kazetový interface; bolesť všetkých osembitov. Ku neskorším PMD (konkrétne PMD 85-3) sa neskôr vyrábal modul PMD 32 s dvomi 360K floppy mechanikami od Tesly. Keďže ich je dnes ako šafránu, podujali sa bórikovci vytvoriť AVR-kový emulátor, nahrávajúci floppy image z SD karty, nazvaný ako PMD 32-SD. No a po mojej úprave viac než desať rokov nadväzujúcej, som dal svojmu pracovný názov PMD 32-Mega2560.
Kto vymyslí lepší názov bude pochválený pred naštartovanou vétrieskou.

“PMD 32-Mega2560”
Kam zapojiť dátové linky a k displejom sa venujem dole

Až na UIčko prispôsobené pre dotykový displej je funkcia takmer totožná s PMD 32-SD, teda emulácia základných PMD 32 funkcií + SD rozšírených pre utility typu CD.COM; ukladanie stavu načítaných image do EEPROM pre automount pri ďalšom štarte a podobne. Zatiaľ snáď jediný funkčný rozdiel oproti PMD 32-SD je preskočenie detekcie images.cfg a vlastných geometrií. Tento kód som preskočil náročky – nie, že by to tam nešlo doplniť, ale BIOS CP/M pre PMD 85 žiadne iné formáty ako 360K beztak nepodporuje. Na jednoduchú “konverziu” PMD image z iných formátov používam takýto baťák s Bórikovým cim tool; v archíve ako príklad 8inchToPMD pre konverziu z 8″ SD 250K, analogicky je možné prispôsobiť si iné formáty.

PMD 32 loader pre PMD 85-2 vovnútri BASIC ROM modulu
Napriek tomu, že je možné natiahnuť ho “zvukom”, cieľ je obísť to kazetové rozhranie úplne

CP/M, alebo tiež MIKROS, bol podporovaný až pod PMD 85-3, rovnako ako i PMD 32 disková mechanika. Podporu pre staršie PMDčka s 48K RAM, ako aj PMD 85-2, dorobili až neskôr bórikovci – variantou MIKROSu 32K a LOADERom, teda softwarovou podporou PMD 32, ktorú mal PMD 85-3 už vovnútri Monitoru.
Tento loader sa dá načítať do staršieho PMDčka buď cez kazetový interface (dvanásťsekundový zvukový záznam – loader-pmd85-pmd32.ptp), alebo doplnením do ROM modulu, napríklad pôvodného BASICu. Vyžiada si to naprogramovať dve 2708 PROM (boot32-0.bin, boot32-1.bin) a poposúvať existujúce PROMky v päticiach o 2 miesta vpred. Toto pridá jednoduché “boot menu” po štarte PMDčka, kde sa spýta či spustiť BASIC, ROM Monitor alebo sa pokúsiť nabootovať systém cez PMD 32.

Programátor 2704, 2708, TMS2716 a MCM6876x podľa Matt Millmana
Beží pod tým istým Arduinom Mega2560 ako tento projekt, bližšie sa tomu venujem tu

Do PMD teda činí už len pripojiť dátový kábel. Zo strany Arduina je to jednoduché – 2,54mm kolíková lišta, zato na PMD sa vyžiada 20-pinový FRB samec – a s dostupnosťou FRB konektorov je to v dnešnej dobe problém. U mňa poslúžili súčiastky z iného PMD na diely; krytka na kábel improvizovaná z 15-pin D-Sub (Cannon DA-15).
PMD komunikuje cez GPIO port 0 (konektor K3) prostredníctvom 8255 PPI v obojstrannom móde 2. Zapája sa 8 dátových, 5 riadiacich liniek a samozrejme zem. Je dobrý nápad vovnútri FRB krytky zaradiť do série na každú linku (s výnimkou zeme…) ochranný odpor okolo 330 ohm, tak ako má PMD 32-SD. Pinout do Arduina mám okomentovaný v config.h a zapojenie na Arduine závisí od toho, či sa použije 8-bitový alebo 16-bitový displej; viac o displejoch uvádzam dole.
Ak je vložená microSD karta, v kľudovom stave je posielaný na zbernicu PMDčka tzv. “prezentačný byte” 0xAA hexa, 170 dekadicky – protokol je bližšie popísaný na stránkach PMD32-SD. Prijatie (handshake) prebieha odoslaním toho istého bajtu zo strany PMD do Arduina a správnym vystavením riadiacich bitov 8255 (viď obrázok dole); následne sa spracúvajú už konkrétne príkazy PMD 32.
Ak pri pokuse o boot nedochádza k handshake, po kontrole správneho pripojenia dátových i riadiacich liniek odporúčam spustiť BASIC skript v pravej strane doleuvedeného obrázka, pre zistenie stavu vstupnej dátovej zbernice. Ak je dátový kábel pripojený a Arduino zapnuté, pri zasunutej microSD karte, aj bez načítaných image, musí kód ukazovať prezentačný byte o hodnote 170 (0xAA), a pri vysunutej karte nulu.
U mňa ako prvé ukazovalo 168, po vylúčení PPI 8255 sa ukázal ako vadný 1. bit v budiči zbernice MHB8286. Jeho výmenou sa PMDčko prebralo k životu a začal bootovať MIKROS. Hurá!

Vľavo: stav riadiacich liniek 8255 počas výmeny “prezentačného byte” pri pokuse o boot z PMD32
Vpravo: BASIC skript na zistenie aktuálneho stavu GPIO/0 zbernice na vstupe

Toľko k PMDčku, MIKROSu, LOADERu a BASICu… môžme sa vrátiť naspäť k Arduinu 🙂
Sketch PMD 32-Mega2560 sa stiahne z GitHubu a otvorí v klasickom Arduino IDE. Pre správnu kompiláciu sa ešte stiahnu (cez Libraries Manager) tri Adafruit knižnice a jedna SdFat; sú uvedené v requirements.txt. Následne musí ísť projekt skompilovať bez chyby. Pred samotným nahraním do Arduina je ešte potrebné skontrolovať nastavenia projektu, až na pár výnimiek je všetko (čo má byť) nastaviteľné vovnútri config.h projektu. Napriek tomu, že článok píšem po slovensky, zdrojové kódy i popisky sú v angličtine, z pochopiteľných dôvodov.
Pre neznalých jazyka C++ ešte vysvetlím nomenklatúru:  “zakomentovať” definíciu, teda ju vypnúť, sa robí pridaním dvoch lomítiek // na začiatok riadka s #define. “Odkomentovať” znamená tieto dve lomítka, ak sú prítomné, odmazať, čím sa definícia “zapne”. 🙂

PMD 32-Mega2560 s tromi rôznymi displejmi, zľava doprava:
16-bitový paralelný (radič ILI9341, ID: 0x9341, cez Mega2560 shield),
16-bitový paralelný (radič HX8347-I , ID: 0x9595),
8-bitový paralelný (radič ILI9341, ID: 0x9341, pôvodne pre Arduino Uno).
Určite budú fungovať aj iné, avšak treba venovať pozornosť nasledovnej stati.

To hlavné a de facto jediné, čo treba nastaviť, je displej. Spomínal som na začiatku článku, že idú použiť aj kvalitnejšie Adafruit, aj lacnejšie čínske “noname” (všetky tri na obrázku hore sú lacné noname). Čo je podstatné, je zvoliť displej ktorý už je priamo kompatibilný s Arduinom Mega2560; je riešený ako Mega2560 shield a radič displeja je pripojený v paralelnom režime.
To znamená, že sa jedná už o osadenú DPS s kolíkovými lištami, ktoré je možné priamo nasunúť navrch Mega2560, takže Arduino “zakrývajú” (z toho označenie shield), a sú vývodmi, napájaním i napäťovými úrovňami s 5V Arduinom kompatibilné, bez nutnosti nejakého ďalšieho prispôsobovania, pripájania a káblovania. To by negovalo pointu článku “pre lenivých”.
Projekt PMD32-Mega2560 je implicitne nakonfigurovaný na použitie 320×240 LCD TFT displeja ľubovoľnej uhlopriečky, s radičom pripojeným paralelne 16 bitov (D0 až D15), rezistívny touchscreen zapojený cez radič XPT2046 (alebo ekviv.), a SD kartou pripojenou na hardware SPI Mega2560, tzn. na vývody 50-53.
Úpravou konfigurácie projektu je možné použiť nasledovné kombinácie: displej s iným (väčším) rozlíšením, s radičom pripojeným paralelne 8 bitov, prípadne inými, rezistívny touchscreen zapojený inak, prípadne napriamo bez radiča 2046, SD karta na iných vývodoch – alebo cez softwarový SPI.
Dôrazne odporúčam vyhnúť sa takým noname displejom, ktoré nie sú koncipované ako shield pre Mega2560/Uno, alebo nemajú touchscreen pripojený na XPT2046, prípadne napriamo, či dokonca ho nemajú vôbec. Takéto a podobné displeje častokrát nepôjdu pripojiť bez rôznych redukcií, prípadne nebudú osadené meničmi z TTL na CMOS úrovne, alebo majú ešte i radič displeja zapojený natvrdo na SPI (použitá knižnica podporuje iba radiče pripojené paralelne), čím by sa projekt skomplikoval minimálne na úroveň osadzovania a oživovania pôvodného PMD32-SD, ak nie vyše. 🙂

Tie isté displeje zospodu

Sketch bol pôvodne navrhnutý pre šestnásťbitové Mega2560 displeje (prvé dva na fotke), ale je možné ho nastaviť aj pre osembitové (ten tretí, pre Uno). Na prepnutie pre osembitový displej sa zakomentuje //#define USE_MEGA_16BIT_SHIELD vovnútri src/MCUFRIEND_kbv/utility/mcufriend_special.h. Ako je uvedené v config.h, dátové linky do PMD sa zapájajú buď na spodné vývody “analog in”, alebo na pravý pinheader, podľa toho, ktoré sú voľné pri použitom displeji.
Nevýhoda šestnásťbitových displejov je ich vyššia cena (v čase písania článku, cca 16 eur oproti 7 eur za 8bit ILI9341, oba o trojpalcovej uhlopriečke), a že “zakrývajú” analog piny, ktoré nepoužívajú. Takže na dátový káblik treba použiť napríklad uhlovú kolíkovú lištu miesto rovnej, alebo sa vývody pripájkujú napriamo, a podobne.
Osembitové displeje sú lacnejšie, dostupnejšie a v prípade Uno shieldu nechávajú pravý pinheader Mega2560 voľne dostupný. Zato sú na Arduine dosť pomalé, ich odporový touchscreen nie je riešený najšťastnejšie (je pasívny a zapojený napriamo na tie isté vývody ako zbernica pre displej – treba zakomentovať //#define TOUCH_SCREEN_ACTIVE , do toho je ešte málo citlivý – XPT2046 pri 16bit displejoch sa v pohode ovláda prstom, tu je stylus takmer nutnosť). K tomu, interface pre SD kartu majú tieto shieldy pripojený na vývody 10 až 13, čo je hardwarový SPI Arduino Uno. Mega2560 má SPI inde, takže je nutné zapnúť softwarový polling odkomentovaním #define SD_SOFTWARE_SPI a v knižnici SdFat nastaviť SPI_DRIVER_SELECT na 2, pre softwarový driver. Inak microSD kartu takýto displej nerozpozná.

Výber image – ručne, alebo cez CD.COM

Čo presne myslím ako “dosť pomalé”? Napríklad jednofarebná výplň (bit blitter) celých 320 x 240 pixelov, ktorú tento projekt vykonáva iba pri inicializácii displeja a zvyšok UI sa snaží prekresliť iba miesta kde je to potreba: pri 16bitovom displeji ILI9341 trvá ešte obstojných 30 ms. S tou istou knižnicou MCUFRIEND a osembitovým shieldom ILI9341 to na Arduino Uno trvá 140 ms, a ak sa ten istý 8-bit Uno displej pripojí napriamo na Mega2560, tak si počkáte až 350 ms. To znamená: vnútorne ten istý LCD displej aj radič, to isté rozlíšenie, zato inak zapojený shield – a zrazu je to pomalšie viac než desaťnásobne.
Prečo? Žiaľ, lebo pôvodné zapojenie vývodov tohto 8bit shieldu je medzi vývody Arduina 2 až 9, ktoré sú na Une rozdelené už medzi dva AVR porty, kdežto na Mega2560 až medzi tri. Na jednu 8bit operáciu so zbernicou takéhoto displeja treba vykonať až tri portové operácie AVR, a k tomu bitové posuny… Do toho nutnosť zapnúť softwarovú SPI, tiež nepridáva na rýchlosti I/O s pamäťovou kartou.
Tým netvrdím, že to nebude fungovať – ono to funguje, len to dosť kazí dojem; pomalý refresh pripomína gýčové prechodové efekty starých PowerPoint prezentácií. /Ostatne, moc tieto osembitové Uno displeje nechápem, pretože na ozajstnom Une už veľa voľných pinov potom neostáva, bez použitia posuvných registrov či iných hradlových orlojov, ešte k tej pomalosti./
Nič samozrejme nebráni takýto 8bit displej pripojiť direkt na jeden AVR port Mega2560, SD na hardware SPI a upraviť inicializáciu, a hneď je  to rýchlejšie. Lenže extra kabeláž, ktorú načo, ak netreba. Navyše to nerieši absenciu radiča 2046 pre touchscreen, takže citlivosť ostáva naďalej biedna; displej niekedy bliká, ak sa podrží prst – pretože sa touch bije s dátovou zbernicou displeja…
Dajte tam 16bit, thank me later.

Ak je dotyk málo presný oproti predvoleným hodnotám, alebo je registrovaný nesprávnym smerom, spustí sa kalibrácia: #define TOUCH_SCREEN_CALIBRATION .
Zvýraznené krížiky sa stlačia a podržia vhodným nástrojom (stylus, ceruzka).

Výsledkom sú štyri čísla, ktoré sa nahradia v config.h.

A to je, čo sa týka nastavenia displeja a vôbec projektu, všetko 🙂
Zvyšné dve nastavenia sú kozmetického charakteru, teda či otočiť rozhranie na displeji o 180°, prípadne, kto chce šetriť EEPROM Mega2560, môže vypnúť ukladanie ciest k diskovým image a automatický mount pri zapnutí.
Vsjo! A ani to nebolelo. Vyrobiť káblik pre PMD (čomu sa neobišiel ani pôvodný PMD32-SD) trvá dlhšie, než nastaviť displej. Comments, questions, ráčte sem!

Leave a Reply

Your email address will not be published. Required fields are marked *