32

[eBook] MIDI Vezerlok Tervezese by MadHead

Embed Size (px)

DESCRIPTION

MIDI kontrollerek tervezése HUN

Citation preview

Fejes TamásFejes TamásFejes TamásFejes Tamás

MIDI VEZÉRLŐKMIDI VEZÉRLŐKMIDI VEZÉRLŐKMIDI VEZÉRLŐKTERVEZÉSETERVEZÉSETERVEZÉSETERVEZÉSE

Tiszatenyő2005.

MIDI vezérlők tervezése

2

1. Áttekintés

A MIDI egy olyan szabvány, amely elektronikus hangszerek közötti üzenetküldést valósít meg. Az üzenetek típusa kétféle lehet:

- hang csatorna üzenetek (hang kikapcsolás, kontrollerek, stb.)- rendszerüzenetek (SYStem EXclusive)A csatorna üzenetek között szerepel a hangok be-, és kikapcsolása, a programváltás üzenetei valamint a

vezérlők által generált üzenetek. A sysex-ek közé tartoznak az eszköz specifikus üzenetcsomagok, mint például az időzítés és a szinkronizálás.

MIDI vezérlők esetében a legfontosabbak a Control Change (CC) üzenetek. Ez is, mint minden MIDI csatorna üzenet, három bájtból áll. Az első bájt felső fele 0xB, az alsó fele az adott csatorna száma (0..15; 0x0..0xF) tartalmazza. A második bájt a vezérlő eszköz kódja (0..127; 0x00..0xF0). A harmadik bájt az adott vezérlő értéke (0..127; 0x00..0xF0).

Rendszer üzenetek közül a legfontosabbak az időzítés, a lejátszás, a folytatás, leállítás. Az időzítés kódja 0xF8, amit 24-szer kell kiküldeni 1/4-nyi idő alatt. A lejátszás megkezdésének kódja 0xFA, a folytatásé 0xFB, míg a leállítás kódja 0xFC. Ezeknek az üzeneteknek a segítségével tudunk vezérelni a lejátszást, és az időzítést valamilyen MIDI-s szekvenszerben, legyen az szoftver, vagy vas.

A szoftvervilágban különös jelentősége van a MIDI kontrollereknek, mivel a tanítható programok lehetővé teszik a képernyőn megjelenő potméterek, kapcsolók és egyéb vezérlőelemek kézi beállítását. Segítségével egér helyett valódi kezelőszerveken avatkozhatunk be a folyamatba. Nagyobb szabadságot ad, és az automatizációt is leegyszerűsíti. De legfőképp élő applikációk esetében kihagyhatatlan része a setupnak.

Kapcsolók és gombok vezérléséhez gyakran alkalmaznak Note On és Note Off üzenetet valamelyik dedikált csatornán. Ilyenkor a gomb bekapcsolása Note On eseményt vált ki, míg a kikapcsolás Note Off eseményt generál. A legtöbb szoftver lehetőséget biztosít a gombok, kapcsolók viselkedésének beállítására. De a kontroller szoftverében is megoldható a viselkedés beállítása. Lehet Toggle (oda-vissza kapcsolás), lehet Gate (egy üzenet bekapcs, következő kikapcs) és lehet Trigger (csak triggerelődik a gomb/kapcsoló). Toggle esetében Note On és Note Off lehet a kiváltó esemény, Gate esetében Note On/Note Off páros (a két üzenet egymás után). Triggerre ugyan az vonatkozik, mint a Gate-re.

MIDI üzenetek küldése egy 31,25kbit/s-os soros vonalon történik. A jel áramhurkon keresztül jut el egyik eszköztől a másikig. A legtöbb esetben a kimenő vonal egy áramkorlátozó ellenállással rendelkezik csak, míg a bemenetén egy optocsatoló található. Az optocsatolóban található LED segítségével vivődik át a jel a bemenő fokozat soros protokollját kezelő áramkörére. Az optocsatoló nem csak áram-feszültség átalakító, hanem feszültség szintillesztést is végez.

Soros adatok küldéséhez és fogadásához a legalkalmasabb eszköz a mikrokontroller, mivel egy tokon belül van a programmemória, a CPU és a legkülönbözőbb perifériák, mint például a programozható USART modul. Szerencsére ma már a 10-12 bites 8 csatornás A/D konverter is szinte szériatartozéknak tekinthető, így nem okoz különösebb nehézséget analóg jelek digitalizálása sem. A gombok és kapcsolók állapotának kezeléséhez a mikrovezérlő digitális I/O kapuit lehet használni. Jelen esetben a Microchip cégmikrovezérlőivel kezdtem foglalkozni, így maradtam is a 16F családnál.

A PIC 16F család teljes perifériakészlettel rendelkező tagja a 877-es, melyet 40 lábú DIL tokozásban is lehet kapni. A program betöltéséhez ICD2-t érdemes használni, mivel így a fejlesztési időszakban előforduló hibák könnyebben kiszűrhetők, gyorsabbá válik a program pontos belövése, élesztése. A működtető program megírásához MPLAB (pl. 6.30v) használható.

Az áramkörök tervezése javarészt fejben zajlik. A lentebb közölt kapcsolások alapján modulrendszerben érdemes gondolkodni, és a szerint megtervezni egy-egy konkrét összeállítást. Digitális részek szimulációjához a Circuit Maker program tökéletesen elég, míg a panelek tervezéséhez Eagle is megfelelő. A kinyomtatott NYÁK tervek akár kézi, akár fotoeljárás alapján gyorsan elkészíthetők.

Bedobozoláshoz legegyszerűbben kész műanyag dobozokat használhatunk, amiket azután tetszőlegesenlehet felíratozni, akár AlphaSet-tel, akár bármilyen más módon. Egyedi dobozhoz fa oldallapok, és alumínium fedőlap szükséges. A fedőlap (front panel) készítéséhez a rajzot vektorképként el kell menteni, majd egy arra alkalmas géppel lézerrel kivágatni a nyers alumínium táblából.

A tápellátáshoz lehet a gép saját stabilizált +5V-ját használni (a Game/MIDI port-on ki van vezetve), vagy külső adaptert csatlakoztatni.

MIDI vezérlők tervezése

3

2. Modulok

A komplett vezérlő felépíthető néhány modulból. A modulok számának növelésével, testreszabásával tudjuk elérni a kívánt analóg és digitális bemenetek számát. A modulok tetszés szerint egyetlen áramkörre megépíthetőek, így csökkenthető a panel mérete, és egyszerűbbé válik a szerelés.

Modultípusok:- központi egység- analóg multiplexer- digitális multiplexer- digitális demultiplexer- MIDI/TTL konverter- tápfeszültség stabilizátor- LCD kijelző- 7 szegmenses kijelző

2.1 Központi egység

A központi egység tartalmazza a mikrovezérlőt, és a kiegészítő áramköröket, mint az oszcillátor, a felhúzóellenállások, és meghajtó-vezérlő IC-k. A panelre érdemes felszerelni az ICD csatlakozóját is a fejlesztési időszak miatt. Magát a csatlakozót a kész NYÁK-okra nem kell beültetni, viszont univerzális panelek készíthetők mindvégig. A központi egység szinte minden kontroller esetén azonos alkatrészeket tartalmaz, melyeket nem kötelező beültetni.

2.2 Analóg multiplexer

A mikrovezérlőn (PIC16F877) nyolc analóg/digitál analóg bemenet található, melyek tokon belül vannak multiplexelve. Az esetek többségében azonban nem elég a nyolc bemenet, így külső multiplexert kell az analóg jelforrások elé kötni. Ehhez tökéletesen megfelelő a 4051-es típusú CMOS integrált áramkör. Ez nyolc bemenetet multiplexel egy bemenetre. A címzéshez három vonal van (A0..A2). Így, egyetlen mikrovezérlőre nyolc darab külső multiplexer segítségével 64 jelforrást csatlakoztathatunk. Ha még több analóg bemenetre lenne szükség, akkor egy külön mikrovezérlőt kell beiktatni, mely valamelyik porton keresztül elküldi a digitalizált adatokat a fő mikrovezérlő IC-nek. A mikrovezérlő sebessége bőven elég, hogy ennyi adatot kellő időn belül feldolgozzunk.

2.3 Digitális multiplexer

Kétállapotú jelek multiplexelésére három megoldás van. Az egyik az, hogy ugyanazt a multiplexer áramkört alkalmazzuk, ami az analóg esetében már ismertetésre került. Ezesetben egy bemeneti pontra nyolcat tudunk multiplexelni.

A másik megoldás mátrix használata. A mátrix két vonalát nevezzük el X-nek és Y-nak. Ha az egyik X sort magas szintre állítjuk, be tudjuk olvasni a teljes Y oszlopot, és detektálni tudjuk a lenyomott gombokat. A következő periódusban egy másik X sort állítunk magas szintre, és annak az Y oszlopát vizsgáljuk meg.(minden gomb elé egy diódát kell kötni, hogy több gomb egyszerre történő lenyomása ne okozzon hibás beolvasást)

A harmadik megoldás esetében shift-regiszteres tároló segítségével sorosan olvassuk be az adatokat.

2.4 Digitális demultiplexer

