konwerter RS232 - Midi.pdf

(209 KB) Pobierz
Asynchroniczny konwerter RS232<->Midi - AVT-842
Asynchroniczny konwerter RS232<−>Midi
P R O J E K T Y
Asynchroniczny konwerter
RS232<−>Midi
AVT−842
W†artykule prezentujemy
uk³ad, ktÛry umoøliwia
wspÛ³pracÍ standardowych
interfejsÛw RS232 i MIDI.
Nie wszystkie zagadnienia, ktÛ-
re mog³yby byÊ proste, takimi
w³aúnie s¹. Tak ma siÍ sprawa
z†interfejsem MIDI i†interfejsem
szeregowym w†PC. Mimo øe oba
interfejsy s¹ szeregowe, to nie
moøna w†prosty sposÛb przekazy-
waÊ informacji z†jednego interfej-
su do drugiego. Nie chodzi tu
o†rÛønice parametrÛw elektrycz-
nych charakteryzuj¹cych oba stan-
dardy.
Podstawowy problem tkwi
w†szybkoúci transmisji, z†jak¹ MI-
DI przekazuje informacjÍ (31250
bodÛw). Jest ona niemoøliwa do
uzyskania w†standardzie RS232
PC-ta. Najbliøsze wartoúci to
28800 lub 38400 bodÛw.
PragnÍ w†niniejszym projekcie
przedstawiÊ dwukierunkowy kon-
werter szybkoúci transmisji szere-
gowej, umoøliwiaj¹cy pod³¹czenie
urz¹dzenia MIDI do PC-ta poprzez
port szeregowy.
syÊ proste, ale nie kaødy moøe
sobie na to pozwoliÊ - duøy
problem bÍd¹ mieli np. w³aúci-
ciele laptopÛw.
Wraz z†projektem publikowany
jest programowy driver, pracuj¹cy
pod Windows 3.xx i†Windows 95/
98, ktÛry przesy³a informacje MI-
DI z†portu i†do portu szeregowego
z†prÍdkoúci¹ 38400 bodÛw. Z†po-
wyøszego projektu wykorzystamy
tylko driver. FunkcjÍ konwertera
szybkoúci transmisji szeregowej
bÍd¹ pe³niÊ dwa mikroprocesory
jednouk³adowe 89C2051 wyposa-
øone w†nadajnik i†odbiornik do
transmisji szeregowej.
W†uk³adzie zamiast wymagane-
go (dla zapewnienia standardu
RS232) uk³adu MAX232 zastoso-
wa³em bramki CMOS 4011. To
rozwi¹zanie nie tylko upraszcza
uk³ad i†obniøa koszt, ale jest
dopuszczalne we wszystkich obec-
nie stosowanych komputerach.
Prawie wszystkie modele powyøej
AT akceptuj¹ na wejúciu RS232
sygna³y TTL. Ta w³aúciwoúÊ po-
zwala nam na dokonanie uprosz-
czenia.
Nie bÍdÍ w†niniejszym artyku-
le zamieszcza³ szczegÛ³Ûw doty-
cz¹cych MIDI, poniewaø juø by³y
publikowane w†EP, a†zaintereso-
wanym polecam obejrzenie inter-
netowej strony: http://godot.tu-
niv.szczecin.pl/~mjaskula/tomi/
music.html#midi .
Rys. 1. Sposób komunikowania się
procesorów w urządzeniu.
Oprogramowanie
W†Internecie na stronie http:/
/www.cistron.nl/~nctnico/
midi.htm opublikowano projekt
o†nazwie ìUltra cheap MIDI in-
terfaceî, w†ktÛrym, aby uzyskaÊ
poø¹dan¹ prÍdkoúÊ transmisji sze-
regowej, zaproponowano zmianÍ
czÍstotliwoúci pracy generatora
taktuj¹cego uk³ad portu szerego-
wego na dodatkowo zainstalowa-
nej karcie COM. Rozwi¹zanie do-
Elektronika Praktyczna 12/99
63
30569560.030.png
Asynchroniczny konwerter RS232<−>Midi
Konwersja szybkoúci transmisji
z†niøszej na wyøsz¹ nie przedsta-
wia problemu. Zupe³nie inaczej
jest, gdy chcemy przejúÊ z†wy-
øszej na niøsz¹, poniewaø pojawia
siÍ nadmiar danych. Aby nie
utraciÊ informacji, naleøy zastoso-
waÊ bufor. Informacje MIDI nie s¹
przesy³ane ci¹gle, ale raczej cyk-
licznie i dlatego nie jest wyma-
gane stosowanie bufora o†duøej
pojemnoúci. W†zupe³noúci wystar-
cza wewnÍtrzna pamiÍÊ mikropro-
cesora (ok. 100 bajtÛw).
TrochÍ inaczej moøe byÊ
w†przypadku transmisji tzw. ìSys-
tem Exclusiveî, kiedy to przesy-
³ane s¹ dane w†trybie ci¹g³ym.
Nie mogÍ zagwarantowaÊ, øe pod-
czas takiej transmisji z†komputera
do kaødego urz¹dzenia MIDI za-
stosowany bufor bÍdzie wystar-
czaj¹cy.
Komunikacja
mikroprocesorÛw
Port P1 mikroprocesorÛw jest
uøywany do dwukierunkowego
przesy³ania danych, zaú linie P3.2,
P3.3, P3.4, P3.5 stanowi¹ magis-
tralÍ steruj¹c¹ ( rys. 1 ). Komuni-
kacja miÍdzy procesorami odbywa
siÍ w trybie hand-shake. Mikro-
procesor, ktÛry odebra³ bajt z†por-
tu szeregowego, wpisuje go do
portu P1, a†nastÍpnie generuje
przerwanie w†drugim mikroproce-
sorze poprzez podanie stanu nis-
kiego na wejúciu INT0 (w M1) lub
INT1 (w M2). NastÍpnie oczekuje
potwierdzenia przez niski poziom
sygna³u na wyjúciach P3.4 (M2)
lub P3.5 (M1), øe bajt zosta³
odczytany.
Jedno z†przerwaÒ musi mieÊ
wyøszy priorytet, gdyø dwa pro-
cesory mog³yby zg³osiÊ ø¹danie
przerwania w†tym samym czasie.
Nast¹pi³oby wtedy nieskoÒczenie
d³ugie oczekiwanie kaødego z nich
na potwierdzenie otrzymania baj-
tu. Priorytet ma INT0 w†M1, ktÛre
jest wyzwalane ujemnym zboczem
sygna³u z wyjúcia P3.2 mikropro-
cesora M2.
Rys. 2. Schemat elektryczny konwertera.
Opis programu
Wys³anie bajtu przez M1 roz-
poczyna w†M2 obs³ugÍ procedu-
ry przerwania INT0, ktÛra wpi-
suje wartoúÊ otrzymanego bajtu
do bufora okrÍønego procedur¹
put ( list. 1 ). NastÍpnie, jeøeli nie
jest ustawiony bit busy , wywo-
64
Elektronika Praktyczna 12/99
30569560.031.png 30569560.032.png 30569560.033.png 30569560.001.png 30569560.002.png 30569560.003.png 30569560.004.png 30569560.005.png 30569560.006.png 30569560.007.png 30569560.008.png 30569560.009.png 30569560.010.png 30569560.011.png 30569560.012.png 30569560.013.png 30569560.014.png 30569560.015.png 30569560.016.png 30569560.017.png 30569560.018.png
Asynchroniczny konwerter RS232<−>Midi
Rys. 3. Rozmieszczenie elementów
na płytce drukowanej.
³ywana jest procedura send , ktÛ-
ra inicjuje wysy³anie bajtu z†bu-
fora okrÍønego do portu szere-
gowego MIDI. Bufor okrÍøny zre-
alizowany jest w†obszarze pa-
miÍci okreúlonym przez sta³e
wskp , wske . Zmienna pocz jest
wskaünikiem okreúlaj¹cym adres,
pod ktÛry zostanie wpisany na-
stÍpny otrzymany bajt z†M1.
Zmienna kon wskazuje bajt, ktÛ-
ry jako pierwszy ma byÊ wys³a-
ny przez port szeregowy M2.
Bufor jest pusty, gdy oba wskaü-
niki s¹ sobie rÛwne.
Procedura put wpisuje kolejny
bajt do bufora oraz zwiÍksza
wartoúÊ zmiennej pocz . Jeøeli war-
toúÊ wskaünika pocz ìdogoniî
wartoúÊ kon , to jest ustawiany bit
full , ktÛry oznacza zape³nienie
bufora. PrÛba kolejnego wpisania
bajtu do bufora jest sygnalizowa-
na úwieceniem siÍ diody ìER-
RORî. Jest to informacja, øe na-
st¹pi³o przepe³nienie bufora i†utra-
ta danych. Skasowanie úwiecenia
diody nastÍpuje po wyzerowaniu
mikroprocesora.
Procedura send najpierw
sprawdza, czy nie jest ustawiony
bit emp . Jeøeli nie, to z†bufora
jest pobierany bajt wskazany przez
kon i†wpisywany do rejestru SBUF
portu szeregowego inicjuj¹c trans-
misjÍ MIDI. NastÍpnie zwiÍkszana
jest wartoúÊ wskaünika kon i†usta-
wiany bit busy , informuj¹cy
o†transmisji szeregowej w†toku. Je-
øeli bufor jest pusty, to ustawiany
jest bit emp .
Kiedy ca³y bajt zostanie wys³a-
ny, mikroprocesor wywo³uje pro-
cedurÍ przerwania portu szerego-
wego z†ustawionym bitem ti . Pro-
cedura ta w†przypadku gdy bufor
List. 1.
;RS232-MIDI-M1-strona RS
$MOD51
;Podlaczenia
;M1 M2
;p1.0 p1.0
;p1.1 p1.1
;p1.2 p1.2
;p1.3 p1.3
;p1.4 p1.4
;p1.5 p1.5
;p1.6 p1.6
;p3.2 p3.2
;p3.3 p3.3
;p3.4 p3.4
;p3.5 p3.5
;M1 p3.0 RS232 IN
;M1 p3.1 RS232 OUT
;M2 p3.0 MIDI IN
;M2 p3.1 MIDI OUT
;M2 p3.7 LED ERROR
;adresy zmiennych w M2
pocz EQU 021h ;wskaznik poczatka bufora
kon EQU 022h ;wskaznik konca bufora
wskp EQU 023h ;adres poczatka bufora
wske EQU 080h ;adres konca bufora+1
;20h - bajt pomocniczy adresowany bitowo
full
nop
sjmp loop
;************Bufor okrezny***********************************
;kon-adres nast.bajtu do wyslania
;pocz-tutaj wpisz otrzymany bajt
put:
;wpisuje bajt do bufora
jnb full,pu0
clr p3.7
;ERROR LED
ret
pu0: mov r0,pocz
mov @r0,a
;wpisz do bufora
mov a,pocz
inc a
cjne a,#wske,pu1
mov a,#wskp
pu1: cjne a,kon,pu2
setb full
;bufor pelny
ret
pu2: mov pocz,a
;uaktualnij pocz
clr emp
;bufor nie pusty
ret
send:
;wysyla bajt do MIDI
jnb emp,se1
;zakoncz-bufor pusty
ret
se1: mov r0,kon
mov SBUF,@r0 ;wyslij bajt
setb busy
EQU 000h ;bufor pelny
emp
EQU 001h ;bufor pusty
;wysylanie w toku
busy
EQU 002h ;RS w toku
clr full
mov a,kon
inc a
cjne a,#wske,se2
mov a,#wskp
se2: mov kon,a
cjne a,pocz,se3
setb emp
;************************ poczatek programu ***********************
program:
org 000h
;RESET
jmp inic
org 003h
;INT0
;bufor pusty
jmp inte
org 023h
se3: ret
sint:
;MIDI
jmp sint
;reset procedure
inic: ;inicjalizacja
;konfiguracja MIDI
mov scon,#01010000b ;set-RS 1st mode, RXD activation
mov tmod,#00100010b ;t1->M1,M0=10-tryb2, t0-M1,M0=01>tryb2
;gate1,C/T1,M1,M0,gate0,C/T0,M1,M0
mov pcon,#10000000b ;transmision rate smod=1
mov th1,#254 ;f=(fosc*2^smod)/(384*(256-th1)) ==31250
;fosc=12MHz
;przerwanie MIDI
jb ri,sin1
;bajt wyslano do MIDI
clr ti
;clear int poiter
jb emp,sine
acall send
;wyslij nast.bajt z bufora
reti
sine: clr busy
;wyslano wszystkie bajty
reti
sin1: ;bajt otrzymano z MIDI
jnb p3.4,sin1 ;czekaj az wysle poprzedni
mov p1,SBUF
clr ri
clr p3.3 ;int1 in M1
sin2: jb p3.4,sin2 ;potwierdzenie otrzymania bajtu
setb p3.3
mov tl1,th1
mov tcon,#01000000b ;T1-on tf1,tr1,tf0,tr0,ie1,it1,ie0,it0
mov IP,#00000000b;priorytet —PT2,PS,PT1,PX1,PT0,PX0
mov IE,#10010001b;maska EA,EAD,ET2,ES,ET1,EX1,ET0,EX0
clr busy
setb emp
clr full
mov pocz,#wskp
mov kon,#wskp
loop:
nop
;bajt wyslano do M1
reti
inte:
;przerwanie INT0
mov p1,#255
mov a,p1
clr p3.5
acall put
jb busy,inte1
acall send
inte1: setb p3.5
reti
;petla glowna
nop
nop
nop
end
Elektronika Praktyczna 12/99
65
30569560.019.png 30569560.020.png 30569560.021.png 30569560.022.png 30569560.023.png 30569560.024.png 30569560.025.png 30569560.026.png 30569560.027.png
Asynchroniczny konwerter RS232<−>Midi
List. 2.
;RS232-MIDI-M1-strona RS
$MOD51
;Podlaczenia
;M1 M2
;p1.0 p1.0
;p1.1 p1.1
;p1.2 p1.2
;p1.3 p1.3
;p1.4 p1.4
;p1.5 p1.5
;p1.6 p1.6
;p3.2 p3.2
;p3.3 p3.3
;p3.4 p3.4
;p3.5 p3.5
;M1 p3.0 RS232 IN
;M1 p3.1 RS232 OUT
;***************** poczatek programu ***********************
program:
org 000h
loop: nop
;petla glowna
nop
nop
nop
nop
nop
nop
nop
nop
nop
inc r1
cjne r1,#00,loop1
setb p3.7
loop1: sjmp loop
sint:
jb ri,sin1
;bajt wyslano do RS
clr ti
;clear int poiter
setb p3.4
reti
sin1: ;bajt otrzymano z RS
jnb p3.5,sin1 ;czekaj az wysle poprzedni bajt
movc B,SBUF
clr ri
mov p1,B
clr p3.7
;RESET
jmp inic
org 013h
;INT1
jmp inte
org 023h
;MIDI
jmp sint
;reset procedure
inic: ;inicjalizacja
;konfiguracja MIDI
mov scon,#01010000b ;set-RS 1st mode, RXD activation
mov tmod,#00100010b ;t1->M1,M0=10-tryb2, t0-M1,M0=01>tryb2
;gate1,C/T1,M1,M0,gate0,C/T0,M1,M0
mov pcon,#10000000b ;transmision rate smod=1
mov th1,#254 ;f=(fosc*2^smod)/(384*(256-th1)) ==38400
;fosc=14.7456MHz
;LED control
mov r1,#01
clr p3.2 ;int0 in M2
sin2: jb p3.5,sin2 ;potwierdzenie otrzymania bajtu
setb p3.2
;bajt wyslano do M2
mov B,#255
mov p1,B
reti
inte:
mov p1,#255
mov SBUF,p1
clr p3.4
mov tl1,th1
mov tcon,#01000100b
;odebrano bajt
;T1-on tf1,tr1,tf0,tr0,ie1,it1,ie0,it0
mov p1,B
reti
mov IP,#00000100b
;priorytet —PT2,PS,PT1,PX1,PT0,PX0
mov IE,#10010100b
;maska EA,EAD,ET2,ES,ET1,EX1,ET0,EX0
mov r1,#00
end
jest pusty zeruje bit busy , a†w†in-
nym przypadku inicjuje wysy³anie
kolejnego bajtu wywo³uj¹c proce-
durÍ send .
Pojawienie siÍ bajtu danych
w†M1 jest sygnalizowane úwiece-
niem diody sterowanej z wyjúcia
P3.7. Dioda úwieci przez oko³o
3ms, a†czas podtrzymania nalicza-
ny jest w†pÍtli g³Ûwnej programu.
CzÍstotliwoúÊ transmisji da-
nych portu szeregowego mikro-
procesora zaleøy od czÍstotliwoúci
pracy jego oscylatora. W†obu mik-
roprocesorach port szeregowy pra-
cuje w†trybie drugim (rejestr
tmod ), a†czÍstotliwoúÊ w†tym try-
bie moøemy obliczyÊ ze wzoru:
f tr = (f osc *2 smod )/(384*(256-t h1 ))
gdzie:
f tr - szybkoúÊ transmisji [bodÛw/s]
f osc - czÍstotliwoúÊ kwarcu
smod - bit w†rejestrze pcon
t h1 - bardziej znacz¹cy bajt zegara
T1
W†mikroprocesorze M1 przyj¹-
³em f osc =14,756MHz i†t h1 =254, zaú
w†M2 f osc =12MHz i†t h1 =254.
ìDodaj nowy sprzÍtî, a†nastÍpnie
rÍcznie (opcja Nie ) wybieramy
Kontrolery video, düwiÍku i†gier
i† Z†dysku instalujemy driver. Pro-
gram instaluj¹cy zapyta jeszcze
o†port COM. W†Windows 3.xx
w†Panelu Sterowania wybieramy
ikonÍ Drivers . Naciskamy na przy-
cisk Add i†wybieramy sterowniki
nie bÍd¹ce na liúcie. Wpisujemy
úcieøkÍ dostÍpu, sk¹d program
instaluje driver. Wszelkich pÛü-
niejszych zmian moøemy dokonaÊ
w†programie system.ini w†sekcji
[cbxt3.drv], ktÛra po zainstalowa-
niu domyúlnie przyjmuje nastÍpu-
j¹ce wartoúci:
SysExWait=40
comport=1
Buffersize=10240
MIDIINPersistence=50
SysExWait - czas w†[ms] ocze-
kiwania systemu na odebranie
ca³ej paczki danych SystemExclu-
sive , po ktÛrym nast¹pi przes³anie
otrzymanych informacji do pro-
gramu MIDI.
comport - numer portu COM.
Buffersize - rozmiar bufora da-
nych potrzebnego do przesy³ania
paczek danych SystemExclusive .
Moøe przyjmowaÊ wartoúci od 1
do 65535.
MIDIINPersistence - okreúla
liczbÍ bajtÛw, ktÛre driver odczy-
ta zanim odda kontrolÍ Systemo-
wi Windows. WartoúÊ ta nie do-
tyczy przesy³ania paczek danych
SystemExclusive .
W†kaødym programie muzycz-
nym, przy wyborze Urz¹dzenia
MIDI, driver ten pojawi siÍ jako:
ìYamaha CBX-T3 1.3î, oczywiúcie
wtedy, gdy wystÍpuje zadeklaro-
wany port COM w†komputerze
i†jest nie wykorzystywany w†da-
nej chwili przez inne urz¹dzenie.
Aby uruchomiÊ sterownik po-
trzebny bÍdzie instrument MIDI,
ktÛry jest w†stanie generowaÊ
i†czytaÊ komunikaty MIDI. Zmon-
towany uk³ad nie wymaga øad-
nych regulacji, wiÍc jeøeli nie
pope³niliúmy b³Ídu, powinien od
razu dzia³aÊ poprawnie. Podajemy
mu zasilanie i†pod³¹czamy miÍ-
dzy instrument a†port szeregowy.
W†komputerze uruchamiamy pro-
gram muzyczny i†ustawiamy zain-
stalowany sterownik w† MIDI Se-
tup jako wejúciowy i†wyjúciowy.
WiÍkszoúÊ programÛw muzycz-
nych (Cubase, CakeWalk) ma kon-
trolki sygnalizuj¹ce otrzymywanie
i†wysy³anie komunikatÛw MIDI.
Poczas naciskania na klawiaturÍ
instrumentu, w czasie w³aúciwej
pracy sterownika kontrolka po-
winna siÍ zaúwieciÊ. NastÍpnie
sprawdzamy, czy pod³¹czony in-
strument reaguje na rozkazy wy-
sy³ane z†programu muzycznego.
PamiÍtajmy o†ustawieniu takiego
samego kana³u MIDI.
Uruchamianie
Montaø elektryczny nie wyma-
ga szczegÛ³owego omÛwienia.
Schemat montaøowy znajduje siÍ
na rys. 3 .
Najpierw naleøy zainstalowaÊ
driver w†PC-cie. W†Windows 95
w†Panelu Sterowania wybieramy
66
Elektronika Praktyczna 12/99
30569560.028.png
Asynchroniczny konwerter RS232<−>Midi
Jeøeli nie nastÍpuje transmis-
ja, to w†lokalizacji b³Ídu pomog¹
nam diody sterownika. Migaj¹ca
dioda D4 informuje, øe M1 po-
prawnie odczytuje informacje
z†komputera. Dioda D2 zapala
siÍ, kiedy przekazywane s¹ ko-
munikaty MIDI z†do³¹czonego in-
strumentu, ale miganie nie gwa-
rantuje poprawnoúci odczytu in-
formacji przez M2. Kiedy bÍd¹
problemy w†przesy³aniu informa-
cji w†tym kierunku, to proponujÍ
zmieniÊ program w†mikroproce-
sorze M2 tak, aby bit portu P3.7
ustawiany by³ jak w†M1. Wtedy
zapalaj¹ca siÍ dioda upewni nas,
øe mikroprocesor poprawnie od-
czytuje informacje z†instrumentu.
Nie musimy mieÊ oscyloskopu,
aby stwierdziÊ, czy nastÍpuje
transmisja - wystarczy zwyk³y
miernik, najlepiej cyfrowy ze
wzglÍdu na wysok¹ impedancje
wejúciow¹. NapiÍcie przy
wystÍpuj¹cej transmisji nieznacz-
nie rÛøni siÍ od napiÍcia w†sta-
nie statycznym. W†ten sposÛb
moøemy okreúliÊ przyczynÍ b³Íd-
nej pracy sterownika sprawdzaj¹c
kolejno miejsca w torze transmis-
ji sygna³u. Mierz¹c napiÍcie na
nÛøkach XTAL2 mikroprocesorÛw
moøemy takøe sprawdziÊ popra-
wnoúÊ dzia³ania oscylatorÛw. Na-
piÍcie to nie powinno byÊ bliskie
zasilania lub zera. Kiedy nastÍ-
puj¹ przek³amania w†informacjach
dochodz¹cych z†instrumentu do
komputera - co moøe siÍ obja-
wiaÊ przez np. odczytywanie nie
tych düwiÍkÛw przy-
porz¹dkowanych klawiszom, ktÛ-
re naciskamy na klawiaturze in-
strumentu - moøna prÛbowaÊ do-
braÊ inn¹ wartoúÊ rezystora R8 (z
zakresu 470
WYKAZ ELEMENTÓW
Rezystory
R1: 6,8k
R3, R4, R5: 470
R6, R7, R9: 220
R10, R11: 5,6k
F/25V
C2, C3, C4: 470nF
C5, C8: 10
F/10V
C6, C7, C9, C10: 33pF
Półprzewodniki
M1, M2: AT89C2051
zaprogramowane
U1: 4011
U2: 7805
D1: dioda Zenera 5,1V/100mW
D2, D3, D4: diody LED
D5: BAVP17 (1N4148)
Q1: CNY17
M1: mostek 1A/50V
Różne
L1: TS2/6
RS232: gniazdo do druku DB9M
X1: 14,7456MHz
X2: 12MHz
), podci¹gaj¹-
cego napiÍcie na transoptorze.
WartoúÊ, ktÛra jest dobrana
(820
) zapewnia poprawn¹ trans-
misjÍ dla wiÍkszoúci transopto-
rÛw typu CNY17. Transoptor ten
pracuje na granicy swojego pas-
ma i†najlepszy by³by transoptor
PC900 firmy Sharp, ktÛry jest
stosowany w†wiÍkszoúci profesjo-
nalnych urz¹dzeÒ MIDI.
Uk³ad zmontowa³em na dwÛch
p³ytkach, osobno niestabilizowa-
ny, popularny zasilacz sieciowy
z†wyjúciem 9..12[V] DC i†osobno
stabilizator z†reszt¹ uk³adu.
Piotr SwadŸba
pswadzba@friko6.onet.pl
Elektronika Praktyczna 12/99
67
R2: 82k
R8: 820
Kondensatory
C1: 470
..2k
30569560.029.png
Zgłoś jeśli naruszono regulamin