A vezérlés próbája, néhány utólag esztétikusan korrigált hibával.
Tabló 'preview'
És ami mögötte van
Az elektronika, kicsit homályosan
A forrasztási oldalnak egy és mégegy szépsége, illetve az otthon kínzott 286-os gép.
Már nem sokra emlékszem a dologból, 2003 tavaszán csináltuk az egészet, már
majdnem egy éve. A működése azért persze még tiszta. Tehát. A feladat az volt,
hogy egy 24x24es ledmátrixon lássunk valamilyen animációt. Először nem is
gondolotam, hogy mátrixos elrendezésben impulzusüzemben is lehet hajtani a
ledeket, de aztán így találtam a neten. Méregettem otthon próbapanelen
párhuzamos porttal vezérelve a LEDeket, és azt találtam, hogy tök jól lehet a
fényerejüket impulzusszélesség-modulációval (PWM) szabályozni. Még régebben,
amikor egy PIC tesztpanelt kaptam Horváth Zoltán tanár úrtól otthonra játszani,
azon is megcsináltam, hogy az egyik LED fényerejét az ADC bementre kapcsolt
potenciométer szabályozta. A mátrixos elrendezése a ledeknek arról szól, hogy
minden sor egyik fele és minden oszlop másik fele (anód/katód) össze van kötve.
Mindig csak egy sor kap földet/tápot, és kép adott sorának megfelelően kapnak
tápot/földet az oszlopok. Így egymás után villantva fel a sorokat, a teljes kép
látszik. Sokáig nem tudtam elképzelni, hogy hogyan is fogom megvalósítani a
sormeghajtást, aztán Suri tanár úr elmagyarázta. A próbakártyán az oszlop kapja
földet, 24 db BC182-es kapcsolás adja. 3 db 74HC573mas regiszter kimenetére jön
egy 2.7k-s (ha jól látom, piros-lila-piros) ellenállás, arra a BC182B bázisa,
annak emittere földre, kollektorára 18ohm (? barna-szürke-fekete :), az pedig
kacsolódik fel a ledekre. A végleges kártyán ez már egy ULN2803A jelű IC-vel
került megvalósításra. A másik oldalról a tápot BD244-esek adják. Egy 74HC154-es
demultiplexer 12 kimenetére kerül 2db 7407-es open-collectoros meghajtó. A
meghajtó kimenete alapból fel van 10k-val tápra, de aktív állapotban a meghajtó
62 ohmos ellenálláson keresztül lehúzza földre. Ez a kimenet van a BD244
bázisára kötve, ami földre kerülve kinyitja a tranzisztort és máris rohanhat 6
amper a ledek felé (PNP tranzisztor, kollektora van a tápra kötve). Ebben az
elrendezésben azonban egy adott sor "áthallatszott" az előző és a következő
sorra is, bár oszcilloszkóppal mérve nem látszott semmiféle csunyaság, minden
pont időben kapcsolt, ezért a kitöltési tényezőt megfeleztem, azaz a 573-mas
regiszterek output enable jele konstans alacsony (pontosabban OE negált) helyett
a sorfrencia kétszeresét kapja. Ennyi a meghajtó része a dolognak, a másik fele
a PC interface.
A próbavezérlés csak a mátrix felét hajtja meg (12 sor, 24 oszlop), mert nem
akartam a próbavezérlésre is 24 sorvivőt tenni egyrészt, másrészt pedig tudtam,
hogy úgyis tele lesz gányolva a nyák mire rendesen működik, és jó lesz csinálni
egy tisztázatot. A végleges vezérlés végül nem 24 sorvivőt kapott, hanem még 24
oszlopot, mert: nem lett volna szerencsés 24 sort hajtani, mert a 24-es
kitöltési tényező a teljes fényerőhöz már igen kevés, de a 12 még jó. A mátrix
tehát tulajdonképpen 12 sor x 48 oszlopos lett. Nade, szóval 12x24 bit egy
framenek, 12x3 byte egy framere, 24 frame/sec-el 12x3x24 byte. A PWM miatt ez
még 32-vel szorzódik, mert a feketétől eltérő legkisebb fényerőhöz 1/32-es
kitöltési tényező (ami tulajdonképpen 1/32/12) ha tartozik, az már egész
lineáris fényerőskálát adhat. Tehát 12x3x24x32 = 39168 byte pontosan
szinkronizált átvitele szükséges másodpercenként. Illetve nemis. Tehettem volna
azt is, mint ahogyan arra először gondoltam, hogy a képet egy memóriában a
kártyán tárolom. Viszont: ezt a memóriát szinte folyamatosan olvasta volna a meghajtó
elektronika, így elég nehéz lett volna a tartalmát frissíteni. Lehetett volna
úgy, hogy a PC megvárja azt a pillanatot, amikor a meghajtó éppen nem olvas, és
akkor ír a memóriába, amennyit éppen tud, vagy egy ideiglenes tárolóba ír a
kátryán, ami üres időben íródik be, de hát ez nagyon macerás. Lehetett volna úgy
is, hogy két memóriabank van, az egyik hajtja a ledeket, a másikat pedig írhatja
a PC, de ennek a megvalósítása is sok IC-t, elsősorban buszmeghajtókat igényelt
volna. Végül tehát DMA átvitel használata mellett döntöttem. Megbízható, gyors,
és pontos, mert én vezérlem. 40 kilót pedig simán átvisz másodpercenként. Került
tehát a kártyára egy oszcillátor (74HC4060), ez adja a sorfrekvenciát, CP jel.
Ennek a felfutó éle indít egy új sort a következőképpen. Egy 74HC74-es egyik D
tárolójának D és SD jele magasba van kötve ezért a CP felfutó éle beírja, a
ponált kimete a DRQ1 jelre csatlakozik, az új adatot így megrendeljük a DMA-tól.
Ugyanez a CP jel hajtja a sorszámlálót, ez 0..11-ig számol, kimenete a már
említett demultiplexerre van kötve. Egy másik ciklusrövidítés is van az
áramkörben, először mindkettőt, és az összes kombinációs hálózatot egy GAL16V8D
IC-vel valósítottam meg, de, bár statikusan jól működött, a ciklusrövidítéseket
mégsem valósította meg, ezeket tehát utólag ráakasztott 74HC00-kal
helyettesítettem. De visszakanyarodva, a PC, nem sokkal miután megkapja a DRQ
jelet, elindítja a DMA átvitelt (a dma vezérlőt persze előtte fel kell
programozni). Egy byte átvitelekor az IOW és a DACK1 jelek alacsonyak, így ezek
vagy kapcsolata aktív alacson (DMAW) engedélyező jelet ad a 74HC238-as demultiplexernek,
ennek az ABC bemenete első körben 0, tehát az Y0 jel aktív magasba vált, ez
pedig engedélyezi az első oszlopregiszter (573-mas) betöltését. A sínről
sínmeghajtó beiktatása nélkül van ezen regiszterek bemenetére kötve a D0..D7
jel. A végleges vezérlőn már vannak 74HC245-ös meghajtók, bár valószínűleg ezek
nélkül is tökéletesen működne a dolog. Szóval betöltődik az első regiszter, az
átvitel végeztével az IOW és a DACK1 is magasba vált, így a DMAW-nek lesz egy
felfutó éle. Ez a felfutó él egy másik 74HC161-es számlálót számláltat, amely
így 1-es állapotba kerül, és ez az 1-es kapcsolódik a 238-as demultiplexer
bemenetére. A DRQ jelet még mindig magasban hagyom, így mégegy DMA átvitel fog
történni, de ez az adat már a második oszlopregiszterbe kerül. Ugyanígy jön egy
harmadik adat is a harmadik oszlopregiszterbe. A harmadik átvitel végén a DMAW
felfutó éle a számlálót már a negyedik állapotba (3-ba) billenti, ez pedig
vissza van kapuzva, törli a számlálót egy alacsony tüskével (DMAEND a MR-re),és
a DRQ1 jelet adó D tárolót is törli (DMAEND a CD-re). Tehát az oszcillátor által
adott minden felfutó élre 3 DMA átvitel betölti az oszlopregisztereket, illetve
lépteti eggyel az aktív sort. A próbakártyára először 74HC138-as került a 238-as
helyett, ami aktív alacsony jeleket ad ki, ennek a kimeneteit ezért 3 NAND
kapuval invertálja mielőtt az oszlopregiszterek load bemenetére kapcsolódnának.
A nyákról tehát 3 db 74HC00-ás lóg, az egyik ez, a másik kettő pedig a két
ciklusrövidítő. Még egy funkciója van a PC felé a kártyának, a megszakításkérés.
64 teljes képfrissítés után megszakítást kér. A sorszámláló ciklusrövidítő jele
egy másik 74HC4060-as számláló órajelét adja, ami így 12 soronként (képenként)
számol egyet. Ennek a /64-es kimenetét a fent említett 74HC74-es D tárolók másik
órajelbemenetére kötöttem, ez szintén 1-est ír be minden felfutó élre, ami az
IRQ5 jelet teszi aktív állapotba. Ezt a tárolót a szoftver törli, a CD
bemenetére a vezérlőregiszter harmadik (IACK) bitje van kötve. A megszakítás
segítségével tudom korrigálni az esetleges elcsúszásokat (a DMA memóriapozíció
és a ténylegesen frissített sor eltérését), illetve "vertical retrace" jelet
kapok, a szoftver ehhez időzít. És akkor mégegy dolog: a vezérlőregiszter. Három
jel van benne, output enable, sync reset, interrupt ack. Az output enable jel a
sorvivő demultiplexer és az oszlopregiszterek kimenetét tiltja alacsony
állapotában (RESET után alacsonyba áll). A sync reset jel a két ciklusrövidítőt
aktivizálja, tehát az aktív sor és a legközelebb betöltődő oszlopregiszter is
nullás lesz. Az IACK alacsony jele tiltja az IRQ jelért felelős D tárolót,
alacsonyba, majd ismét magasba váltása megszakításnyugtázás, ez fontos, mert ha
az IRQ jel a megszakításvezérlő nyugtázása után is magas, mégegy megszakítás
generálódik, meg aztán mégegy, stb.
Ezzel a megoldással tehát csak az éppen aktuálisan megjelenő információ van a
kártyán, és ez ráadásul az aktuálisan megjelenni látszó információnak csak a 12-ed
része.