START _______________
Atari 8-bit
GAL-MMU
SIO2PC
Atari static RAM
Atari R-Flex
Atari Turbofreezer III
ARC by Pasiu/SSG
Atari Cartridge
Emulator USB Joy
SIDari
YAMari
SONari
SAMari
TIGari
I/O Dekoder
CART+ECI expander
Atari Multicart XE
Atari Full S-RAM
Atari 16-bit
ACSI-SCSI interface
Video digitizer faST
MegaSTe SCSI internal interface
ST RAMcart
Peter Putnik's ACSI-CF Interface
Narzędzia
GALprog
Przetwornica StepUp
Przelotki układów DIP
Laminator do PCB
Wiertarka do PCB
Wytrawiarka PCB
Monitor LCD Multi
Programator ALL-07
C64
BlackBOX 8.1
Inne projekty
CS9236 Moduł MIDI
Literatura
Hardware
Software
Varia
Nalewka wiśniowa
|
TIGari
Kolejny układ generowania dźwięku w Atari. Tym razem wziąłem się za wiekowy Texas Instruments Generator - SN76489AN
, który został zastosowany między innymi w komputerach TI99/4, Sord M5, ColecoAdam, BBC Micro, a także w wielu wczesnych konsolach do gier. Jest to prosty układ generujący dźwięki w trzech kanałach z jednym
generatorem szumu. Odpowiednie zaprojektowanie logiki umożliwiło bezproblemowe dołączenie go do Atari mimo, że sterowanie jest totalnie niekompatybilne z rodziną
65xx. Sam projekt nie jest zbyt skomplikowany, jednakże dopiero zastosowanie CPLD Xilinx całą historię uczyniło przejrzystą i upakowaną. Polecam ten projekt wszystkim
zainteresowanym budową nowych rozszerzeń dla Atari.
Poniżej prezentuję schemat układu. Oryginalnie w każdym z komputerów/konsol
był zastosowany pojedynczy układ scalony. Ja w swoim projekcie zastosowałem dwa choćby po to, aby wzbogacić możliwości dźwiękowe o trzy kanały i "stereo". Dobrze jest przeważnie mieć więcej niż mniej :) Schemat logiki sterującej zawarty w CPLD Xilinx XC9572XL Krótki opis projektu wraz z przydatnymi plikami:
Układ zmontowałem na zamówionej w JLCPCB płytce (ze względu na raster cpld), której rozmiary zostały dopasowane do standardowej obudowy Z-7. Wiem, że to jest
słabe rozwiązanie, mimo to posiada zaletę - jest sporo miejsca na umieszczenie części. Potencjometry montażowe zastosowałem tylko w układzie prototypowym. Normalnie
należy wlutować zworki aby je pominąć. Będą przeszkadzać w zamknięciu obudowy chyba, że się je przygnie do PCB. Przycisk tact-switch służy do wyciszenia modułu w
sytuacji gdy system "zawiśnie" i nie będzie możliwości programowego wyłączenia wyjść audio układów. Plik schematu format Eagle
Pliki projektu Xilinx webISE Firmware CPLD
Pliki PCB format GERBER/EXCELLON
Jak widać na schemacie logiki sterującej - mamy wewnątrz CPLD opisane części składające się na to, aby całość działała zgodnie z wymaganiami TI zawartymi w
datasheet SN76489AN oraz z hardware Atari. Datasheet SN76489AN
Do sterowania wykorzystałem w dosyć naturalny sposób linie adresowe uzyskując w ten sposób poniższą mapę adresową:BASE
- adres modułu ustawiany DIPswitchem (jeden z 8 obszarów na stronie $D5) (w) - zapis, (r) - odczyt BASE+1 (w) - adres układu 1 - kanał lewy BASE+2 (w) - adres układu 2 - kanał prawy
BASE+3 (w) - adresowanie obydwu układów jednocześnie (!) BASE+4 (r) - odczyt danej identyfikacyjnej - 212 dec - litera T w negatywie BASE+8 (w) - odblokowanie wyjścia audio układu 1
BASE+16 (w) - odblokowanie wyjścia audio układu 2 BASE +24 (w) - odblokowanie wyjść audio obydwu układów (!)
Mimo, że wszystkie informacje są zawarte w datasheet oraz w sieci Internet, podam kilka wskazówek rozjaśniających kwestie programowe.
Po pierwsze - układ SN76489 nie posiada jakichkolwiek układów inicjalizacji sprzętowej po włączeniu zasilania, więc gdy się go uruchomi - natychmiast zaczyna
generować w sposób przypadkowy dźwięk. Zbudowałem więc w oparciu o klucze analogowe 74HCT4066 układ kontroli wyjść dźwięku tak, aby po włączeniu zasilania
wyjście audio było zablokowane. Prawidłowa sekwencja inicjalizacji programowej powinna obecnie wyglądać następująco (użyję PEEK,POKE) PEEK BASE+4:REM Jeżeli wartość = 212 - TIGari jest obecny w systemie
POKE BASE+3,159:REM głośność kanału 1=0 dla obydwu układów POKE BASE+3,191:REM głośność kanału 2=0 dla obydwu układów POKE BASE+3,223:REM głośność kanału 3=0 dla obydwu kanałów
POKE BASE+3,255:REM głośność szumu s=0 dla obydwu kanałów POKE BASE+24,0:REM odblokowanie wyjść audio obydwu kanałów
Poniżej zamieszczam przykładowe programy w BASIC testujące zachowanie się układów. Test 1 - przejście przez pełną skalę dźwięku obu układów - niezłe stereo.
Test 2 produkuje muzyczkę "SELF TEST" Atari na kanałach układu 1, układu 2, obydwu układów (stereo) oraz test szumu. Programiki napisane "w locie" więc z pewnością mają
wiele wad i niedociągnięć. Mimo to - powinny działać i spełniać swoje zadanie. Test 1
Test 2
Model programowy jest prosty, ale mimo tego wyjaśnię co i jak:
Programowanie wysokości tonu polega na wysłaniu dwóch bajtów. Wysokość tonu jest określana przy pomocy 10-bitowego słowa.
bajt1 7 6 5 4 3 2 1 0 bajt2 7 6 5 4 3 2 1 0
F F F F F F F F F F
1 R R R 3 2 1 0 0 0 9 8 7 6 5 4R R R 0 0 0 - kanał 1 0 1 0 - kanał 2 1 0 0 - kanał 3
Jak widać powyżej - najstarszy bit bajtu pierwszego jest zawsze ustawiony na 1. Kolejne 3 bity określają numer wybranego rejestru (kanału). bity od 0 do 3 stanowią
najmłodsze bity 10-bitowego słowa wysokości tonu. Bajt 2 wysyłany po pierwszym ma bit 7 i 6 ustawiony zawsze na 0. Bity od 0 do 5 stanowią starszą część 10-bitowego słowa sterującego wysokością (9,8,7,6,5,4).
10-bitową wartość, którą wpisujemy w powyższy sposób oblicza się nastepująco:n=(N/f)*0,03125 Gdzie n - wartość 10bit, N - częstotliwość zegara w Hz (tu 3546894Hz), f - żądana
częstotliwość (wysokość) tonu. Kolejne dźwięki muzyczki "SELF TEST" Atari są nastepujące:
G1 - 391,9Hz - wartość 283 bajt1=11, bajt2=17 F1 - 349,6Hz - wartość 317 bajt1=13, bajt2=19 B1 - 466,2Hz - wartość 238 bajt1=14, bajt2=14
C2 - 523,3Hz - wartość 212 bajt1=4, bajt2=13 F2 - 698,5Hz - wartość 159 bajt1=15, bajt2=9 D2 - 587,3Hz - wartość 189 bajt1=13, bajt2=11 Aby wysłać bajt1 do kanału 1 należy dodać do wartości bajt1 liczbę 128 dec. Jeżeli ma
to być kanał 2, wtedy do bajt1 należy dodać liczbę 160, natomiast dla kanału 3 wartość dodawana do bajt1 jest równa 192. Oczywiście należy także zadbać o właściwe czasy
trwania dźwięku (długości nut), ale to już należy do innej klasy zagadnień.Programowanie głośności kanału polega na wysłaniu jednego bajtu: bajt1 7 6 5 4 3 2 1 0 1 R R R 3 2 1 0R R R 0 0 1 - głośność kanału 1 0 1 1 - głośność kanału 2 1 0 1 - głośność kanału 3
1 1 1 - głośność szumu Bit 1 zawsze ustawiony na 1, kolejne 3 wyznaczają numer kanału, a bity od 0 do 3
określają głośność w taki sposób, że wartość 0000 ustawia głośność największą, a wartość 1111 wyłącza wyjście audio wybranego kanału.
bajt1 7 6 5 4 3 2 1 0 1 R R R 3 2 1 0R R R 1 1 0 - kontrola szumu
bit 2 - określa rodzaj szumu. 0 - okresowy, 1 - biały bity 1 i 0 - określają częstotliwość jak jest generowany szum (wysokość "tonu")
0 0 - N/512 0 1 - N/1024 1 0 - N/2048
1 1 - wyjście generatora 3 To wszystko. Jest to bardzo prosty generator, gdzie obwiednię zawsze trzeba robić
programowo o ile jest to niezbędne. Jeden kształt fali na wyjściu nie oferuje wielkich doznań :). Można spróbować sterowania wyłącznie bitami głośności, co powinno dać
możliwość odtwarzania 4-bitowych sampli. Mimo prostoty - układy SN76489 generują programowalne dźwięki, a to jest główny powód, dla którego powstał TIGari. Nie jest to również ostatnie słowo w kategorii
rozszerzenia dźwiękowe Atari 8-bit. Ze względów ogólnych nie udostępniam projektu PCB, jedynie pliki Gerber/Excellon.
Na podstawie opublikowanego schematu można wykonać PCB według własnego pomysłu, dopasowania do innej obudowy, zmiany położenia elementów, itd. Zaznaczam,
że układ XC9572XL-VQ64 posiada raster wyprowadzeń 0,5mm i w związku z tym lepiej zlecić wykonanie płytek specjalistycznej firmie produkującej PCB. Ja osobiście zlecam
w JLCPCB - ponieważ mają duże możliwości, produkują szybko i naprawdę dobrze.
NIE JEST TO KRYPTOREKLAMA. Bardzo proszę o uszanowanie mojego autorstwa i nieużywanie projektu w celach
komercyjnych bez zgody. Pomysł udostępniam za darmo dla każdego, kto zechce go użyć. Jednocześnie nie mam nic przeciwko udoskonaleniom i przeróbkom pod warunkiem wskazania źródła pochodzenia oryginału.
Polecam |