Demultiplexer szükséges olyan alkalmazásokhoz, ahol visszajelző részek is találhatók a kontrolleren. Ilyenek például a LED-ek, az LCD kijelző, és a hétszegmenses kijelző. Ezekhez sok vezérlő vezeték kell, így ezeket szoftveresen kell előállítani.

Itt is használható a 4051-es IC mely analóg demultiplexerként is használható. Ebben az esetben a TTL szintet osztjuk szét a kimeneti pontok között.

Szintén működik a mátrix rendszerű demultiplexer, melyet elsősorban LED-ek, és hétszegmenses kijelzők esetében használható sikerrel, mert ezesetben már nem kell diódával vacakolni.

Shift-regisztert is lehet alkalmazni, és itt pár vezetéken, szinte tetszőleges számú kimeneti pontot

MIDI vezérlők tervezése

4

vezérelhetünk.

2.5 MIDI/TTL konverter

Mivel a mikrovezérlő TxD és RxD vonala TTL jelszintek fogadására lett kialakítva, szükség van átalakítóra. Egy egyszerű kapcsolás, mely a vevőoldalon egy optocsatolót tartalmaz, míg a kimeneti részen áramkorlátozó ellenállás van. Amennyiben a kontrollert asztali PC-hez készítjük fölösleges a jelszintek átalakítása, mivel a Game/MIDI port bemeneti és kimeneti csatlakozói TTL kompatibilisek. Ilyenkor csak be kell kötni a Txd és RxD lábakat.

2.6 Tápfeszültség stabilizátor

Az áramkörök működéséhez stabilizált +5V szükséges. Ehhez bőven elég a 78xx és 78Lxx sorozat 5V-os elemei (7805, 78L05). Ha a tápot a panel a számítógép Game/MIDI portján kapja, elhagyható a stabilizátor, mindössze egy kisebb pufferkondi kell (100-200uF/16V) valamint a feszültség gerjedésének megakadályozásához egy 100nF-os kondenzátor.

2.7 LCD kijelző

Adatok, számok és további információk megjelenítéséhez LCD kijelzőt is csatlakoztathatunk a kontrollerhez. A legelérhetőbb gyártó az EDT, mely egyszerűen kezelhető és alacsony árfekvésű. Csupán néhány adatvezeték kell a működtetéséhez. Kapható 1x20 és 2x20 karakteres verzióban, háttérvilágítással, vagy anélkül. Igény esetén akár grafikus LCD panelt is el lehet helyezni a kezelőlapon.

2.8 Hétszegmenses kijelző

Ezt a kijelzőtípust jellemzően BPM érték, és egyéb fontos információk kihangsúlyozására érdemes használni. Jól olvasható, bár túl sok kijelző használta indokolatlanul bonyolulttá teszi a megtervezett panelt.

MIDI vezérlők tervezése

5

3. A hardver tervezésének szempontjai

A hardver megtervezésének első lépése a követlemények pontos rögzítése. Hány potméter kell, azok közül is hány forgó és hány toló. Utána jön a nyomógombok, kapcsolók számának felmérése. Végül a vizuális elemek jönnek. Külön a LED-ek, LCD kijelzők és a hétszegmenses kijelzők száma.

Utána a ki kell választani a kimenet típusát, ami lehet áramhurkos MIDI, vagy TTL jel. A TTL jel csak asztali PC-k hangkártyájához használható, sokkal univerzálisabb a szabványos MIDI jel.

Legvégül a tápegység kiválasztása jön. Lehet elemes, adapteres, vagy PC-ből kapott +5V. Elem és adapter esetén a fentebb említett 78(L)05-ös stabilizátor IC kell alkalmazni, melyek bemenetére minimum 7V-ot kell adni.

3.1 Analóg bemenetek

Amennyiben az analóg bemenetek száma nem haladja meg a mikrovezérlő által közvetlenül kezelhető jelek számát, nem kell multiplexert használni.

Több bemenet szüksége esetén a annyi multiplexer kell, ahányszor nyolc analóg forrásunk van. A 877-es mikrovezérlő A/D konvertere 10 bites, viszont a CC üzenet harmadik bájtja csak 7 bites. Ezért programozás során majd csak a felső bájtot használjuk (ADRESH), és annak is a legfelső hét bájtját. Ahhoz hogy hét bites értéket kapjunk az ADRESH-ból ki kell vonnunk 128-at.

Egy 4051-es multiplexer vezérlésére 3 címvezeték van. Ezek a vonalak minden multiplexer esetében ugyanazok, mivel ezekkel a 8 bemenet valamelyikét kapcsoljuk a multiplexer kimenetére. A kimenetét pedig valamelyik A/D bemenetre kötjük. Nyolc A/D bemenetre és három digitális kimenetre lesz szükség a mikrovezérlőn. Így egyidejűleg 64 csatornát tudunk kezelni.

Potméterek digitalizálása esetén a potmétereket feszültségosztóként kell bekötni. A középső, leosztott feszültés kerül a multiplexer bemenetére, mely így 0V és 5V közötti feszültséget juttat a mikrovezérlőre. A mikrovezérlő referenciafeszültségét ilyenkor Vcc-re kell programozni. Más típusú analóg jelforrás esetén úgy kell erősíteni, kondícionálni a jelforrást, hogy értéktartománya 0V és 5V közé essen.

3.2 Analóg kimenetek

Analóg kimenetre ritkán van szükség MIDI kontroller esetén. Amennyiben mégis kell, D/A IC-t kell alkalmazni, melyet azután felerősítünk a kellő szintre. Itt is lehetőség van multiplexelésre, és így több analóg kimenetet tudunk létrehozni. Ne felejtkezzünk el a meredek aluláteresztő szűrőről, ami minden D/A szériatartozéka. A továbbiakban egy egyszerű megoldást közlök, R2R átalakítóval 7 bitre.

3.3 Digitális bemenetek

Miután meghatároztuk a szükséges bemenetek számát, el kell döntenünk melyik módszert alkalmazzuk. Néhány bemenet esetén érdemes közvetlenül egy felhúzóellenállással a mikrovezérlő egy digitális bemeneti pontjára kötni. Közepes mennyiség esetén használható a 4051-es IC, míg sok gomb esetén a mátrix a jó megoldás, mivel pl. 64 bemenet esetén 8 vezetékre van szükség. Három vonal az X sor címzéséhez, három az Y oszlop címzéséhez, egy a bemenethez és egy a kimenethez. 64-nél több bemenet esetén még egy mátrixot kell felépíteni az előbbi szisztéma szerint.

3.4 Digitális kimenetek

Minden egyes LED-nek, szegmenesnek és az LCD modulnak szüksége van TTL szintű kimeneti jelekre. Ha csak kevés kimenetre van szükség, használhatjuk a PIC kimeneteit közvetlenül, kb. 20mA a maximális terhelhetősége egy kapunak. Több kimenet esetén multiplexelni kell. Kevés vezeték esetén jól használható a shift-regiszeteres tárolósor, melyekből tetszőleges számút tudunk felfűzni. LED-eket szegmenseket jól lehet mátrixba is kötni. A továbbiakban minden megoldásra lesz egy-egy kapcsolási összeállítás.

3.5 Kijelzők

A hétszegmenses kijelzőből választhatunk közös anódos, és közös katódos típusok közül. A közös katódos programozása egyértelműbb. Mind a hét szegmens és a tizedespont vezetékeit összekötjük minden kijelző esetén. A vezérléshez a táp lábat fogjuk be és kikapcsolni kijelzőnként. A jó működéshez

MIDI vezérlők tervezése

6

elengedhetetlen, hogy megfelelő sebességben kapcsolgassuk a szegmenseket, mert különben villogást eredményez. Érdemes tehát egy időzítő megszakítási rutinjába elhelyezni a kijelzők frissítését. A legfrissebb adatokat tehát egy átmeneti tárolóba tesszük, aminek a tartalmával a megszakítás során frissül a kijelzősor.

3.6 LCD

A vezérlése okozhat némi bonyodalmat, de szerencsére kaphatók „chip-on-glass” típusok, amik az LCD panelán már tartalmazzák a meghajtó IC-t és kiegészítő áramkörét. Az LCD vezérléséhez rutingyüjteményt is lehet találni az interneten, de a 1620-as EDT kijelző programozása később itt is ismertetésre kerül.

3.7 Bedobozolás

A már megtervezett panelek méretei alapján számíthatjuk a szükséges magasságot. A forgó és tolópotik esetében hagyjunk elegendő helyet az ujjunknak, mert később kényelmetlenné válik a használat. A forgópotméterek tengelyei között kb. 2,5-3,0 cm-t lehet hagyni. A fedőlap legyen két rétegből. Az alsó rétegbeaz alkatrészek, kezelőszerveket kell rögzíteni, míg a felső lapon csak a felíratok találhatók. Így esztétikusabb, és könnyebben szerelhető, javítható a készülék. A felső lap rögzítése után csupán a potméterek gombjait kell felrakni, és már kész is.

MIDI vezérlők tervezése

7

4. Alkatrészek

A kontrollerben alkalmazott integrált áramkörök gyors áttekintése következik. Az alkatrészek könnyen beszerezhető típusok.

4.1 PIC16F877 I/P-20

