|
|
Riadok 1: |
Riadok 1: |
- | {{VelkyNadpis|MIF 85 - Music interface pre PMD 85}}
| + | #redirect [[MIF 85]] |
- | | + | |
- | {{Ambox | type=notice | style=text-align:center | text=Bola opravená schéma MIF 85. Predošlá verzia mala problém s [[Dĺžka_impulzu_prerušenia_i8080|prerušením]].}}
| + | |
- | <br />
| + | |
- | | + | |
- | __TOC__
| + | |
- | | + | |
- | [[Obrázok:MIF85-prototype.jpg|thumb|Prototyp MIF 85]]
| + | |
- | | + | |
- | '''MIF 85''' je hudobný (zvukový) interface postavený na obvode '''SAA 1099P'''. Tento obvod, ktorý bol použitý napríklad aj v počítači SAM Coupé, poskytuje:
| + | |
- | * 6 frekvenčných generátorov - 8 oktáv na každý generátor
| + | |
- | * 2 šumové generátory
| + | |
- | * oddelené riadenie hlasitosti pre ľavý a pravý kanál, pre každý generátor - 16 úrovní
| + | |
- | * 2 generátory hlasitostnej obálky
| + | |
- | * mixér šumu a tónov
| + | |
- | | + | |
- | O prototype MIF 85 pojednáva [http://blog.borik.net/2012/04/mif-85-prototyp.html tento článok]
| + | |
- | | + | |
- | == Zapojenie MIF 85 ==
| + | |
- | | + | |
- | [[Obrázok:Mif-85-sch.png|thumb|Schéma MIF 85]]
| + | |
- | | + | |
- | MIF 85 sa pripája na aplikačný konektor [[PMD 85]], na ktorom sa nachádzajú všetky potrebné signály.
| + | |
- | | + | |
- | Obvodové zapojenie srdca MIF 85, teda samotného <code>SAA1099P</code> (IC1), vychádza z katalógového zapojenia, ale v podstate bolo prevzaté zo schémy počítača SAM Coupé. Hodinový vstup <code>SAA1099P</code> je budený oscilátorom, ktorý je tvorený obvyklým zapojením pomocou troch hradiel <code>74LS04</code> (IC3) a kryštálom 8 MHz.
| + | |
- | | + | |
- | Referencia pre analógové výstupy je vytvorená LC filtrom z napájacieho napätia. Analógové výstupy ľavého a pravého kanála sú cez jednoduchý filter vyvedené na pinovú lištu.
| + | |
- | | + | |
- | Keďže <code>SAA1099P</code> nemá vlastný resetovací vstup, napájanie <code>SAA1099P</code> je privedené zámerne cez tranzistor <code>BC557B</code> (Q2), aby bolo možné <code>SAA1099P</code> "umlčať" resetom počítača. To má síce za následok, že je <code>SAA1099P</code> mierne "podvýživené", nemá to však žiadny vplyv na funkčnosť.
| + | |
- | | + | |
- | Pôvodný návrh obsahoval niekoľko TTL obvodov, ale nakoniec bolo v záujme zjednodušenia zapojenia rozhodnuté, že sa použije hradlové pole GAL16V8 (IC2). To rieši niekoľko vecí:
| + | |
- | * dekodér portov
| + | |
- | * tvorba signálov <code>-CS</code> a <code>-WR</code> pre <code>SAA1099P</code>
| + | |
- | * tvorba signálu pre pripojenie/odpojenie napájania <code>SAA1099P</code> podľa stavu signálu <code>-RES</code>
| + | |
- | * register pre povolenie/zakázanie prerušenia od časovača
| + | |
- | * tvorba signálu prerušenia
| + | |
- | | + | |
- | Signál <code>-Fi2TTL</code> z aplikačného konektora je privedený na hodinový vstup časovača 0 <code>CLK0</code>. Časovač 0 sa programuje v móde 2, kedy sa podľa zadaného deliaceho pomeru na výstupe <code>OUT0</code> cyklicky objavuje impulz o dĺžke ≈0,5μs. Tento impulz je na vyvolanie [[Dĺžka_impulzu_prerušenia_i8080|prerušenia]] krátky a tak je predĺžený pomocou MKO 4047 asi na ≈12μs. Výstup MKO je vyvedený cez <code>BC547B</code> (Q1) ako otvorený kolektor na vstup prerušenia <code>-INT</code>. Pull-up odpor je súčasťou počítača.
| + | |
- | | + | |
- | | + | |
- | Libor Lasota vytvoril dve modifikované zapojenia MIF 85 bez GALu: [https://www.pmd85.cz/?page_id=1655 prvé] a [https://www.pmd85.cz/?page_id=1789 druhé].
| + | |
- | | + | |
- | == Plošný spoj ==
| + | |
- | | + | |
- | Plošný spoj bol navrhovaný pre zasunutie do aplikačného konektora na výšku. '''Konektor sa osadzuje zo strany spojov''', takže na to treba pamätať. Súčiastky teda smerujú od počítača dozadu.
| + | |
- | | + | |
- | Vo februári 2020 bola vytvorená 3. verzia DPS, ktorá sa líši iba tým, že namiesto pinových líšt je na DPS priamo FRB konektor.
| + | |
- | | + | |
- | {| align="center"
| + | |
- | | [[Obrázok:Mif85-v2-dps.png|thumb|Plošný spoj MIF 85 v2]]
| + | |
- | | [[Obrázok:MIF85v2-osadeny.jpg|thumb|Osadený plošný spoj MIF 85]]
| + | |
- | |}
| + | |
- | | + | |
- | == Rovnice pre GAL16V8 ==
| + | |
- | | + | |
- | Ako bolo spomenuté vyššie, použitie GALu ušetrilo niekoľko TTL obvodov. Nasledujúce rovnice sú jednoduché a myslím, že aj zrozumiteľné a s uvedenými komentármi už nepotrebujú ďalšie vysvetlenie.
| + | |
- | | + | |
- | CHIP MIF85 GAL16V8
| + | |
- |
| + | |
- | ; MIF85 - Music InterFace for PMD 85
| + | |
- | ; Dekodér adries portov SAA1099P a registra pre povolenie/zakázanie prerušenia.
| + | |
- | ; Riadenie napájania SAA1099P
| + | |
- |
| + | |
- | ; Port 0EFh je použitý pre výber registra SAA1099P.
| + | |
- | ; Port 0EEh je použitý pre zápis dát do vybraného registra.
| + | |
- | ; Bit D0 portu 0ECh je použitý pre povolenie/zakázanie prerušenia od časovača 0
| + | |
- | ; z i8253 umiestneného na interfejsovej doske PMD 85.
| + | |
- | ; Všetky porty sú iba pre zápis.
| + | |
- |
| + | |
- | ; 01 02 03 04 05 06 07 08 09 10
| + | |
- | CLK /ICO IOW A4 A5 A6 D0 A1 A0 GND
| + | |
- | ; 11 12 13 14 15 16 17 18 19 20
| + | |
- | /OE A3 A2 /RES ID A7 /CS /INT ICLK VCC
| + | |
- |
| + | |
- | EQUATIONS
| + | |
- |
| + | |
- | ; -CS (Chip Select) pre SAA1099P
| + | |
- | CS = A7 * A6 * A5 * /A4 * A3 * A2 * A1 ; 0EEh, 0EFh
| + | |
- | CS.oe = VCC
| + | |
- |
| + | |
- | ; hodinový signál pre zápis do registra povolenia/zakázania prerušenia
| + | |
- | ICLK = A7 * A6 * A5 * /A4 * A3 * A2 * /A1 * /A0 * IOW ; 0ECh
| + | |
- | | RES
| + | |
- | ICLK.oe = VCC
| + | |
- |
| + | |
- | ; register pre zakázanie prerušenia
| + | |
- | ID := /D0
| + | |
- | | RES
| + | |
- | ID.c = CLK
| + | |
- | ID.oe = OE
| + | |
- |
| + | |
- | ; samotný signál prerušenia
| + | |
- | INT = ICO * /ID
| + | |
- | INT.oe = VCC
| + | |
- | | + | |
- | == Popis portov a ovládania ==
| + | |
- | | + | |
- | MIF 85 využíva 3 výstupné porty: 0ECh, 0EEh a 0EFh. Adresácia je úplná A7 až A0.
| + | |
- | | + | |
- | SAA1099P sa ovláda dvoma portami:
| + | |
- | * 0EFh - výber registra 0 až 31
| + | |
- | * 0EEh - zápis hodnoty do zvoleného registra
| + | |
- | | + | |
- | ; napríklad
| + | |
- | mvi a,8 ; výber registra 8 - frekvencia tónu 0
| + | |
- | out 0EFh
| + | |
- | mvi a,0E3h ; zápis do registra 8 - tón A
| + | |
- | out 0EEh
| + | |
- | | + | |
- | Port 0ECh slúži pre povolenie prerušenia od časovača 0. Po zapnutí počítača alebo po resete je prerušenie od časovača 0 zakázané. Pred povolením prerušenia je potrebné ešte inicializovať samotný časovač. A samozrejme, musí byť pripravená rutina obsluhy prerušenia od adresy 0038h.
| + | |
- | | + | |
- | di ; zákaz prerušenia procesora
| + | |
- |
| + | |
- | xra a ; zákaz prerušenia od časovača 0
| + | |
- | out 0ECh
| + | |
- |
| + | |
- | mvi a,24h ; inicializuj časovač 0 v móde 2, iba vyšší byte deliaceho pomeru
| + | |
- | out 5Fh
| + | |
- | mvi a,0A0h ; 50x za sekundu
| + | |
- | out 5Ch
| + | |
- |
| + | |
- | mvi a,0C9h ; inicializuj vektor prerušenia
| + | |
- | sta 0038h ; - teraz iba návrat
| + | |
- |
| + | |
- | mvi a,1 ; povolenie prerušenia od časovača 0
| + | |
- | out 0ECh
| + | |
- |
| + | |
- | ei ; povoľ prerušenie procesora
| + | |
- | hlt ; počkaj si na prerušenie
| + | |
- |
| + | |
- | ...
| + | |
- | | + | |
- | === Detekcia MIF 85 ===
| + | |
- | | + | |
- | SAA1099P nemá možnosť čítať stav vnútorných registrov. MIF 85 priamu detekciu tiež neumožňuje, pretože v použitom GALe už na to nebol priestor. Keďže ale MIF 85 poskytuje možnosť používať prerušenie od časovača 0, je možné túto skutočnosť využiť na detekciu jeho pripojenia. Po zavolaní rutiny <code>MifDetect</code> bude v premennej <code>MifFlag</code> 1, ak je MIF 85 pripojený.
| + | |
- | | + | |
- | MifDetect: di ; zákaz prerušenia procesora
| + | |
- | xra a ; zákaz prerušenia od časovača 0
| + | |
- | out 0ECh
| + | |
- |
| + | |
- | sta MifFlag ; vynuluj flag
| + | |
- |
| + | |
- | mvi a,24h ; inicializuj časovač 0 v móde 2, iba vyšší byte
| + | |
- | out 5Fh
| + | |
- | mvi a,0A0h ; 2,048Mhz / 0A000h = 50Hz
| + | |
- | out 5Ch
| + | |
- |
| + | |
- | mvi a,0C3h ; inicializuj vektor prerušenia
| + | |
- | sta 0038h
| + | |
- | lxi h,MifDetectInt ; JMP MifDetectInt
| + | |
- | shld 0039h
| + | |
- |
| + | |
- | mvi a,1 ; povolenie prerušenia od časovača 0
| + | |
- | out 0ECh
| + | |
- |
| + | |
- | ei ; povolenie prerušenia procesora
| + | |
- |
| + | |
- | lxi b,1000h ; čakanie na prerušenie
| + | |
- | MifDetectL: dcx b
| + | |
- | mov a,b
| + | |
- | ora c
| + | |
- | jnz MifDetectL
| + | |
- | di ; zákaz prerušenia procesora
| + | |
- | ret
| + | |
- |
| + | |
- | MifDetectInt: pop psw ; zahoď návratovú adresu z prerušenia
| + | |
- | mvi a,1 ; MIF 85 je pripojený
| + | |
- | sta MifFlag ; nastav flag
| + | |
- | ret ; vráť sa bez povolenia prerušenia
| + | |
- |
| + | |
- | MifFlag: db 0
| + | |
- | | + | |
- | == Softvér využívajúci MIF 85 ==
| + | |
- | * [[download:120|demonštračné programy pre MIF 85 (PTP, P32)]]
| + | |
- | * [[Atomix]]
| + | |
- | * [[Magicland Dizzy]]
| + | |
- | | + | |
- | == Dokumentácia na stiahnutie ==
| + | |
- | * [[download:103|dokumentácia MIF 85 (schéma, DPS, osadzovací plán)]]
| + | |
- | * [[download:135|dokumentácia k verzii 3]]
| + | |
- | * [[download:79|datasheet SAA1099]]
| + | |
- | | + | |
- | == Editor hudby pre MIF 85 ==
| + | |
- | * [https://saa1099tracker.borik.net SAA1099Tracker]
| + | |
| | | |
| [[Kategória:Blog| 010]] | | [[Kategória:Blog| 010]] |