home
a tabló
a program
az elektronika

A vezérlés próbája, néhány utólag esztétikusan korrigált hibával.
[248 412]

Tabló 'preview'
[698 464]

És ami mögötte van
[648 229]

Az elektronika, kicsit homályosan
[1 063 436] [893 138]
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.