Ez maga a mikrovezérlő. Az IC beszerezhető a ChipCAD KFT-től. Az I jelölés szobahőmérsékleti működésre utal, míg a P betű a tokozást jelöli: 40 lábú DIL tok. Létezik belőle több sebességű típus, pl. 4 és 20MHz. A PIC16F esetében egy utasítás végrehajtásának ideje 1 gépi ciklus, mely 4 órajelből áll. Kivetél az ugróutasítások.

A jobb oldali ábrán látható, hogy egy-egy láb több funkcióval is rendelkezik. Azt, hogy éppen miként működjön a működtető szoftverben kell konfigurálni. Az minimális alkatrészigénye csupán egy kerámiarezonátor és egy ellenállás. A rezonátort az OSC1 és OSC2 lábakra kell kötni, majd a rezonátor középső (GND) lábát 0V-ra kell kötni. Rezonátor alkalmazásával el lehet kerülni a pár pikofarados kondikat, amiket kvarc esetén az OSC1, OSC2 lábak és a föld közé kell kötni. Az ellenállás az MCLR és a Vdd közé kell, és értéke 1k...10kOhm. Amennyiben ezt a lábat földre húzzuk egy nyomógombbal, a kontrollert reset-elni lehet. A két Vdd lábat összekell kötni, csakúgy, mint a két Vss lábat. A Vdd a +5V-os tápfeszültség bemenete, míg a Vss a 0V csatlakozója. Szűrésként érdemes még minél közelebb a tokhoz egy 100nF-os kondenzátort a Vdd és Vss közé tenni. (ezt minden digitális IC esetében célszerű beültetni)

Az RA0,1,2,3,5 és az RE0,1,2 működik analóg bemenetként és digitális I/O-ként is. Az RB port az IC-n belül tartalmaz programozható felhúzóellenállásokat is. Sőt, az RB0 megszakítást is képes generálni. Az RD port tetszőleges I/O funkciókat vezérelhet, míg az RC porton van néhány speciális számunkra fontos csatlakozó. Ilyen az RxD és a TxD láb, amik az USART áramkör be és kimenete. Az RC porton találhatók további kommunikációs pontok, amikről később még szó esik.

4.2 CD4051 analóg multiplexer/demultiplexer

Ez az IC képes 8 bemenetet 1 kimenetre multiplexelni, vagy 1 bemenetet 8 kimenetre demultiplexelni. Külön digitális és analóg résszel rendelkezik. Az analóg jelek feldolgozhatósági tartománya Vdd és Vee között lehetséges. ivel sehol sem fordul elő majd negatív feszültség, az IC Vss és Vee pontját össze lehet kötni. Az INHIBIT láb magas szintre álltásával a tok kikapcsolható, így biztosítva, hogy még több analóg jelforrást tudjunk kezelni. Egy lehetséges megoldás: egy külön digitális vezérlőjellel vezéreljük az INHIBIT lábat, és mindig csak egyet kapcsolunk testre. Így a bekapcsolt IC, és kíválasztott kimenet alapján meg tudunk határozni egy analóg jelforrást. Természetesen az INHIBIT lábat 64 potméter alatt nem kell használni, így a Vss, Vee láb mellé ez is a 0V-ra köthető stabilan. (szerencsére mind három láb egymás mellett van, így jelentősen leegyszerősödik a NYÁK tervezése.

MIDI vezérlők tervezése

8

A fentebbi ábrán látható a tok lábkiosztása. A 3. láb közös be és kimenet, ami azt jelenti, hogy ide érkezik a kiválasztott analóg jel, vagy innen kapcsolódik valamelyik kimenetre. Az oda-vissza működést az biztosítja, hogy az A, B, C lábakon kiválasztott kapu kétirányú analóg kapcsoló. Így arra használhatjuk, amire akarjuk, mindössze arra kell vigyázni, hogy a mikrovezérlő lábát mindig a megfelelő állapotba kell hozni. Vagy bemenet, vagy kimenet. Szerencsére, reset után minden láb bemenet, így nem történhet nagyobb baj.

4.3 CD4094 soros-párhuzamos átalakító

Ez az IC shift-regiszteres átalakító. A bemenetére sorosan érkező adatbiteket beírja a tároló megfelelő rekeszébe. Íráskor a legelső rekesz tartalmát tovább tolja, a másodikba, majd az új adat a legelsőbe érkezik, és így tovább. Értelemszerűen, az adatbitek kiküldését a legutolsó rekesz tartalmával kell kezdeni, mivel a teljes adatmennyiség átvitele után az utolsó rekeszbe kerül az elsőként bevitt bit. Tetszőleges számú tok sorbaköthető egymással, így 3 vezeték felhasználásával tetszőleges számú kimenet kezelhető. A működéséhez szükséges három bemeneti jel a következő: CLK(órajel), DATA (soros adat bemenet), STROBE (írás). Az írás megkezdése előtt a STROBE lábat alacsony szintre kell állítani, ezzel jelezve, hogy adatot fogunk bevinni. Ezek után a DATA vonalra egyenként kell kiküldeni az adatokat, és azórajelbemeneten (CLK) felfutó jellel kell érvényesíteni a beírást. Minden felfutó CLK után lépteti a regiszterek tartalmát hátrafelé. Miután az összes bitet beírtuk, ismét magas szintre állítjuk a STROBE jelet.

Kaszkádba kötéshez az első tok mindhárom lábára a bemenő három vonalat kötjük. A többi tok csak a STROBE és a CLK jelet kapja meg közvetlenül. A Qs lábon a kilépő bit jelenik meg, amit éppen ezért soron következő tok DATA bemenetére kell kötni. Az OE lábat értelemszerűen magas szintre kell kötni a működéshez.

4.4 CD4021 párhuzamos-soros átalakító

Szintén shift-regiszteres IC. A bemenetére érkező 8 jelet sorosan ki lehet olvasni, hasonlóan az előzőhöz. Szintén három vonal kell a kezeléséhez: PAR/SER CONT (olvasás vezérlése), CLK (órajel), Q8 (soros adat kimenet). A PAR/SER CONT lábat olvasáskor alacsony szintre kell állítani, mely az olvasás végéig ott is marad. A CLK bemenetre adott órajel hatására megjelenik a Q8 lábon a soron következő bit. Az olvasás végén magas szintre kell állítani a PAR/SER CONT lábat.

MIDI vezérlők tervezése

9

4.5 6N138 optocsatoló

Az optocsatoló nagysebességű, így biztonsággal átvihető vele a kívánt sávszélesség. A Darlington kimenete miatt a megfelelő terhelhetőség is biztosított. Az optocsatolót MIDI áramhurokos bemenet esetén kell alkalmazni. A munkapontok beállítása egy későbbi kapcsolási rajzon láthatók.

MIDI vezérlők tervezése

10

5. Modulok kapcsolási rajzai

A következő oldalakon a fentebb ismertetett modulok lehetséges megvalósításai láthatók. A kapcsolási rajzokat megpróbáltam tematikusan sorbarendezni, így megkönnyítve az átláthatóságot. Minden rajzhoz tartozik egy rövidke leírás, elemzés a működéshez. Csupán a leglényegesebb információk szerepelnek, mivel a működést nagymértékben az alkalmazott szoftver határozza meg.

5.1 Központi egység

A központi egység tartalmazza két LCD modul csatlakozósorát, TTL és és szabvány MIDI ki és bemenetet, nyolc analóg bemeneti csatornát, három bites címzőt, tápfeszültség elosztót, és a shift-regiszter részére három vonalat, valamint nyolc szabadon felhasználható bitet a PORTD-n. A TIMER0 órajele is elérhető egy külön aljzaton.

Az „AN_IN” csatlakozósor az analóg bemenetek fogadására van. Az analóg bemenetek és a többi 4051-es modul címzésére az „ADDRESS” port van lefoglalva.

A „T0_CLK” a TIMER0 modul külső órajelbemenete. Ennek segítségével számolhatunk impulzusokat, vagy használhatjuk másodlagos sorso bemeneti pontnak.

A shift-regiszteres P/S és S/P modulok vezérlésére a „SERIAL” port használható. Amennyiben több ilyen portra van szükség, a PORTD pontjait használhatjuk. A 6N138 munkaponti beállításai a rajzon láthatók. A MIDI csatlakozók kiosztása hátulnézetben van ábrázolva.

Két LCD modul csatlakoztatható a panelra. A két LCD modul azonos vezérlőjeleket kap, kivétel ezalól az ENABLE láb. A konkrét LCD típus ismeretében esetleg a kivezetések sorrendjét fel kell cserélni. A 10K trimmerpotméter a két LCD modul a kontrasztot állítja. Amennyiben háttérvilágítás van az LCD-n, a 15 és 16-os lábak a háttérvilágítás LED-jei.

A tápfeszültség bemenet, és a további modulok tápcsatlakozója a „SUPPLY” port. Ha RESET-elni kívánjuk a vezérlőt, az MCLR láb és a föld közé egy nyomógombot kell kötni. Ezesetben érdemes nagyobb ellenállást tenni az MCLR felhúzójaként.

MIDI vezérlők tervezése

11

5.2 Analóg multiplexer

Ez az analóg multiplexer egyidejűleg 24 potméter (vagy bármilyen analóg jelforrást) képes multiplexelni a három kimeneti pontra. Az „A_B_C” csatlakozósor a kimenetet címzi. Az „ANOUT” porton a három IC kimenete van, amiket a mikrovezérlő tetszőleges ANX bemeneteire köthető. A szoftver elősször megcímzi az egyik jelforrást a nyolcból, majd egyenként beolvassa az „ANOUT” feszültségeit. Ezután lépteti az „A_B_C” értékét, és így tovább. A fenti séma alapján további tokokat is be lehet iktatni.

A GND és VCC lábak környékén található szögletes zárójelben lévő számok mutatják, mely lábakra kell az adott tápvezetéket kötni. A GND pont a 7-ik lábra is megy, mivel a VEE jelen esetben szintén 0V-ot kap.

5.3 Digitális bemenet

5.3.1 Shift-regiszteres tárolóval

A kapcsolási rajzon jól látható, hogyan kell kaszkád kapcsolásban használni a 4021-es tokot. A soron

MIDI vezérlők tervezése

12

következő kilépő bit az első tok Q8 lábáról a második tok SI lábára érkezik. Ezzel a megoldással tetszőleges számú bemenet beolvasható.

5.3.2 Analóg multiplexeres bemenet

A 4051-es IC használható digitális jelek multiplexelésére is. Fontos, hogy ilyenkor ugyanazt a Vcc-t kapja, mint amiről a mikrovezérlő működik, így a jelszintek nem fognak eltérni. Az ADDR bemeneten címezhető a digitális bemenet. A bemenetek egy 10K ellenálláson keresztül fel vannak kötve Vcc-re. A nyomógombokat a BUTTONS portra kell kötni, a bemeneti pont és a föld közé. A rajzon látható egy gomb bekötése.

5.3.3 Mátrix

A mátrix sorát és oszlopát egy-egy 4051 állítja elő. Az egyik vonal az X, a másik pedig az Y. Az X sort az ADDR_X porton lehet címezni, míg az Y oszlopot az ADDR_Y porton. Az áramkör vezérlése: Az ADDR_Y oszlopon kiválasztunk egy oszlopot a nyolcból, és azt magas szintre állítjuk. Ekkor az adott oszlopon levő összes gomb egyik vége (a diódán keresztül) feszültséget kap. Az X sort pedig be kell olvasni egyenként az ADDR_X léptetésével. Majd a következő Y oszlopot állítjuk magas szintre és azt a sort olvassuk be. Egy gomb bekötése az alábbiak szerint megy végbe:

MIDI vezérlők tervezése

13

5.4 Digitális kimenet

5.4.1 Shift-regiszteres tárolóval

A 4094-es IC működése megtalálható a 4.3-as pontban. A kaszkádkapcsolás folyamán a Qs kimenetet kell a következő tok DATA bemenetére kötni. Tetszőleges tok felfűzhető a sorra. Még egyszer megjegyezném, hogy a soros adatok küldését az utolsó bittel kell kezdeni.

5.4.2 Analóg demultiplexerrel

A 4051-es IC demultiplexerkénti használatára már a mátrix esetében volt példa. Azonban ez nem a legszerencsésebb megoldás, mivel ellentétben a 4094-es IC-vel, ez nem rendelkezik kimeneti latch tárolóval. A mátrix esetében erre nem is volt szükség, mivel mindig csak egyetlen kimenetnek kellett magas szinten lennie.

Szükség esetén egy kiegészítő latch tárolót lehet az X0..X7 pontokra.

5.4.3 LED kijelzők mátrixa

Mivel a LED-es kijelzők önmagukban is diódaként viselkednek, ezért nem szükséges sorba kötni velük a diódát úgy, mint a gombok kezelésekor. Az X porton keresztül kiválasztunk egy sort úgy, hogy az adott vonalat alacsony szintre állítjuk, míg a többit magasra. Ezek után az Y oszlop megfelelő bitjeire magas szintet kapcsolunk, ahol azt akarjuk, hogy a LED világítson. Ahhoz, hogy a LED-ek ne villogjanak, olyan gyorsan kell vezérelni a LED-eket, hogy szemünk tehetetlensége folytán ne lássuk a villódzást. Ez a frekvencia kb. 30Hz. Érdemes ilyenkor egy megszakítási rutinba helyezni a LED-ek frissítését, majd valamelyik időzítő/számlálót a PIC-ben 30-40Hz-re kell programozni.

5.4.4 LCD kijelző illesztése

A központi egység áramkörén már látható volt két darab LCD illesztésére példa. A példában szereplő EDT által gyártott EW162G0GR típusú háttérvilágítás nélküli kijelző két fajta módon vezérelhető. 4 és 8 bites

MIDI vezérlők tervezése

14

utasításokkal. A központi egység modulja csupán 4 bites adatvezetéket használt. Az LCD-t kezelő program a következő fejezetben kerül terítékre. Addig is szerepeljen itt a két megoldás bekötése, amit szükség esetén módosíthatunk, de akkor a programot is át kell írni.

A bal oldali ábrán látható a 8 adatvonalas bekötés, míg a jobb oldalon a 4 adatvonalas bekötés. A kivezetések szerepe, és az LCD kivezetési a programlista alapján könnyen beazonosítható. (a központi egység moduljánál a 4 bites vezérlés RB0,1,2,3 vezetékei fel lettek cserélve, mert így könnyebb volt NYÁK-ot tervezni hozzá; a későbbiekben közölt program viszont a jobb oldali áramkörrel működik megfelelően)

MIDI vezérlők tervezése

15

6. Programozás

A PIC programját jól bevált módszereink szerint kell megírni. Én Pascal-os múltam miatt előnyben részesítem a magyar fejlesztésű Pic2Pas fordítóprogramozt, ami támogatja mind az LCD kijelző kezelését, mind pedig a magas szintű nyelvek esetében megszokott átláthatóságot, és moduláris felépíhetőséget. Ajánlom, hogy bármilyen nyelven is történjék a fejlesztés, hozzunk létre egy függvény könyvtárat a legalapvetőbb rutinokkal, mint a portok inicializálása, A/D konverziós feladatok, shift-regiszteres áramkörök kezelése, LCD kezelése, mátrix lekérdezése, időzítők programozása, soros kommunikáció.

A leghatékonyabb programot úgy készíthetjük, ha megszakításokat kezelünk. Így gyors lesz a program, és nem kell a polling (lekérdezés) által lefoglalt idővel számolni. A továbbiakban nem célom teljes forráskódok ismertetése, inkább egy-egy rutint mutatnék meg.

6.1 Portok inicializálása

Minden programot a portok inicializálásával kell kezdeni. Minden port bemenetként funkcionál RESET után. A legfontosabb, hogy a PORTA és PORTE portok megfelelő bitjeit analóg bemenetként konfiguráljuk, az analóg multiplexerek címző bitjeit kimenetre állítsuk, valamint az PORTC soros TxD és RxD lábát ki-, illetve bemenetre váltsuk.

Procedure Init;Begin

BitSet(TRISC,7); {RxD láb bemenetre konfigurálva}BitClear(TRISC,6); {TxD láb kimenetre konfigurálva}BitClear(TRISC,2); {potik címzéséhez RC2 kimenet}BitClear(TRISC,1); {potik címzéséhez RC1 kimenet}BitClear(TRISC,0); {potik címzéséhez RC0 kimenet}

TRISA:=255; {a PORTA minden lába bemenet}TRISE:=255; {a PORTE minden lába bemenet}

ADCON1:=0; {RA0, 1, 2, 3, 5 és RE0, 1, 2 analóg bemenet}BitSet(ADCON0,7); {AD órajele Fosc/32}BitClear(ADCON0,6); {AD órajele Fosc/32}BitSet(ADCON1,0); {AD modul bekapcsolása}

BitClear(TXSTA,4); {USART aszinkronba váltása}BitClear(TXSTA,2); {USART alacsony baud-rate}SPBRG:=9; {baud-rate beállítása; 20MHz & 31,25kb/s}BitSet(RCSTA,7); {USART bekapcsolása}BitSet(TXSTA,5); {adás engedélyezése}

End;

6.2 Analóg/digitál konverzió

A potméterek beolvasásához álljon itt a konverziót vezérlő függvény. A multiplexer címzése, és a megfelelő analóg bemenet kiválasztására másik programrész van.

Funcion GetAnalog;Var

data;Begin

BitSet(ADCON0,2); {AD átalakító indítása}data:=ADRESH; {csak a felső 8 bitre van szükség}rRight(data); {jobbra forgatjuk, nem kell a legalsó bit}data:=data-128; {7 bitesre csonkolás}Return(data); {a függvény visszatérési értéke}

End.

MIDI vezérlők tervezése

16

6.3 Analóg multiplexer címzése

A 4051 három bites címmel rendelkezik. Ehhez az RC0..2 kivezetések csatlakoznak. A nyolcas csoportba rendezett potik közül itt kell kiválasztani azt az egyet, amit éppen a megfelelő ANx bemenetre kapcsoltatunk.

varADDR; {a poti kiválasztása 0..7}

PORTC:=PORTC and 11111000b; {RC0..2 kinullázása}PORTC:=PORTC or ADDR; {RC0..2 beállítása ADDR címre}

Az ADDR bájtba kell előtte beírni a multiplexer által kiválasztandó bemenet számát, és az OR logikai utasítás hatására csak az alsó 3 bájt fog módosulni. Fontos, hogy az ADDR bájt 5 felső bitje 0 maradjon.

6.4 Analóg bemenet kiválasztása

A mikrovezérlőn 8 analóg bemenet található. Ezek közül egyet ki kell választani a konverzió megkezdése előtt. Az ADCON0 regiszter 3..5 bitje segítségével.

Procedure SelectAnalogInput(x); {az ANx kiválasztása; pl. X=7=00000111b}begin

rLeft(x); {balra forgatás először; X=00001110b} rLeft(x); {másodszor; X=00011100b}rLeft(x); {harmadszor; X=00111000b}ADCON0:=ADCON0 and 11000111b; {ADCON0.3..5 kinullázása}ADCON0:=ADCON0 or X; {ADCON0.3..5 beállítása}

end;

Mivel a 3-ik bittől kezdődik a belső multiplexer címzése, háromszor balra kell forgatni az X-et. Ezután AND-OR kapcsolatba kell hozni ADCON0-t X-szel.

6.5 Adat küldése USART-on

A kiküldendő bájtot a TXREG regiszterbe kell írni. Ha egy bájt küldése folyamatban van, akkor már tölthetjük is a soron következő adatot a TXREG-be. Az elején már említésre került, hogy egy MIDI csatorna üzenet három bájtból áll. Elsőként a csatorna száma megy el, majd a vezérlő száma, végül a vezérlő értéke. A példa kedvéért az első MIDI csatornára küldjük ki a 32-es vezérlő értékét, ami legyen mondjuk 63.

Procedure SendMidi(ch,ctrl,value);begin

TXREG:=$B+ch; {kontroller üzenetek $B-vel kezdődnek}delay; {várni kell, amíg elküldi a bájtot}TXREG:=ctrl; {most jön a kontroller száma/típusa}delay; {megint várunk}TXREG:=value; {majd elküldjük az értéket is}delay; {várunk}

end;

A várakozó rutin helyett inkább figyeljük a PIR1 regiszter 4. bitjét, mivel ha az nullára vált, akkor szabaddá vált a TXREG.

while clear PIR1.4 do begin end; {vizsgáljuk a megszakítási flaget}TXREG:=…; {amennyiben végzett, küldhetünk}

Arra figyelni kell, hogy néhány vezérlő MSB, néhány vezérlő LSB adatot küld. Ezt a MIDI implementáció pontosan leírja, megkereshető benne.

MIDI vezérlők tervezése

17

6.6 Adat fogadása USART-on

Természetesen MIDI üzenetet fogadni is tudunk, bár erre előtte nem tértem ki igazán. Ahol ennek nagyobb jelentősége van, az az, hogy néhány program képes elküldeni az aktuális vezérlő beállításokat, melyik gomb van nyomva, melyik poti milyen állásban van. Ennek alapján tudjuk megfelelő helyre mozgatni a motoros fadereket, knobokat, vagy akár az LCD kijelzőn megjeleníthetjük, hogy volt a preset beállítása eredetileg, ha például egy szinti presetet módosítunk a kontrollerrel.

Van még egy olyan eset, amikor egy PC-s programon megszerkesztjük a kontroller presetjeit, majd SYSEX formátumban elküldjük a MIDI kontrollernek. Szerencsére a 16F877 képes módosítani is saját flash memóriáját, vagy a presetet a belső EEPROM-jába tudja írni. Ha nem lenne elég a belső EEPROM, csatlakoztathatunk külsőt is a rendszerhez.

Arról, hogy mikor érkezik adat az USART portra, megszakítás jelzi. Méghozzá a PIR1 regiszter 5-ik bitje. Egyre vált, ha beolvasott egy bájtot. Ezek után az RCREG-be kerül az adat.

Function MidiReceive;var

data;begin

data:=RCREG;Return(data);

end;

Azt, hogy mikor érkezik adat, azt a megszakítása rutinba kell figyelni, és a következő kódrészletet kell elhelyezni valahol a forrásban.

Procedure Interrupt;var

…begin

…if set PIR1.5 then {ide szúrjuk be, mit csináljon, ha adat érkezik}begin

end;…

end;

6.7 Potméterek lekérdezése tömb segítségével

Sokkal szebben mutat egy tömör rutin a potméterek kezelésére, ha nem 3-4 rutint használunk hozzá, hanem egyetlen rövid programrészbe sűrítjük. Ehhez tömböt deklarálunk, és abba írjuk a beolvasott értékeket.

Procedure ReadPots;var

pots:array[0..7; 0..7]; {potik[ANx; ADDR]}i,j,k; {segédváltozók}data; {az AD végterméke ide kerül}

beginfor i:=0 to 7 dobegin

k:=i;rLeft(k); {háromszor balra forgatjuk);rLeft(k);rLeft(k);ADCON0:=ADCON0 and 11000111b;

MIDI vezérlők tervezése

18

ADCON0:=ADCON0 or k;for j:=0 to 7 dobegin

PORTC:=PORTC and 11111000b; {alsó három bit nullázása}PORTC:=PORTC or j; {ADDR portra a cím kiküldése}BitSet(ADCON0,2); {AD indítása}delay; {minimális várakozás}data:=ADRESH;rRight(data); {jobbra forgatás}data:=data-128; {7 bitesre csonkítás}pots[i,j]:=data; {az aktuális adat másolása a tömb rekeszébe}

end;end;

end;

Ennyi lett volna az eljárás, mely 64 potmétert digitalizál, és 8x8-as tömbbe menti az értékeket. Mivel nem kell folyton elküldeni a potméterek állását, csak változáskor, ezért szükség van egy segédtömbre, ami mindig az előző adatokat tartalmazza.

A mostani program így fog működni, sőt, ha változás történt, azt azonnal küldi is.

Procedure ReadPots;var

pots:array[0..7; 0..7]; {potik[ANx; ADDR]}pots_temp:array[0..7;0..7]; {segédtömb}i,j,k; {segédváltozók}data; {az AD végterméke ide kerül}

beginfor i:=0 to 7 dobegin

k:=i;rLeft(k); {háromszor balra forgatjuk);rLeft(k);rLeft(k);ADCON0:=ADCON0 and 11000111b;ADCON0:=ADCON0 or k;for j:=0 to 7 dobegin

PORTC:=PORTC and 11111000b;PORTC:=PORTC or j; {ADDR portra a cím kiküldése}BitSet(ADCON0,2); {AD indítása}delay; {minimális várakozás}data:=ADRESH;rRight(data); {jobbra forgatás}data:=data-128; {7 bitesre csonkítás}pots[i,j]:=data; {az aktuális adat másolása a tömb rekeszébe}if pots[i,j]<>pots_temp[i,j] then {ha változott, meghívjuk SendMidi rutint}begin

SendMidi(midi_ch, i*j+32,data);end;pots_temp[i,j]:=data; {ide is mentjük]

end;end;

end;

Az eljárás a korábban már említett SendMidi eljárást hívja meg. Jelen esetben egy másik változóba írjuk a MIDI csatorna számát. Ez a változó (midi_ch) jelen esetben a program más részében kap értéket.

MIDI vezérlők tervezése

19

Természetesen más módokon is kezelhetőek a potméterek, itt csupán néhány lehetséges megoldást vázoltam.

6.8 Shift-regiszter kezelése

Itt csupána kimenetek kezelését mutatom be, a bemeneteké szinte ugyanígy működik. A központi modulon található egy SERIAL nevű port. Nos, azt fogjuk használni, méghozzá a két kaszkádba kapcsolt 4094 vezérlésére. (a kapcsolási rajzok közt szereplő kaszkádkapcsoláshoz)

varoutputs:array[0..15]; {ide kell előtte tölteni a biteket}i;

Procedure InitPorts; {a megfelelő PORTC lábak kimenetre}begin

TRISC:=TRISC and 11000111; {RC3, 4, 5 nullázása}end;

Procedure SendShiftedOutput;begin

ClearBit(PORTC,3); {STROBE lábat alacsony szintre}for i:=0 to 15 dobegin

if set outputs[i] then SetBit(PORTC,4) else ClearBit(PORTC,4);delay;SetBit(PORTC,5); {órajel érvényesíti}delay;ClearBit(PORTC,5);delay;

end;SetBit(PORTC,3); {STROBE lábat magas szintre}

end;

A késleltetések azért kellenek, hogy a 4094 megfelelően tudjon működni. Elég 100us körüli érték.

6.9 LCD kezelése

Az LCD kijelző rutinjai a Pas2Pic „units” könyvtárában is megtalálható, azonban, ha valaki assembly vagy C nyelvre is meg kívánja írni, az alábbi programlisták alapján könnyen megteheti.

MIDI vezérlők tervezése

20

6.9.1 LCD rutin (4 bites adatvonal)

// unit for EW162G0GR type LCD screen. (2x16 character)// Based on Per Medin's unit.

{ Display is connected as follows DB4 - RB0 DB5 - RB1 DB6 - RB2 DB7 - RB3 RS - RB4 E - RB5 WR - GND }

uses delay4M, eeprom;

interface

procedure Write(WrtReg); procedure LCDInit; procedure LCDNumberOut(num); procedure GotoXY(XPos,YPos); Procedure WriteString(i); // Writes a Nullterminated EEProm

string at current displaypos. Procedure ClearLCD;

implementation

var LCDPort absolute PortB; LCDTris absolute TrisB; Temp;

Procedure E_PulseOut;Begin BitSet(LCDPort,5); delay100us; BitClear(LCDPort,5); delay100us;End;

procedure CmdOut(High, Low);begin BitClear(LCDPort,4); // Low RS = Command Mode

LCDPort:=(LCDPort and 240) or High; E_PulseOut; LCDPort:=(LCDPort and 240) or Low; E_PulseOut;

BitSet(LCDPort,4);End;

Procedure ClearLCD;Begin CmdOut(0, 1);End;

procedure LCDInit;begin

LCDTris:=0; LCDPort:=0;

Delay(30);

{ 8-bit mode } CmdOut(0, 3);

Delay(5); E_PulseOut; E_PulseOut;

{ 4-bit mode } CmdOut(0, 2);

{ disp on, cursor off, blink off } CmdOut(0, 12);

{ inc cursor pos, no disp shift } CmdOut(0, 6);

{ 4-bit, two lines, 5x7 dots } CmdOut(2, 8);

{ Clear display } ClearLCD;

{ Wait so display gets ready } Delay(10);end;

procedure LCDNumberOut(num);var a,b,c;begin a:=num;

b:='0'; while a>=100 do begin b+=1; a-=100; end; if b<>'0' then Write(b); delay(2); c:=b;

b:='0'; while a>=10 do begin b+=1; a-=10; end;

if c='0' then if b<>'0' then Write(b);

if c<>'0' then Write(b); delay(2);

Write(a+'0'); delay(2);

end;

procedure GotoXY(XPos,YPos);var addr;begin addr:=128; if YPos=2 then addr+=64; addr+=XPos-1; Temp:=addr and $F0; SwapF(temp); addr:=addr and $0F; CmdOut(Temp,addr);end;

procedure Write(WrtReg);begin SwapF(WrtReg); LCDPort:=(LCDPort and 208) or (WrtReg and 15); E_PulseOut; SwapF(WrtReg); LCDPort:=(LCDPort and 208) or (WrtReg and 15); E_PulseOut; BitSet(LCDPort,4); // High RS = Leave in Char

modeend;

Procedure WriteString(i); // Writes a Nullterminated EEProm string at current displaypos.

Begin Temp:=EEPROM_Read(i); While Temp <> 0 Do Begin Write(Temp); Inc(i); Temp:=EEPROM_Read(i); End;End;

End.

MIDI vezérlők tervezése

21

6.9.2 LCD rutin (8 bites adatvonal)

// unit for EW162G0GR type LCD screen. (2x16 character)

{* * How to connect the LCD to the PIC : * RD0 - DB0 * RD1 - DB1 * ... * RD7 - DB7 * RE0 - RS * RE1 - R/W * RE2 - E * If you need a less pin-wasting solution, use lcdunit2.pas ! }

unit lcdunit;

interface

uses delay20M;

var LCDDataTRIS absolute TRISD; LCDCtrlTRIS absolute TRISE; LCDDataPORT absolute PORTD; LCDCtrlPORT absolute PORTE;

procedure LCDInit; procedure LCDNumberOut(lcdir); procedure GotoXY(XPos,YPos); procedure Write(WrtReg);

implementation

procedure LCDInit;begin LCDDataTRIS:=0; LCDCtrlTRIS:=0; LCDDataPORT:=0; PORTE:=0; ADCON1:=14; TRISA:=255;

BitClear(LCDCtrlPORT,0); Write(56); Delay(10);

Write(56); Write(6); Write(12); Write(24); Write(1); delay(2); Write(128); BitSet(LCDCtrlPORT,0);end;

procedure LCDNumberOut(lcdir);var a,b,c;begin a:=lcdir;

b:='0'; while a>=100 do begin b+=1; a-=100; end; if b<>'0' then Write(b); delay(2); c:=b;

b:='0'; while a>=10 do begin b+=1; a-=10; end;

if c='0' then if b<>'0' then

Write(b);

if c<>'0' then Write(b); delay(2); Write(a+'0'); delay(2);

end;

procedure GotoXY(XPos,YPos);var addr;begin addr:=128; if YPos=2 then addr+=64; addr+=XPos-1; BitClear(LCDCtrlPORT,0); Write(addr); delay(2); BitSet(LCDCtrlPORT,0);end;

procedure Write(WrtReg);begin LCDDataPORT:=WrtReg; BitSet(LCDCtrlPORT,2); delay(2); BitClear(LCDCtrlPORT,2);end;

End.

MIDI vezérlők tervezése

22

6.10 További rutinok

A többi áramkör rutinjait a fentiek alapján már el lehet készíteni. Az előbb említett pontokban kerültem a megszakítások használatát, mivel annak főképp konkrét programrendszer esetén van értelme. A programot teljes egészében a megszakítások kezelésének tükrében kell elkészíteni.

A mátrix kezelésének is megszakítást használó rendszer esetén van gyakorlati szerepe. Előfordulhat, hogy a gombokat, kapcsolókat prellmentesíteni kell. Ez esetben a beolvasást követően egy rövid várakozó ciklust kell beiktatni a kódba. Sok I/O kezelésekor latch áramköröket célszerű használni, elsősorban a kimeneteken.

A program megírása történhet bármilyen programnyelven, amihez létezik PIC fordító. A bankváltásokat Pascal fordító automatikusan elvégzi, de assembly nyelv esetén használni kell a BANKSEL utasítást a bankváltásokhoz.

MIDI vezérlők tervezése

23

7. További megjegyzések

Az LCD modul programlistájában szerepel DELAY20M és DELAY4M nevű modul. Ezek a modulok a Pas2Pic fordító beépített rutinjai időzítésekhez. Értelemszerűen a 20M 20MHz-es kvarc esetén, a 4M unit 4MHz-es kvarc esetéb használatos. A minél gyorsabb futási idő eléréségez a 20MHz-es kvarc javasolt, amint az fenti központi modul kapcsolási rajzán is szerepel.

A bemeneti pontokat érdemes egy 10K-s ellenállással a tápra kötni, hogy a bemenetekre kötött gomb, kapcsoló a bemeneti pont és a föld közé kerüljön. Így zavarvédetté válik a bemenet, de figyelni kell az invertálás miatt.

Amennyiben több MIDI-kontrollert kívánunk rendszerbe kapcsolni MIDI mergert kell használni. Igen ám, de egy kis ügyeskedéssel ki lehet iktatni. A mikrovezérlőn kiválasztunk egy I/O port bitet, amit nevezzünk el BUSY-nak. Ez jelzi a foglaltságot. Ezt a BUSY pontot minden MIDI-kontrolleren kivezetünk, és össze is kötjük őket. A BUSY pontot minden egyes MIDI kontroller esetén egy 20K-s ellenállással felkötjük a tápra. A program elején, az inicializáláskor ezt a pontot (BUSY) bemenetre konfiguráljuk. Ha egy adatbájtot akarunk kiküldeni, megvizsgáljuk mi van ezen a ponton. Ha magas szint, akkor az azt jelzi, hogy a BUSY szabad. Ekkor kimenetre konfiguráljuk, és lehúzzuk alacsony szintre, és kiküldjük a bájtokat. Az átvitel végén bemenetre állítjuk. Ha viszont a portbit vizsgálatakor alacsony szintet érzékeltünk, akkor várunk a magas szintre. Érdemes minden átvitt MIDI üzenet után várni egy kicsit, hogy ha netán egy másik vezérlő is szeretne küldeni, legyen ideje rá. (amúgy is csak két kezünk van)

Egy kis továbbgondolás után akár prioritási szinteket is létrehozhatunk, így kompenzálható a latency. A fontosabb üzenetek azonnal küldhetőek legyenek, míg más üzenetek várhatnak 1-2ms-nyi időt.

8. Linkajánló

http://www.microchip.com Mikrovezérlő adatlapok, EEPROM, stb.http://www.chipcad.hu Alkatrészek: kvarcok, PIC-ek, memóriák, ICD2, stb.http://www.pas2pic.tk Magyar fejlesztésű compilerhttp://www.ic-prog.com PIC programozó hardver, szoftverhttp://madhead.gportal.hu Kapcsolódó fórum (2005. július-tól)

9. Ajánlott szakirodalom

Dr. Madarász László : A PIC16C mikrovezérlők [GAMF jegyzet]Dr. Kónya László : PIC mikrovezérlők alkalmazástechnikája [ChipCAD]Kovács Csongor : Digitális elektronikaMicroChip Technical Library 2004/2005Egyéb digitális áramkörök gyártóinak katalógusai

10. Programajánló

Eagle Light 4.13 NYÁK tervező program (1-2 réteg)Circuit Maker Áramkör szimulátor, kapcsrajz tervezőMultisim 7 Szimulációs programcsomagMPLAB 6 PIC-es fejlesztőcsomag

A cikk elkészítése során a szerző a lehető legnagyobb gondossággal járt el. Ennek ellenére hibák előfordulása nem zárható ki. Az ismeretanyag felhasználásának következményeiért a szerző felelősséget nem vállal. Minden jog fenntartva. Jelen cikket vagy annak részleteit a szerző engedélye nélkül bármilyen formátumban vagy eszközzel reprodukálni, tárolni és közölni tilos. A cikk PDF formátumban szabadon terjeszthető.

© Fejes Tamás, 2005

E-mail: [email protected]: http://madhead.gportal.hu

MIDI vezérlők tervezése

24

Melléklet

Table 1: Summary of MIDI Status & Data Bytes

STATUS BYTE DATA BYTES

1st Byte ValueBinary Hex Dec

Function 2nd Byte 3rd Byte

10000000100000011000001010000011100001001000010110000110100001111000100010001001100010101000101110001100100011011000111010001111

808182838485868788898A8B8C8D8E8F

128129130131132133134135136137138139140141142143

Chan 1 Note off Chan 2 " Chan 3 " Chan 4 " Chan 5 " Chan 6 " Chan 7 " Chan 8 " Chan 9 " Chan 10 " Chan 11 " Chan 12 " Chan 13 " Chan 14 " Chan 15 " Chan 16 "

Note Number (0-127)

see Table

2 " " " " " " " " " " "

Note Velocity(0-127)

""""""""""""""

10010000100100011001001010010011100101001001010110010110100101111001100010011001100110101001101110011100100111011001111010011111

909192939495969798999A9B9C9D9E9F

144145146147148149150151152153154155156157158159

Chan 1 Note on Chan 2 " Chan 3 " Chan 4 " Chan 5 " Chan 6 " Chan 7 " Chan 8 " Chan 9 " Chan 10 " Chan 11 " Chan 12 " Chan 13 " Chan 14 " Chan 15 " Chan 16 "

" " " " " " " " " " " " " " " "

""""""""""""""""

1010000010100001101000101010001110100100101001011010011010100111101010001010100110101010101010111010110010101101

A0A1A2A3A4A5A6A7A8A9AAABACAD

160161162163164165166167168169170171172173

Chan 1 Polyphonic Chan 2 aftertouch

Chan 3 " Chan 4 " Chan 5 " Chan 6 " Chan 7 " Chan 8 " Chan 9 " Chan 10 " Chan 11 " Chan 12 " Chan 13 " Chan 14 "

" " " " " " " " " " " " " "

Aftertouchamount(0-127)

"""""""""""

MIDI vezérlők tervezése

25

1010111010101111

AEAF

174175

Chan 15 " Chan 16 "

" "

""

10110000101100011011001010110011101101001011010110110110101101111011100010111001101110101011101110111100101111011011111010111111

B0B1B2B3B4B5B6B7B8B9BABBBCBDBEBF

176177178179180181182183184185186187188189190191

Chan 1 Control/Chan 2 Mode change

Chan 3 " Chan 4 " Chan 5 " Chan 6 " Chan 7 " Chan 8 " Chan 9 " Chan 10 " Chan 11 " Chan 12 " Chan 13 " Chan 14 " Chan 15 " Chan 16 "

See Table three

" " " " " " " " " " " " "

SeeTablethree

"""""""""""""

11000000110000011100001011000011110001001100010111000110110001111100100011001001110010101100101111001100110011011100111011001111

C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF

192193194195196197198199200201202203204205206207

Chan 1 Program Chan 2 change

Chan 3 " Chan 4 " Chan 5 " Chan 6 " Chan 7 " Chan 8 " Chan 9 " Chan 10 " Chan 11 " Chan 12 " Chan 13 " Chan 14 " Chan 15 " Chan 16 "

Program # (0-127)

" " " " " " " " " " " " " "

NONE"""""""""""""""

11010000110100011101001011010011110101001101010111010110110101111101100011011001110110101101101111011100110111011101111011011111

D0D1D2D3D4D5D6D7D8D9DADBDCDDDEDF

208209210211212213214215216217218219220221222223

Chan 1 Channel Chan 2 aftertouch

Chan 3 " Chan 4 " Chan 5 " Chan 6 " Chan 7 " Chan 8 " Chan 9 " Chan 10 " Chan 11 " Chan 12 " Chan 13 " Chan 14 " Chan 15 " Chan 16 "

Aftertouch amount (0-127)

" " " " " " " " " " " " "

""""""""""""""""

11100000111000011110001011100011111001001110010111100110

E0E1E2E3E4E5E6

224225226227228229230

Chan 1 Pitch Chan 2 wheel Chan 3 control

Chan 4 " Chan 5 " Chan 6 " Chan 7 "

Pitch wheel LSB

(0-127) " " "

PitchwheelMSB

(0-127)"""

MIDI vezérlők tervezése

26

111001111110100011101001111010101110101111101100111011011110111011101111

E7E8E9EAEBECEDEEEF

231232233234235236237238239

Chan 8 " Chan 9 " Chan 10 " Chan 11 " Chan 12 " Chan 13 " Chan 14 " Chan 15 " Chan 16 "

" " " " " " " " "

"""""""""

11110000111100011111001011110011111101001111010111110110111101111111100011111001111110101111101111111100111111011111111011111111

F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF

240241242243244245246247248249250251252253254255

System Exclusive MIDI Time Code Qtr. Frame

Song Position Pointer Song Select (Song #)

Undefined Undefined

Tune request End of SysEx (EOX)

Timing clock Undefined

Start Continue

Stop Undefined

Active Sensing System Reset

** -see spec-

LSB (0-127)

? ?

NONE " " " " " " " " "

**-see spec-

MSBNONE

??

NONE"""""""""

** Note: System Exclusive (data dump) 2nd byte= Vendor ID followed by more data bytes and ending with EOX.

Table 2: Summary of MIDI Note Numbers for Different Octaves

Note NumbersOctave #C C# D D# E F F# G G# A A# B

-1 0 1 2 3 4 5 6 7 8 9 10 110 12 13 14 15 16 17 18 19 20 21 22 231 24 25 26 27 28 29 30 31 32 33 34 352 36 37 38 39 40 41 42 43 44 45 46 473 48 49 50 51 52 53 54 55 56 57 58 594 60 61 62 63 64 65 66 67 68 69 70 715 72 73 74 75 76 77 78 79 80 81 82 836 84 85 86 87 88 89 90 91 92 93 94 957 96 97 98 99 100 101 102 103 104 105 106 1078 108 109 110 111 112 113 114 115 116 117 118 1199 120 121 122 123 124 125 126 127

Note: The MIDI specification only defines note number 60 as "Middle C", and all other notes are relative. The absolute octave number designations shown here are based on Middle C = C4, which is an arbitrary assignment.

Table 3: Status Bytes 176-191; Control and Mode Changes (per channel)

MIDI vezérlők tervezése

27

2nd Byte Value 3rd ByteBinary Hex Dec

FunctionValue Use

00000000 00 0 Bank Select 0-127 MSB00000001 01 1 Modulation wheel 0-127 MSB00000010 02 2 Breath control 0-127 MSB00000011 03 3 Undefined 0-127 MSB00000100 04 4 Foot controller 0-127 MSB00000101 05 5 Portamento time 0-127 MSB00000110 06 6 Data Entry 0-127 MSB00000111 07 7 Channel Volume (formerly Main Volume) 0-127 MSB00001000 08 8 Balance 0-127 MSB00001001 09 9 Undefined 0-127 MSB00001010 0A 10 Pan 0-127 MSB00001011 0B 11 Expression Controller 0-127 MSB00001100 0C 12 Effect control 1 0-127 MSB00001101 0D 13 Effect control 2 0-127 MSB00001110 0E 14 Undefined 0-127 MSB00001111 0F 15 Undefined 0-127 MSB00010000 10 16 General Purpose Controller #1 0-127 MSB00010001 11 17 General Purpose Controller #2 0-127 MSB00010010 12 18 General Purpose Controller #3 0-127 MSB00010011 13 19 General Purpose Controller #4 0-127 MSB00010100 14 20 Undefined 0-127 MSB00010101 15 21 Undefined 0-127 MSB00010110 16 22 Undefined 0-127 MSB00010111 17 23 Undefined 0-127 MSB00011000 18 24 Undefined 0-127 MSB00011001 19 25 Undefined 0-127 MSB00011010 1A 26 Undefined 0-127 MSB00011011 1B 27 Undefined 0-127 MSB00011100 1C 28 Undefined 0-127 MSB00011101 1D 29 Undefined 0-127 MSB00011110 1E 30 Undefined 0-127 MSB00011111 1F 31 Undefined 0-127 MSB00100000 20 32 Bank Select 0-127 LSB00100001 21 33 Modulation wheel 0-127 LSB00100010 22 34 Breath control 0-127 LSB00100011 23 35 Undefined 0-127 LSB00100100 24 36 Foot controller 0-127 LSB00100101 25 37 Portamento time 0-127 LSB00100110 26 38 Data entry 0-127 LSB00100111 27 39 Channel Volume (formerly Main Volume) 0-127 LSB00101000 28 40 Balance 0-127 LSB

MIDI vezérlők tervezése

28

00101001 29 41 Undefined 0-127 LSB00101010 2A 42 Pan 0-127 LSB00101011 2B 43 Expression Controller 0-127 LSB00101100 2C 44 Effect control 1 0-127 LSB00101101 2D 45 Effect control 2 0-127 LSB00101110 2E 46 Undefined 0-127 LSB00101111 2F 47 Undefined 0-127 LSB00110000 30 48 General Purpose Controller #1 0-127 LSB00110001 31 49 General Purpose Controller #2 0-127 LSB00110010 32 50 General Purpose Controller #3 0-127 LSB00110011 33 51 General Purpose Controller #4 0-127 LSB 00110100 34 52 Undefined 0-127 LSB00110101 35 53 Undefined 0-127 LSB00110110 36 54 Undefined 0-127 LSB00110111 37 55 Undefined 0-127 LSB00111000 38 56 Undefined 0-127 LSB00111001 39 57 Undefined 0-127 LSB00111010 3A 58 Undefined 0-127 LSB 00111011 3B 59 Undefined 0-127 LSB00111100 3C 60 Undefined 0-127 LSB00111101 3D 61 Undefined 0-127 LSB00111110 3E 62 Undefined 0-127 LSB00111111 3F 63 Undefined 0-127 LSB01000000 40 64 Damper pedal on/off (Sustain) <63=off >64=on01000001 41 65 Portamento on/off <63=off >64=on01000010 42 66 Sustenuto on/off <63=off >64=on01000011 43 67 Soft pedal on/off <63=off >64=on01000100 44 68 Legato Footswitch <63=off >64=on01000101 45 69 Hold 2 <63=off >64=on01000110 46 70 Sound Controller 1 (Sound Variation) 0-127 LSB01000111 47 71 Sound Controller 2 (Timbre) 0-127 LSB01001000 48 72 Sound Controller 3 (Release Time) 0-127 LSB01001001 49 73 Sound Controller 4 (Attack Time) 0-127 LSB01001010 4A 74 Sound Controller 5 (Brightness) 0-127 LSB01001011 4B 75 Sound Controller 6 0-127 LSB01001100 4C 76 Sound Controller 7 0-127 LSB01001101 4D 77 Sound Controller 8 0-127 LSB01001110 4E 78 Sound Controller 9 0-127 LSB01001111 4F 79 Sound Controller 10 0-127 LSB01010000 50 80 General Purpose Controller #5 0-127 LSB01010001 51 81 General Purpose Controller #6 0-127 LSB01010010 52 82 General Purpose Controller #7 0-127 LSB01010011 53 83 General Purpose Controller #8 0-127 LSB

MIDI vezérlők tervezése

29

01010100 54 84 Portamento Control 0-127 Source Note01010101 55 85 Undefined 0-127 LSB01010110 56 86 Undefined 0-127 LSB01010111 57 87 Undefined 0-127 LSB01011000 58 88 Undefined 0-127 LSB01011001 59 89 Undefined 0-127 LSB01011010 5A 90 Undefined 0-127 LSB01011011 5B 91 Effects 1 Depth 0-127 LSB01011100 5C 92 Effects 2 Depth 0-127 LSB01011101 5D 93 Effects 3 Depth 0-127 LSB01011110 5E 94 Effects 4 Depth 0-127 LSB01011111 5F 95 Effects 5 Depth 0-127 LSB01100000 60 96 Data entry +1 N/A01100001 61 97 Data entry -1 N/A01100010 62 98 Non-Registered Parameter Number LSB 0-127 LSB01100011 63 99 Non-Registered Parameter Number MSB 0-127 MSB01100100 64 100 Registered Parameter Number LSB 0-127 LSB01100101 65 101 Registered Parameter Number MSB 0-127 MSB01100110 66 102 Undefined ?01100111 67 103 Undefined ?01101000 68 104 Undefined ?01101001 69 105 Undefined ?01101010 6A 106 Undefined ?01101011 6B 107 Undefined ?01101100 6C 108 Undefined ?01101101 6D 109 Undefined ?01101110 6E 110 Undefined ?01101111 6F 111 Undefined ?01110000 70 112 Undefined ?01110001 71 113 Undefined ?01110010 72 114 Undefined ?01110011 73 115 Undefined ?01110100 74 116 Undefined ?01110101 75 117 Undefined ?01110110 76 118 Undefined ?01110111 77 119 Undefined ?01111000 78 120 All Sound Off 001111001 79 121 Reset All Controllers 001111010 7A 122 Local control on/off 0=off 127=on 01111011 7B 123 All notes off 001111100 7C 124 Omni mode off (+ all notes off) 001111101 7D 125 Omni mode on (+ all notes off) 001111110 7E 126 Poly mode on/off (+ all notes off) **

MIDI vezérlők tervezése

30

01111111 7F 127 Poly mode on (incl mono=off +all notes off) 0

**Note: This equals the number of channels, or zero if the number of channels equals the number of voices in the receiver.

Table 4: MIDI 1.0 Specification Message Summary

StatusD7----D0

Data Byte(s)D7----D0 Description

Channel Voice Messages1000cccc 0nnnnnnn

0vvvvvvvNote Off event.

This message is sent when a note is released (ended).(nnnnnnn) is the note number.

(vvvvvvv) is the velocity.1001cccc 0nnnnnnn

0vvvvvvvNote On event.

This message is sent when a note is depressed (start).(nnnnnnn) is the note number.

1010cccc 0nnnnnnn0vvvvvvv

Polyphonic Key Pressure (Aftertouch).This message is sent when the pressure (velocity) of a

previously triggered note changes.(nnnnnnn) is the note number.(vvvvvvv) is the new velocity.

1011cccc 0nnnnnnn0vvvvvvv

Control Change.This message is sent when a controller value changes.

Controllers include devices such as pedals and levers. Certain controller numbers are reserved for specific purposes. See

Channel Mode Messages.(ccccccc) is the controller number.

(vvvvvvv) is the new value.1100cccc 0ppppppp Program Change.

This message sent when the patch number changes. (ppppppp) is the new program number.

1101nnnn 0ccccccc Channel Pressure (After-touch).This message is sent when the channel pressure changes.

Some velocity-sensing keyboards do not support polyphonic after-touch. Use this message to send the single greatest

velocity (of all the current depressed keys).(ccccccc) is the channel number.

1110nnnn 0lllllll0mmmmmmm

Pitch Wheel Change.This message is sent to indicate a change in the pitch wheel.

The pitch wheel is measured by a fourteen bit value. Center (no pitch change) is 2000H. Sensitivity is a function of the

transmitter.(llllll) are the least significant 7 bits.

(mmmmmm) are the most significant 7 bits.Channel Mode Messages (See also Control Change, above)

1011nnnn 0ccccccc0vvvvvvv

Channel Mode Messages.This the same code as the Control Change (above), but

implements Mode control by using reserved controller numbers. The numbers are:

Local Control.When Local Control is Off, all devices on a given channel will

MIDI vezérlők tervezése

31

respond only to data received over MIDI. Played data, etc. will be ignored. Local Control On restores the functions of the normal

controllers.c = 122, v = 0: Local Control Off

c = 122, v = 127: Local Control On

All Notes Off.When an All Notes Off is received, all oscillators will turn off.

c = 123, v = 0: All Notes Off(See text for description of actual mode commands.)

c = 124, v = 0: Omni Mode Off

c = 125, v = 0: Omni Mode Onc = 126, v = M: Mono Mode On (Poly Off) where M is the number

of channels(Omni Off) or 0 (Omni On)

c = 127, v = 0: Poly Mode On (Mono Off)(Note: These four messages also cause All Notes Off)

System Common Messages11110000 0iiiiiii

0ddddddd....

0ddddddd11110111

System Exclusive.This message makes up for all that MIDI doesn't support. (iiiiiii) is

a seven bit Manufacturer's I.D. code. If the synthesizer recognizes the I.D. code as its own, it will listen to the rest of the

message (ddddddd). Otherwise, the message will be ignored. System Exclusive is used to send bulk dumps such as patch

parameters and other non-spec data. (Note: Real-Time messages ONLY may be interleaved with a System Exclusive.)

11110001 Undefined.11110010 0lllllll

0mmmmmmmSong Position Pointer.

This is an internal 14 bit register that holds the number of MIDI beats (1 beat= six MIDI clocks) since the start of the song. l is

the LSB, m the MSB.11110011 0sssssss Song Select.

The Song Select specifies which sequence or song is to be played.

11110100 Undefined.11110101 Undefined.11110110 Tune Request.

Upon receiving a Tune Request, all analog synthesizers should tune their oscillators.

11110111 End of ExclusiveUsed to terminate a System Exclusive dump (see above).

System Real-Time Messages11111000 Timing Clock.

Sent 24 times per quarter note when synchronization is required (see text).

11111001 Undefined.11111010 Start.

Start the current sequence playing. (This message will be followed with Timing Clocks).

11111011 Continue.Continue at the point the sequence was Stopped.

11111100 Stop.

MIDI vezérlők tervezése

32

Stop the current sequence.11111101 Undefined.11111110 Active Sensing. Use of this message is optional. When initially

sent, the receiver will expect to receive another Active Sensing message each 300ms (max), or it will be assume that the

connection has been terminated. At termination, the receiver will turn off all voices and return to normal (non-active sensing)

operation.11111111 Reset.

Reset all receivers in the system to power-up status. This should be used sparingly, preferably under manual control. In particular,

it should not be sent on power-up.