Post on 23-Apr-2020
IESCUELA POLITÉCNICA NACIONAL
FACULTAD DE INGENIERÍA ELÉCTRICA
TESIS DE GRADO
'DISEÑO Y CONSTRUCCIÓN DE UN SISTEMA DEMODULACIÓN Y DEMODULACIÓN DIGITAL"
LISTADO DE PROGRAMAS
Ií PREVIA A LA OBTENCIÓN DEL TÍTULO DE INGENIERO EN
ELECTRÓNICA Y TELECOMUNICACIONES
WILSON GERARDO SALCEDO VALLEJORODRIGO MIGUEL VERA GONZÁLEZ
I
1999
PROGRAMA DE VISUAL BASIC
*************** ESCUELA POLITÉCNICA NACIONAL
*************** FACULTAD DE INGENIERÍA ELÉCTRICA
*************** SISTEMA MODSIS A A A A A A A A A A A A*A A*
*************** PROGRAMA DE VISUAL BASIC AAAAAAA*********
Realizado por:GERARDO SALCEDO VALLEJORODRIGO VERA GONZÁLEZ
Quito, Ecuador 1999.
*************cr)of,/!i // dCP/n DDiMriDüi nf=i oonoDáM/i********************^^^FORMULARIO PRINCIPAL DEL PROGRAMA
Prívate Sub FormJ-oadOOptíon1_ClíckText1.Text= port
End Sub
Prívate Sub lmage1_CI¡ck()Form4.ShowEnd Sub
Prívate Sub lmage2_Click()Cali salirEnd Sub
Prívate Sub Image3__CI¡ckOform2.Show
End Sub
Prívate Sub Image4_CI¡ckOCali AYUDAEnd Sub
Prívate Sub Image5_CIickOCali cerrar_puertoEnd Sub
Prívate Sub modular_Click()Cali MODULACIÓNEnd Sub
PROGRAMA DE VISUAL BASIC
Dím datal As VariantDim largo As VariantDim m As VariantDim X As StringDim Y As VariantDim z As VariantDim coding As VariantDim coding2 As VariantDim numberAs String
Prívate Sub FormJ_oad()data = Form1.datos.Textlargo = Len(data)d = OForm = 1 To largodatal = Mid$(data, m, 1)X=Hex(Asc(data1))Y=Mid$(X, 1, 1)z = M¡d$(X,2, 1)
Select Case YCase "O"coding = "0000"Case "1"coding = "1000"Case "2"coding = "0100"Case "3"coding = "1100"Case "4"coding = "0010"Case "5"coding = "1010"Case "6"coding = "0110"Case "7"coding = "1110"Case "8"coding = "0001"Case "9"coding = "1001"Case "A"coding = "0101"Case "B"coding = "1101"Case "C"coding = "0011"Case "D"coding = "1011"
Subrutína Ver Código Binario
PROGRAMA DE VISUAL BASIC
Case "E"coding = "01H"Case "F"cod¡ng = "1111"End Select
Select Case zCase "O"cod¡ng2 = "0000"Case"!"codíng2 = "1000"Case "2"cod¡ng2 = "0100"Case "3"coding2 = "1100"Case "4"coding2 = "0010"Case "5"coding2 = "1010"Case "6"coding2 = "0110"Case "7"coding2 = "1110l)
Case "8"cod¡ng2 = 'T0001"Case "9"coding2 = "1001"Case "A"coding2 =Case "B"coding2 =Case "C"coding2 = "Case "D"cod¡ng2 = "1Case "E"cod¡ng2 =Case "F"coding2 = "1111"End Select
u = (m-1) Mod3
Select Case u
Case Is = Od = d + 1number= d
Select Case dCase Is <= 9Textl Text = Textl .Text + "trama " + number+ ": " + "0" + coding2 + coding + "1Case Is > 9Textl Text = Textl Text + "trama " + number + ": " + "O" + cod¡ng2 + coding + "1" +End SelectCase ElseTextl Text = Textl Text + "O" + codfng2 + coding + "1" + " "End Select
Next
End Sub
PROGRAMA DE VISUAL BASIC
Subrutína Ayuda
Dim i As VariantDim alfa As VariantDim k As VariantDim I As VariantDim r As VariantDim data As StringDim longitud As VariantDim código As String
SubAYUDAQ
1 Establecer el nombre de! archivo de AyudaCommonDialogl .HelpFile = "c:\modulacion\help\mod\mod.hlp"CommonDialogl .HelpCommand = cdlHelpContents' Presentar el tema de contenido de la Ayuda de Visual Basic.CommonDialogl .ShowHelp
End Sub
Subrutína Salir
Sub salirQ
Dim Mensaje, Estilo, Título, Respuesta, MiCadenaMensaje = "¿Desea Abandonar modulación Digital?" ' Define el mensaje.Estilo = vbYesNo + vbCritical + vbDefaultButton2 ' Define los botones.Título = "Modulación Digital" ' Define el título.Respuesta = MsgBox(Mensaje, Estilo)
If Respuesta = vbYes Then ' El usuario eligió el botón Sí.Forml.HideEnd
4
PROGRAMA DE VISUAL BASIC
Else ' El usuario eligió el botón No.MÍCadena = "No"' Ejecuta una acción.
Endlf
End Sub
***************subrutinas que se desecadenan con eventos Cllck del mouse***************
Prívate Sub acercade_CIÍck()Form4.ShowEnd Sub
Prívate Sub ayuda2_Click()Cali AYUDA
End Sub
Prívate Sub borrar_Click()Text2.Text =""End Sub
Prívate Sub cerrarjClickOCali cerrar_puertoEnd Sub
Prívate Sub Command1_ClickOCali MODULACIÓNEnd Sub
Prívate Sub Command2_ClickOCali salir
End Sub
Prívate Sub Command3_ClickOCali demod
End Sub
Prívate Sub Command4_ClickOCali cerrar_puertoEnd Sub
Prívate Sub Command5_ClickOdatos.Text=""End Sub
PROGRAMA DE VISUAL BASIC
Prívate Sub Command6_ClickOFormS.ShowEnd Sub
Prívate Sub Demodu!ar_ClickOCali demodEnd Sub
Prívate Sub select_ClickOFormS.ShowEnd Sub
Prívate Sub verjnforrnacion_CI¡ckOform2.ShowEnd Sub
Prívate Sub Command1_ClickOFormS.HideFormS.ShowEnd Sub
Prívate Sub FormJ_oad()
End Sub
Prívate Sub Command1_C[¡ckOForm4.H¡deEnd Sub
Prívate Sub Command1_ClickOFormS.HideForml.Show
End Sub
I A A-** A * A A A** A A A * * A * J, * O . ,h,rt l+ín^ n^if-n^irV; i/a,- íAr\* tSubrutína Demodulación
Sub demodOCali cerrar_puertodata = código
MSComml .PortOpen = Trueotro:
PROGRAMA DE VISUAL BASIC
MSComml .Outpuí = data
DoDoEvents
Loop Until MSComml.InBufferCount>= 11 Leerlos datos de respuesta de aceptación en el1 puerto serie.Instring = MSComml.Inputdatos.Text = datos.Text + Instring' Cerrar el puerto serie.GoTo otro
End Sub
Subrutína Modulación
Sub MODULACIONQDim instring As String
Cali cerrar_puertolongitud = Len(datos.Text)
I = longitud/3r= longitud Mod 3
Select Case r
Case Is = O
Case Is = 1
datos.Text = datos.Text+" "
Case Is = 2
datos.Text = datos.Text + ""
End SelectMSComml.PortOpen = True
Fori = 1 To longitud Step 3
data = código + Mid$(datos.Text, i, 3)MSComml .Output = data
DoDoEvents
Loop Until MSComml.!nBufTerCount>= 11 Leer los datos de respuesta de aceptación en el
7
PROGRAMA DE VISUAL BASIC
1 puerto serie.'Instring = MSComml.lnputText2.Text = Text2.Text+ ínstring
' Cerrar el puerto serie.Select Case códigoCase Is = OW= 300000Case ElseW= 200000End SelectFort=1 ToWNextNext
End Sub
t*********Subrutina Actualización de gráficos y de variables de información ASK '
Prívate Sub Option1_ClickOmodem = "ASK"código = "1"Picturel Picture = LoadP¡cture("c:\modulacion\graphics\tablaask.bmp")PictureSPicture = LoadP¡cture("c:\modulac¡on\graphics\bmask.bmp")Picture2.Picture = LoadPicture("c:\modulac¡on\graphics\bIanco.bmp")
carrier= 4800baudio = 2400bps = 2400bw = 4800
End Sub
********** Subrutina Actualización de gráficos y de variables de información FSK *********'
Prívate Sub Option2_Click()modem = "FSK"código = "2"Picturel Picture = LoadPicture("c:\modulacion\graphics\tablafsk.bmp")
PROGRAMA DE VISUAL BASIC
P¡cture2.P¡cture = LoadP¡cture("c:\modulacion\graphics\blanco.bmpn)PictureS.Picture = LoadP¡cture("c:\modu[acion\graphics\bmfsk.bmp'')
carrier="fm4800,fs2400"baudio = 2400bps = 2400bw = 7200
End Sub
Subrutína Actualización de gráficos y de variables de información BPSK'
Prívate Sub Option3_CI¡ckOmodem = "BPSK"código = "3"Pícturel .Picture = LoadPictureCIc:\moduIacion\graphics\tablabpsk.bmp")P¡cture2.P¡cture = LoadP¡cture("c:\moduIacion\graph¡cs\fasebpsk.brnp'')PictureS.Picture = LoadPicture("c:\moduIacion\graphics\bmBPsk.bmp")
carrier= 4800baudio = 2400bps = 2400bw = 2400
End Sub
*********Subrutina Actualización de gráficos y de variables de información DPSK **********
Prívate Sub Opt¡on4_ClickOmodem = "DPSK"código = "4"Picturel .Picture = LoadPicture(llc:\modulacion\graph¡cs\bmdspk.bmp")Picture2.P¡cture = LoadPicture("c:\modulacion\graph¡cs\BLANCO.bmp")PictureS.Picture = LoadPícture("c:\modulacion\graphics\tabladpsk.bmp")
carrier=4800baudio = 2400bps = 2400bw = 2400
End Sub
PROGRAMA DE VISUAL BASIC
i
a
Subrutina Actualización de gráficos y de variables de información QPSK1
Prívate Sub Optíon5_CIickOmodem = "QPSK"código = "5"Picturel .Picture = LoadPicture("c:\moduIacion\graphics\tablaqpsk.bmp")PictureS.Picture = LoadPicture("c:\modulacion\graph¡cs\bmqpsk.bmp")PÍcture2.Picture = LoadPÍcture("c:\modulacion\graphics\faseqpsk.bmp")
carrier=2400baudio = 1200bps = 2400bw= 1200
End Sub
"Subrutina Actualización de gráficos y de variables de información 8PSK*
Prívate Sub Opt¡on6_CIickOmodem = "8PSK"código = "6"Picturel .Picture = LoadPicture("c:\moduIacion\graphics\íabla8psk.bmp")PictureS.Picíure = LoadP¡cture("c:VmoduIacion\graphics\bm8psk.bmp^Picture2.Picíure = LoadPicture("c:\moduIacion\graphics\fase8psk.bmp")
carrier = 1600baudio = 800bps = 2400bw = 800
End Sub
*********** Subrutina Actualización de gráficos y de variables de información 8QAM **********
Prívate Sub Option7_C!ickOmodem = "8QAM"código = "7"Picturel .Picture = LoadPicture("c;\modulacion\graphics\íabla8qam.bmp")
10
PROGRAMA DE VISUAL BASIC
Picture2.Pícture = LoadPicture("c:\moduIac¡on\graph¡cs\fase8qam.bmp")PictureS.Picture = LoadP¡cture("c:\modulac¡on\graph¡cs\bm8qam.bmp")carrier= 800baudio = 800bps = 2400bw= 120
End Sub
Subrutina Actualización de gráficos y de variables de información BPSK1200*
Prívate Sub Option8_ClickO
modem = "BPSK"código = "O"Picturel .Picture = LoadP¡cture("c:\modulacion\graph¡cs\tablabpsk.bmp")P¡cture2,Picture = LoadPicture("c:\modulacion\graphics\fasebpsk.bmp")PictureS.Picture = LoadPícture("c:\modulac¡on\graphics\bmBPsk.bmp")
carrier= 1200baudio = 1200bps = 1200bw= 1200
End Sub
***********Subrutína Actualización de gráficos y de variables de información BPSK4800 **********
Prívate Sub Option9_ClickO
modem = "BPSK"código = "8"Picturel .Picture = LoadPicture("c:\moduIacion\graphics\tablabpsk.bmp")Picture2.Picture = LoadPícture("c:\modulacion\graph¡cs\fasebpsk.bmp")PictureS.Picture = LoadPicture("c:\modulacion\graphics\bmBPsk.bmp")
carrier=4800baudio = 4800bps = 4800bw = 4800
End Sub
11
PROGRAMA DE VISUAL BASIC
Subrutina Texto de Información
Prívate Sub FormJ_oadQ
TextS.Text = modemText1.Text = carrierText2.Text = baudioTextS.Text = bpsText4.Text = bwText6.Text= "Coherente"Text7.Text= portEnd Sub
Subrutina de selección del Puerto Serial
Prívate Sub Form5_LoadQOption1_CIickEnd Sub
Prívate Sub FormJ_oad()
End Sub
Prívate Sub Option1_CIickOport = 1Cali pórticoEnd Sub
Prívate Sub Option2_CI¡ckOport = 2Cali pórticoEnd Sub
Prívate Sub Opt¡on3_CIickOport = 3Cali pórticoEnd Sub
Prívate Sub Option4_ClickOport = 4Cali pórticoEnd Sub
PROGRAMA DE VISUAL BASIC
*********** Módulo de variables públicas y subrutina seleccionar puerto **********
Public modem As StringPublic carrier As VariantPublic bwAs VarianíPublic baudio As VariantPublic bps As VariantPublic port As VariantDim data As Varianí
Sub cerrar_puertoOIf Forml .MSComml .PortOpen = True ThenForm1.MSComm1 .Portopen = FalseElseEnd If
End SubSub porticoQForml Textl .Text = "COMM :" & portCali cerrar_puertoForml .MSComml .CommPort = port
1 56000 baudios, sin paridad, 8 bits de datos y 1 'bit de parada.Forml .MSComml .Settings = "56000^,8,1"
End Sub
13
*** ******* ******
PROGRAMA DE INICIALIZACION DEL CODEO Y ADSP-2181
{ *************** ESCUELA POLITÉCNICA NACIONAL ****************
*************** FACULATAD DE INGENIERÍA ELÉCTRICA ****************
*************** SISTEMA MODSIS ****************
*************** PROGRAMA DE 1NICIALIZACION1
Quito, Ecuador 1999. }
.module/RAM/ABS=0 loopback;
{ Declaración de constantes }
.const Sys_Ctrl_Reg= OxSfff; (System Control Register}
.const Dm_Wa¡t_Reg= OxSffe; {Data Memory Wait Control Register}
.const Tperiod_Reg= OxSffd; {Timer Period}
.const Tcount_Reg= Ox3ffc; {Timer Count}
.const TscaIe_Reg= Ox3ffb¡ {Timer Scaling Factor}
.const SportO__Rx_Words1 = OxSffa; {SportO Multichannel Receive}
.const SportO_Rx_WordsO= Ox3ff9; {Word Enable Register (32-bit)}
.const SportO_Tx__Words1= Ox3ff8; {SportO Multichannel Transmit}
.const SportOJTx_WordsO= Ox3ff7; {Word Enable Register (32-bit)}
.const SportO_Ctrl_Reg= Ox3ff6; {SportO Control Register}
.const SportO_Scikdiv= Ox3ff5; {SportO Serial dock Divide Modulus}
.const SportO_Rfsdiv= Ox3ff4; {SportO Rcv Frame Sync Divide Modulus}
.const SportO_Autobuf_CtrI= Ox3ff3; {SportO Autobuffer Control Register}
.const Sport1_CtrLReg= Ox3ff2; {Sportl Control Register}
.const Sport1_Scíkdiv= Ox3ff1; {Sportl Serial dock Divide Modulus}
.const Sport1_Rfsdiv= Ox3ffO; {Sportl Rcv Frame Sync Divide Modulus}
.const Sport1_Autobuf_Ctrl= OxSfef; {Sportl Autobuffer Control Register}
.const Prog_FIag_Type= Ox3fe6;
.const Prog_FIag_Data= Ox3fe5;
.const BDMA_Word_Count= Ox3fe4;
.const BDMAMControl= Ox3fe3;
.const BDMA_External_Address= Ox3fe2;
.const BDMA_lnternal_Address= Ox3fe1;
.const IDMA Control^ OxSfeO:
{ Declaración de Variables y Buffer }
.var/dm/ram/circ rx_buf[3]; {Status + L data + R data, AD1847 rx buffer}
.var/dm/ram/circ tx_buf[3j; {Cmd + L data + R data, AD1847 tx buffer}
.var/dm/ram/circ init_cmds[13];
.var/dm statjlag;
.var/dm fin_f!ag;
1 Basado en el programa de Analog Divices ADSP-2100 Family EZ-KIT-Lite Refereiice Manual pag. 5-5
1
PROGRAMA DE INICIALIZACION DEL CODEC Y ADSP-2181
.¡nít init_cmds:OxcOOS, {
Left inpuí control regb7-6: 0=Ieftline 1
1 =Ieft aux 12=lett íine 23=Ieft líne 1 post-mixed ioopback
b5-4: resb3-0: left input gain x 1.5 dB
}Oxc103, {
Rightinput control regb7-6: 0=rightline 1
1=right aux 12=right line 23=right une 1 post-mixed Ioopback
b5~4:resb3-0: right input gain x 1.5 dB
}Oxc288, {
left aux 1 control regb7 : 1=left aux 1 muteb6-5: resb4-0: gain/atten x 1.5, 08= OdB, 00= 12dB
}Oxc388, {
right aux 1 control regb7 : 1=right aux 1 muteb6-5:resb4-0: gain/atten x 1.5, 08= OdB, 00= 12dB
}Oxc488, {
íeft aux 2 control regb7 : 1=left aux 2 muteb6-5: resb4-0: gain/atten x 1.5, 08= OdB, 00= 12dB
}Oxc588, {
right aux 2 control regb7 : 1=right aux 2 muteb6-5: resb4-0: gain/atten x 1.5, 08= OdB, 00= 12dB
}Oxc680, {
left DAC control regb7 : 1=Ieft DAC muteb6 :resb5-0; attenuation x 1.5 dB
}Oxc780, {
right DAC control regb7 : 1=right DAC muteb6 :resb5-0: attenuation x 1.5 dB
}fs, {
data format register
}Oxc909, {
PROGRAMA DE INICIALIZACION DEL CODEO Y ADSP-2181
b7 : resb5-6: 0=8-bit unsigned linear PCM
1=8-bit u-law companded2=16-bií signed linear PCM3=8-bit A-law companded
b4 : 0=mono, 1=stereobO-3:0= 8.
1 = 5.51252=16.3=11.0254= 27.428575=18.96=32.7= 22.058= .9= 37.8a= .b= 44.1c=48.d= 33.075e= 9.6f= 6.615
(bO): 0=XTAL1 24.576 MHz; 1=XTAL2 16.9344 MHz
interface confíguration regb7-4: resb3 : 1=autocalibrateb2-1: resbO : 1=playback enabled
OxcaOO, {pin control regb7 : logic state of pin XCTL1b6 : logic state of pin XCTLOb5 :master-1=tri-stateCLKOUT
slave - x=tri-state CLKOUTb4-0: res
Oxcc40, {miscellaneous information regb7 : 1=l6slots perframe, 0=32slots perframeb6 : 1=2-wire system, 0=1-wire systemb5-0: res
OxcdOO; {digital mix control regb7-2: attenuation x 1.5 dBb1 :resbO : 1=digital mix enabled
}
{ Interruptvectortable —
jump start; rtí; rti; rti;rtí; rti; rti; rti;rti; rti; rti; rti;
{00: reset){04: IRQ2}{08:IRQL1}
PROGRAMA DE INIC1AL1ZACION DEL CODEC Y ADSP-2181
rt¡; rti; rti; rti; {Oc: ÍRQLO}
ar = dm(stat_flag); (10: SportO íx}ar= pass ar;if eq rti;jump next_cmd;
jump input_samp!es;rt¡;rti;rti; (14: SportO rx}
jump írqe; rti; rti; rti; {18: IRQE}rti; rti; rti; rti; {1c: BOMA}rti; rti; rti; rti; {20: Sport! tx or 1RQ1}rti; rti; rti; rti; {24: Sportl rx or IRQO}
jump process_a_bit; rti; rti; rti; {28: timer}rti; rti; rti; rti; {2c: power down}
{_ — ADSP 2181 intialization — }
start:¡O = Arx_buf; {pointto start of buffer}10 = %rx_buf; {initialize length register}¡1 = Atx_buf;11 = %tx_buf;¡3 = Ainit_cmds;13 = %¡nit_cmds;m1 = 1;
{ ----- Serial Port O (SportO) Set Up ----- }
axO = b#0000001 01 00001 11; dm (SportO_Autobuf_Ctri) = axO;{ |||!|-/!/|-/|/|+- receive autobuffering 0=off, 1=on
|]|í| !| | +--transmit autobuffering 0=off, 1=onl||!j ! [ + — | receive m?H U Í 1 1 m1|[|i| j + ------ . | receive i?HUÍ ! nol l l l l I !|||lj +========= | transmitm?l l l l l | mi|||l+ ------------ ¡transmití?i ni
BIASRND MAC biased rounding control bito
CLKODIS CLKOUT disable control bit
axO = 0; dm (SportO_Rfsdiv) = axO;{ Rfsdiv = SCLK Hz/RFS Hz - 1 }
axO = 0; dm (SportO_Sclkdiv) = axO;
PROGRAMA DE 1NICIALIZACION DEL CODEO Y ADSP-2181
{ SCLK=CLKOUT/(2 (Sclkdiv+1)}
axO = b#l 000011000001111; dm (SportO_CtrI_Reg) = axO;{ multichannel
||+-/|!ll+/+—/I numberof bit per word- 1
]||+====== ! 0=rightjust, 0-fíll; 1=rightjust,signed!|¡ ! 2=compand u-law; 3=compand A-lawlj+ receive framing logic 0=pos, 1=neg!+ transmit data vafid logic 0=pos, 1=neg+========= RFS 0=ext, 1=int+ multichannel iength 0=24,1=32 words
|framesyncto occurthis numberof clock|cycles before first bit
j+ . |SCLKO=ext, 1=¡nt+ multichannel 0=disable¡ 1=enable
}{ non-muitichannel
i-—/1 number of bit per word -11 = 15
]+===== i o=rightjust, 0-fill; 1=rightjust,signedj 2=compand u-Iaw; 3=compand A-Iawreceive framing logic 0=pos, 1=neg
— transmit framing logic 0=pos, 1=neg+========= RFS 0=ext, 1=¡nt
JFS 0=ext, 1=intIIPI+ ----------- TFS width 0=FS before data, 1=FS in syncj|ji+ ---------- -TFS 0=no, 1=requiredj|j+_____=:._=__=__ RFS w¡dth 0=FS before data, 1=FS in syncj|+ ------------- RFS 0=no¡ 1=requiredj+ --------------- ISCLKO=ext, 1=int+ --------------- multichannel 0=disable, 1=enable
axO = b#00000000000001 11; dm (SportO_Tx_WordsO) = axO;{A1 5 00A transmit word enables: channel # == bit # }
axO = b#00000000000001 11; dm (SportO_Tx_Words1) = axO;{A31 1 6A transmit word enables: channel # == bit # }
axO = b#0000000000000111; dm (SportO_Rx_WordsO) = axO;(A1 5 00A receive word enables: channel # == bit # }
axO = b#00000000000001 11; dm (SportO_Rx_Words1) = axO;(A31 16A receive word enables: channel #== bit#}
{- — Sportl SetUp ---- }
axO = 0;dm(Sport1_Autobuf_Ctrl) = axO; {autobuffering disabled}dm(Sport1MRfsdiv) = axO; {Rfsdiv not used}dm(Sport1_Sclkdiv) = axO; {Sclkdív not used}
PROGRAMA DE 1NICIALIZACION DEL CODEO Y ADSP-2181
dm(Sport1__Ctrl_Reg) = axO; {control functions dísabled}
{ Timen Setup }
axO = 0;dm(TscaieJReg) = axO; {timernot used}dm(Tcouní_Reg) = axO;dm(Tperiod_Reg) = axO;
{ System and Memory Set Up -—}
axO = btfOOOOOOOOOOOOOOOO; dm (Dm_Wait_Reg) = axO;(was axO = b#0000111111111111; dm (Dm_Wait_Reg) = axO;}
{ !+-/+-/+-/+-/+-/-! IOWAITO
IOWAIT1
+ I 1QWAIT2
+ i ¡OWAIT3
]+==========:===== ! DWAIT
4. _______ _____ : n¡ — -,— « \j
axO = b#0001 000000000000; dm (Sys_Ctr!_Reg) = axO; (enable SportO}{ +-/I|l+ — /+-/- 1 program memory wait states
O
j i¡+ ---------- -Sportl 1=seriaiport, 0=FIJFO,1RQO¡IRQ1J
| ¡+ ----------- -Sportl 1=enab!ed, 0=d¡sabledj +============= sportO 1=enabied, 0=d¡sabled+ --------------- O
OO
ífc = b#0000001 1111111; {olear pending interrupt}nop;
icntl = b#00000;{ IHI+-I IRQO: o=level, 1=edge
IH+- | IRQ1: 0=level, 1=edgeH+— I IRQ2: 0=level, 1=edge
PROGRAMA DE ÍNICIAUZACION DEL CODEC Y ADSP-2181
| IRQ nesting; 0=disabled, 1=enabled
mstat= b#1000000;*- Data register bank select
FFT bit reverse mode (DAG1)ALU overflow latch mode, 1=stickyAR saturation mode, 1=saturate, 0=wrapMAC result, 0=fract¡onal, 1=integertimer enableGO MODE
{_— ADSP 1847 Codee intíaíization }
axO = 1;dm(stat_Jlag) = axO;
{clearflag}
imask=b#0001000000;[ timer| Sport! recorIRQOSport] trxorIRQI
[ BDMAIIRQE
SportO recSportOtrx
| IRQLO| IRQL1| IRQ2
{enabíe transmit interrupt}
+_ I+
axO = dm (¡1,íxO = axO;
checkjnrt:axO = dm (stat_flag);af = pass axO;if ne jump checkjnit;
ayO = 2;
check_ac¡1:axO = dm (rxjDuf);ar= axO and ayO;if eq jump check_ac¡1 ;
check_aci2:axO = dm (rx_buf);ar= axO and ayO;if ne jump check_ac¡2;
idle;
ayO = OxbfSf; {unmute I en DAC}axO = dm (¡nit_cmds + 6);ar= axO AND ayO;
{start interrupt}
(wait for entire ínit}{bufferto be sentto}
{the codee }
{once initialized, wait for codee}(to come outof autocalibration}
{wait for bitset}
{wait for bit clear}
PROGRAMA DE IN1CIALIZACION DEL CODEC Y ADSP-2181
dm (bcjDitf) = ar;¡dle;
axO = dm (¡nit_cmds + 7); {unmute right DAC}ar=axO ANDayO;dm (txjDuf) = ar¡¡dle;
axO = Oxc901; {clear autocalibratíon request}dm(tx_buf) = axO;¡dle;ax1 = 0x8000; {control word to clear over-range flags}dm(tx_buf) = ax1;
ifc = b#00000011111111; {clear any pending ínterrupt}nop;
¡mask ~ 0x30; {enable rxO ¡nterrupt}{ IIIIIIIH+Itlmer
+- Sportl recorlRQO+-- Sportl trxorIRQI
HI1+- BDMAIH+— 1RQEH+ | SportOrec|+ ISportOtrx
IRQLO[RQL1
+ | [RQ2
}axO = 0;dm(f¡n_Jlag) = axO; {Inicializa fin_f!ag}
PROGRAMA DE FINALIZACIÓN DEL CODEC Y ADSP-2181
***************
**********-*****
ESCUELA POLITÉCNICA NACIONAL
FACULATAD DE INGENIERÍA ELÉCTRICA ****************
SISTEMA MODSIS ****************
PROGRAMA DE FINALIZACIÓN
Quito, Ecuador 1999.
Rutina de la interrupción de Recepción-
next_cmd:ena sec_reg;axO = dm (¡3,dm (tx_buf) = axO;axO = ¡3;ayO = Ainit_cmds;ar= axO - ayO;ifgtrti;axO = OxafOO;dm (tx__buf) = axO;axO = 0;dm (statjlag) = axO; (Reset statjlag}rti;
.endmod;
Basado en el programa de Analog Divices ADSP-2100 Family EZ-KIT-Lite Reference Manual pag. 5-10
1
PROGRAMA DE MODULACIÓN DIGITAL
**AAAAAA******* ESCUELA POLITÉCNICA NACIONAL ****************
*************** FACULTAD DE INGENIERÍA ELÉCTRICA ****************
*************** <-íIcíTFMA MOD^I'-í ****************
*************** PROGRAMA DE MODULACIÓN ****************
Realizado por:GERARDO SALCEDO VALLEJORODRIGO VERA GONZÁLEZ
Quito, Ecuador 1999.
Selección de la frecuencia de muestreo del CODEC
.const fs = Oxc85c; { 48000 Hz}
• ******** Inicíalizacion del CODEC y ADSP **********}
.include <c:\ad¡_dsp\lab_dsp\inicio.dsp>;
{ ****** Definición de constantes y variables para el programa MODULAR ******}
.const tx_num_of_bits = 10;
.const rx_num_of_bits = 8;
.const RX_BIT_ADD = Ox0100;
.const TX_BIT_ADD = OxfeOO;
.const PERIOD = 1144;
.const TSCALE= OxSffb;
.const TCOUNT= OxSffc;
.const TPERIOD= OxSffd;
.const System_Control_Reg= Ox3fff;
.const D=4800;
.const A=0x7fff;
.const B=0x8000;
.const c=480;
.var numero;
.var band_tx_listo;
.var band_rxjisto;,var band_rx_parada_todavia;
PROGRAMA DE MODULACIÓN DIGITAL
.var band_rx_no_palabra;
.var band_rx_off;
.var timer_tx_ctr;
.var tímer_rx_ctr;
.var usuario_tx_buffer;
.var usuario__rx_buffer;
.var interno_tx_buffer;
.vars;
.var interno_rx_buffer;
.var bandera;
.var bitsjzq_Ín_tx;
.var b¡tsjzq_ín_rx;
.var baud_period;
.var/dm/círc seno[D];
.var/dm/c¡rc data_rx[30];,var/dm/c¡rc codigo[10];.init seno:<senotb!3.hex>;.inits:1;i2=Aseno+2400; {puntero de dpsk fase 180 grados}I2=%seno;m2=c;i7=Aseno+2401; {puntero de pskfase 180 grados}I7=%seno;
¡4=Acodigo;I4=%codigo;m4=l:
{ ******** Rutina de enlace entre el computador y el ADSP-2181{ Recepción del código y datos}
auto:¡5=Adata_rx;I5=%data_rx;m5=l;
AR=195;DM(Baud_Period)=AR;CALL lnit_UART;CNTR = 5100;DO XLOOP UNTIL CE;
XLOOP: NOP;CNTR=5100;
DOYLOOPUNTILCE;YLOOP; NOP;
CALLTurn_RX_On;axO=0;
dm(bandera)=axO;
cntr=4; { numero de caracteres que ingresan al adsp}DOMLOOP UNTIL ce;
PROGRAMA DE MODULACIÓN DIGITAL
CALLGet_Char_AXl;CALLOuí_Char_AX1;
MLOOP: NOP;JUMP leer_codigo;
HOLA: cntr=5000;do zloop untíl ce;zloop: nop;cntr=5000;do ploop until ce;pfoop: nop;cntr=5000;do kloop until ce;kloop: nop;
cali turn_rx_off;JUMPask ¡ni;
Subrutina de enlace entre el computador y el ADSP-2181
inrt_uart:axO=0;dm(TSCALE)=axO;
axO=dm(baud_period);
dm(TCOUNT)=axO;dm(TPERIOD)=axO;
axO=1;dm(band_txjisto)=ax0;dm(band_rx_I¡sto)=axO;dm(band_rx_parada_todavia)=axO;dm(band_rx_no_palabra)=axO;dm(band_rx_off)=axO;
seí flag_out;¡fc=0x003f;nop;imask=b#01000l;-ena timer;rts;
process_a_bit:
ena sec_reg;ax0=dm(band_txj¡sto);ar=pass axO;if ne jump receíver;
Sección de transmisión
PROGRAMA DE MODULACIÓN DIGITAL
ayO=dm(timer_tx_ctr);ar=ayO-1;dm(t¡mer_tx_ctr)=ar;if nejump receiver;
sr1 =dm(interno_tx_buffer);sr=Ishiftsr1 by-1 (h¡);dm(interno__tx_buffer)=sr1;ar=pass srO;alío_l :¡f ge jump bajo_J;if It set flag_ouí;axO=Ox0001;ar=cntr;ayO=3;ar=ayO-ar;¡f eq jump uno;dm(¡5im5)=axO; { ingreso de los datos en el bufferde datos}jump salida;
uno:dm(i4,m4)=axO; { Ingreso del código en el bufferde código}jump salida;
bajo_1: reset flag_out;axO=OxOOOO;ar=cntr;ayO=3;ar=ayO~ar;¡f eq jump uno;dm(Í5,m5)=axO;
salida: toggle fI1;ayO=3;dm(íimer_txMctr)=ayO;
ayO=dm(bits_izq_inMtx);ar=ayO-1;dm(biísjzq_¡n_tx)=ar;if gtjump receiver;
axO=1;dm(band_tx_IIsto)=axO;
_Seccíon de recepción.
receiver;axO=dm(band_rx_off);ar=pass axO;¡f ne rti;
axO=dm(band_rx_parada_Jodav¡a);ar=pass axO;if nejump rx_íest_ocupado;
ayO=dm(timer_rx_ctr);ap=ayO-1;
PROGRAMA DE MODULACIÓN DIGITAL
dm(t¡mer_fx_ctr)=ar;if ne rti;
axO=1;dm(band_rx_paradaj:odav¡a)=ax0;dm(band_rxjisto)=ax0;
axO=dm(interno_rx_buffer);dm(usuar¡o_rx_buffer)=axO;
axO=0;dm(band_rx_jio_pa!abra)=axO;rti;
rx_test_ocupado:axO=dm(band_rx_listo);ar=pass axO;if eq jump rx_ocupado;
ifflagjn jump rx_exit;
axO=0;dm(bandMrx_listo)=axO;dm(interno_rx_buffer)=axO;
axO=4;dm(timer_rx_ctr)=axO;axO=rx_num_of_bits;dm(bits_izq_in_rx)=axO¡
nx_exit;rti;
rx_ocupado:ayO=dm(timer_rx_ctr);ar=ayO-1;dm(timer_rx_cír)=ar;if ne rti;
rcv:axO=3;dm(timer_rx_ctr)=axO;
ayO=RX_BIT_ADD;ar=dm(interno_rx_buffer);if not flagjn jump pad_zero;ar=ar+ayO;
pad_zero:sr=lshift ar by-1 (lo);dm(interno_rx_buffer)=srO;
ayO=dm(bits_izqjn_rx);ar=ayO-1;dm(b¡ts_¡zq_¡n_rx)=ar;ifgtrti;
axO=3;
PROGRAMA DE MODULACIÓN DIGITAL
dm(timer_rx_ctr)=axO;axO=0;dm(band_rx_parada_todavia)=axO;rti;
invoke_UART_transm¡t:
axO=3;dm (timer_tx_ctr)=axO;
axO=tx_num_of_bits;d m (bits_izq_i n_tx)=axO;
sr1=0;srO=TX_BIT_ADD;ar=dm(usuario_tx_jDuffer);sr=sr or Ishift ar by 1 (lo);dm(interno_tx_buffer)=srO;
axO=0;dm(band_txj¡sto)=ax0;rts;
get_char_ax1:axO=dm(band_rx_no_palabra);
ar=pass axO;if ne jump get_char_ax1;
ax1=dm(usuario_rx_buffer);axO=l;
dm(bandMrxMno_palabra)=axO;rts;
out_char_ax1:axO=dm(band_tx_Iisto);ar=pass axO;if eq jump out_char_ax1;dm(usuario_tx_buffer)=ax1;cali invokeMUART_transmit;
rts;
íurn_rx_on:axO=0;
dm(bandMrxMoff)=axO;rts;
íurn_rx_off:axO=1;
dm(band_rx_off)=axO;rts;
leer_ codigo:Subrutína para leer el tipo de modulación digital ********}
PROGRAMA DE MODULACIÓN DIGITAL
leer_codigo:
axO=dm(codigo+1);DM(OX200)=axO;
axO=dm(codigo+2);DM(OX201)=axO;
axO=dm(cod¡go+3);DM(OX202)=axO;
axO=dm(codigo+4);DM(OX203)=axO;
JUMP HOLA;
Rutina interna del ADSP para producir la modulación digital
askjni: dis timer;¡fo=0xff;nop;
axO = b#0001000000000000; dm (Sys_CtrI_Reg) = axO;
imask =0x30;cntr=l;ayO=0;¡6 = Aseno;16= %seno; { Puntero para onda }i7=Aseno+2401; (puntero de dpskfase 180 grados}[7=% sen o;m6=c;
Procesamiento de las muestras de entrada
espera: idle; { Lazo infinito de espera de una interrupción }ar= dm(fin_band);ar= pass ar;íf ne rts; { Si se presiona IRQE retorna al programa monitor}ar=dm(bandera);ar=pass ar;if nejump auto;jump espera;
{ Subrutina de procesamiento de muestras (salto a modulación deseada) }
7
PROGRAMA DE MODULACIÓN DIGITAL
input_samples: ena sec_reg; { Habilitación del banco de registros secundario }
axO=dm(Ox200);ar= tstbit O of axO;¡f ne jump abq8q;Jumpfd8pb1200b4800;
abqSq: {1XX}axO=dm(Ox201);ar= tstbit O of axO;if nejump b8q;jump aq;
b8q:axO=dm(Ox202);a r= tstbit O of axO;¡f nejump qam8; {111}jump bpsk; {110}
aq:{10X}axO=dm (0x202);ar= tstbit O of axO;if nejumpqpsk; {101}jump ask; {100}
fd8pb1200b4800: {OXX}axO=dm(Ox201);ar= tstbit O of axO;if nejump f8p;jump db1200b4800; {OOx}
f8p: {01X}axO=dm(Ox202);ar= tstbit O of axO;¡f nejump psk8; {011}jumpfsk; {010}
db1200b4800:axO=dm(Ox202);ar= tstbit O of axO;if nejump dpsk; {001}jump b1200b2400; {000}
b1200b2400:
axO=dm(Ox203);ar= tstbit O of axO;if ne jump bpsk4800¡ {0001}jump bpsk1200; {0000}
PROGRAMA DE MODULACIÓN DIGITAL
{AAAAAA********* Subrutina modulación ASK ****************}
ask:m6=c;
¡f noí cejump lazo;cali ieer_bit;lazo:ar = tstbít O of srO;ax1 = dm(rx_buf + 1); { Muestra del canal izquierdo }mx1 = dm(rx_buf + 2); { Muestra del canal derecho }
{ Generación de la forma de onda }
if eq jumpsalto_1;mxO = A;
myO = dm(¡6,m6); { muestra de sen(2*p¡*f1*t)}mr= mxO*myO(ss); {A*sen(2*pi*f1*t) }axO = mr1;
jumpsalto_2;salto_1:mxO=0;myO= dm(i6,m6);mr= mxO*myO(ss);axO = mr1;
/ \o de muestras procesadas al CODEC-
salto_2; dm(tx_buf + 1) = axO;dm(tx_buf+2) = axO;
rti;
¡rqe: axO=1;dm(fin_band) = axO;
rti;
Ieer_bit:¡6 = Aseno;16= %seno; { Puntero para onda }
cntr=20;axO=31;ar=axO-ayO;
PROGRAMA DE MODULACIÓN DIGITAL
¡f eq jump peso;axO=1;ar=axO-ayO;if eq jump lan;srQ=dm(¡5,m5);jump bien;lan:axO=Ox0001;srO=axO;bien:ar=ayO+1;ayO=ar;rís;
Subrutina modulación FSK
fsk:.const el =480; {fo = c*48000/4800 = 10*c Hz}.constc2=240;.const A1=0x7fff; {fo mínima = 10 Hz , con c=1 }m6=d;m7=c2;
¡f not ce jump Iazo_f;cali Ieer1_bit;lazo_f:ar = tstbit O of srO;ax1 = dm(rx_buf + 1); { Muestra del canal izquierdo }mx1 = dm(rx_buf + 2); { Muestra del canal derecho }
{ Generación de la forma de onda }
¡f eq jumpsalto_f1;mxO = A1 ;
myO = dm(¡6,m6); { muestra de sen(2*pi*f1*t)}mr= mxO*myO(ss); { A*sen(2*pi*f1*t) }axO = mrl ;
jumpsalto_f2;sa!to__f1:mxO=A1;myO= dm(¡6,m7);mr= mxO*myO(ss);
axO = mrl;
\o de muestras procesadas al CODEO
saito_f2: dm(tx_buf + 1) = axO;dm(txjDuf+2) =
rti;
10
PROGRAMA DE MODULACIÓN DIGITAL
Ieer1_bit:¡6 = Aseno;16= %seno; { Puntero para onda }
axO=31;ar=axO-ayO;¡f eq jump peso;ar=ayO+1;ayO=ar;cntr=20;srO= dm(¡5,m5);rts;
********* Subrutina modulación BPSK ****************}
BPSK:¡f not ce jump lazo_b;cali [eer2_bit;lazo_b:ar= tstbit O of srO;ax1 = dm(rx_buf + 1); {Muestra del canal izquierdo}mx1 = dm(rx_buf + 2); { Muestra del canal derecho }
{Generación de la forma de onda }
if eq jumpsalto_b1;mxO = A;
myO = dm(¡6,m6); { muestra de sen(2*pi*f1*t)}mr= mxO*myO(ss); {A*sen(2*pi*f1*t)}axO = mr1;
jump salto_b2;salto_b1:mxO=A;myO= dm(i7,mG);mr = mxO*myO(ss);
axO = mr1;
Envjo de muestras procesadas al CODEO
saito_b2: dm(tx_buf + 1) = axO;dm(tx_buf+2) =
rti;
11
PROGRAMA DE MODULACIÓN DIGITAL
ieer2_bit:
axO=31;ar=axO~ayO;íf eq jump peso;ar=ayO+1;ayO=ar;cntr=20¡srO= dm(i5,m5);i6 = Aseno;16= %seno; { Puntero para onda }i7=Aseno+2401; {puntero de dpsk fase 180 grados}I7=%seno;
rts;
Subrutina modulación BPSK1200
BPSK1200:.constc9=120;m7=c9;¡f not ce jump Iazo_b0;cali Ieer0_bit;Iazo_b0:ar= tstbit O of srO;ax1 = dm(rx_buf + 1); { Muestra del canal izquierdo }mxl = dm(rx_buf + 2); {Muestra del canal derecho }
{ Generación de la forma de onda }
if eq jump salto_bO;mxO = A;myO = dm(¡6,m7); { muestra de sen(2*p¡*f1*t)}
mr= mxO*myO(ss); {A*sen(2*pi*f1*t)}axO = mr1;
jumpsalto_b20;salto_bO:mxO=A;myO= dm(¡7,m7);mr= mxO*myO(ss)¡
axO = mr1;
Env¡o de muestras procesadas al CODEC-
12
PROGRAMA DE MODULACIÓN DIGITAL
salto_b20: dm(txj>uf + 1) = axO;dm(tx_buf+2) = axO;
rt¡;
Ieer0_bit:axO=31;ar=axO-ayO¡if eq jump peso;ar=ayO+1;ayO=ar;cntr=40;srO= dm(i5,m5)¡¡6 = Aseno;I6= %seno; { Puntero para onda }i7=Aseno+2401; {puntero de dpsk fase 180 grados}I7=%seno;rts;
Subrutina modulación BPSK4800 *AA
BPSK4800:¡f not ce jump Iazo_b8;cali Ieer8_bit;Iazo_b8:ar = tstbit O of srO;ax1 = dm(rx_buf + 1); { Muestra del canal izquierdo }mxl = dm(rxjDuf + 2); { Muestra del canal derecho }
{ Generación de la forma de onda }
if eq jumpsaltojDS;mxO = A;
myO = dm(i6,m6); { muestra de sen(2*pi*f1*t)}mr= mxO*myO(ss); {A*sen(2*p¡*f1*t)}axO = mr1 ¡
jumpsalto_b28;sa!to_b8:mxO=A;myO= dm(Í7,m6);mr= mxO*myO(ss);
axO = mr1;
/ \ Env¡o de muestras procesadas al CODEC-
PROGRAMA DE MODULACIÓN DIGITAL
salto_b28: dm(tx_buf + 1) = axO;dm(tx_buf+2) = axO;
ti;
Ieer8j3¡t:axO=31;ar=axO-ayO;¡f eq jump peso;ar=ayO+1;ayO=ar;cntr=10;srO= dmOS.mS);¡6 = Aseno;16= %seno; { Puntero para onda }I7=Aseno+2401; {puntero de dpsk fase 180 grados}!7=%seno;
rts;
******** Subrutína modulación DPSK ****************}
DPSK:
if not ce jump Iazo_d;cali Ieer3_bit;lazo_d:ar = tstbitO ofsrO;
ax1 = dm(rx_buf + 1); { Muestra del canal izquierdo }mx1 = dm(rx_buf + 2); { Muestra del canal derecho }
ar=arXOR ay1;ar= notar;ar= arand 1;dm(s)=ar;
{ Generación de la forma de onda }
if eq jumpsalto_d1;mxO = A;myO = dm(i6,m6); { muestra de sen(2*pi*f1*t)}
mr= mxO*myO(ss); {A*sen(2*pi*f1*t)}axO = mr1;
jumpsalto_d2;salto_d1:
14
PROGRAMA DE MODULACIÓN DIGITAL
mxO=A;myO=dm(i2,m2);mr= mxO*myO(ss);axO = mr1;
{ Env¡o de muestras procesadas al CODEC-
salto_d2: dm(tx_buf + 1) = axO;dm(íx_buf+2) = axO;
rti;
/
Ieer3_bit:¡7=Aseno+2401; {puntero de dpsk fase 180 grados}I7=%seno;¡6 = Aseno;I6= %seno; {Puntero para onda }
axO=31;ar=axO-ayO;if eq jump peso;ar=ayO+1;ayO=ar;
cntr=20¡srO= dm(¡5,m5);Ay1=dm(s);rts;
QPSK:.const g=240;m6=g;
if not ce jump lazo_q;cali leenlazo_q:cali Ieer4_bit;
ax1 ~ dm(rx_buf + 1); { Muestra del canal izquierdo }mx1 = dm(rx_buf + 2); { Muestra de! canal derecho }
{ Generación de la forma de onda }
ar = tstbitO ofsrO;¡f eq jumpsalto_q1;ar=tstbitOofSR1;
15
PROGRAMA DE MODULACIÓN DIGITAL
if eq jump caso_10¡caso_11: if mv cali fase_1;
mxO = A;myO = dm(i6,m6); { muestra de sen(2*pi*fl*t)}
mr = mxO*myO(ss); { A*sen(2*p¡*fl*t)}axO = mr1;
astat=0;jumpsalto_2;
caso_10:¡f mv cali fase_2;mxO=A;myO= dm(¡6,m6);mr= mxO*myO(ss);
axO = mrl;astat=0;jump salto_q2¡
salto_q1:af=tstbitOofSR1;if eq jump caso_00;caso_01:¡f mv cali fase_4;mxO=A;myO= dm(í6,m6);mr= mxO*myO(ss);
axO = mr1;astat=0;jump salto_q2;
caso_00:if mv cali fase_3;mxO=A;myO= dm(i6,m6);mr= mxO*myO(ss);asíat=0;axO = mr1;
Env¡o de muestras procesadas al CODEC ----------------- }
salto__q2: dm(tx_buf + 1) = axO;dm(tx_buf+2) = axO;
ar=dm(numero);af=pass ar;ax1=17;ar=ax1-af;if ne rti;axO=0;dm(tx_buf + 1) = axO;dm(tx_buf+2) = axO;
rti;
16
PROGRAMA DE MODULACIÓN DIGITAL
Ieer4_bit:axO=17;ar=axO-ayO;¡f eq jump peso;ar=ayO+1;ayO=ar;dm(numero)=ar;cntr=40;srO= dm(¡5,m5);sr1=dm(¡5,m5);astat=0x40;rts;
********* Subrutina modulación 8PSK AAAJ~AAXJc********}
PSK8:.constc3=160;m6=c3;if not ce jump lazo_8p¡cali Ieer5_bit;lazo_8p:
ax1 = dm(rx_buf + 1); { Muestra del canal izquierdo }mx1 -~ dm(rx_buf + 2); { Muestra del canal derecho }
{ Generación de la forma de onda }
ar = tstbítOofsrO;if eq jumpcaso_Q;caso_1: ar= tstbit O of SR1;
if eq jump caso_a10;
caso_a11: ar=ayl;ar=tstbit O of ar¡if eqjumpcaso_110;
caso_111: mxO = A;if mv cali uno_1;myO = dm(í6,m6); { muestra de sen(2*pi*f1*t)}mr= mxO*myO(ss); { A*sen(2*pi*f1*t)}axO = mr1¡ASTAT=0;jumpsalto_28p;
caso_110: mxO=A;¡f mv cali uno_2;myO= dm(i6,m6);mr= mxO*myO(ss);axO = mr1;ASTAT=0;jump salto_28p;
17
PROGRAMA DE MODULACIÓN DIGITAL
caso_a10: ar=ay1;ar=tstb¡t O of ar;¡f eqjump caso_100;
caso_101: mxO=A;if mv cali uno_3;
myO= dm(¡6,m6);mr= mxO*myO(ss);axO = mr1;ASTAT=0;jump salto_2;
caso_100; mxO=A;¡f mv cal! uno_4;
myO= dm(i6,m6);mr= mxO*myG(ss);axO = mr1;ASTAT=0;jump salto_2;
casoj): ar= ístbií O of SR1;¡f eqjump caso_aOO;
caso_a01: ar=ay1;ar=tstbit O of ar;if eqjump caso_010;
caso_011: mxO = A;¡f mv calí uno_5;myO = dm(i6,m6); {muestra de sen(2*pi*fl*t)}mr = mxO*myO(ss); { A*sen(2*p¡*fl*t)}axO = mr1¡ASTAT=0;jump salto_28p;
caso_010: mxO=A;¡f mv calí uno_6;myO=dm(i6,m6);mr= mxO*myO(ss);axO = mrl;ASTAT=0;jumpsa[to_28p¡
caso_aOO: ar=ay1;ar= tstbit O of ar;if eq jump caso_000;
caso_001; mxO=A;if mv cali uno_7;myO=dm(i6,m6);mr= mxO*myO(ss);axO = mrl;ASTAT=O;jump salto__28p¡
caso_000: mxO=A;if mv cali uno_8¡myO= dm(¡6,m6);mr= mxO*myO(ss);axO = mr1;
18
PROGRAMA DE MODULACIÓN DIGITAL
ASTAT=0;jump salío_28p;
Envjo de muestras procesadas al CODEC-
salto_28p: dm(txj)uf + 1) = axO;dm(tx_buf+2) = axO;
ar=dm(numero);af=pass ar¡axl=12;ar=ax1-af;if ne rti;axO=0;dm(tx_buf + 1) = axO;dm(tx_buf+2) = axO;
rti;
{-
Ieer5_bit:axO=12;ar=axO-ayO;¡f eq jump peso;ar=ayO+1;ayO=ar;dm(numero)=ar¡cntr=60;srO= dm(¡5,m5)¡sr1=dm(¡5,m5);ay1=dm(i5,m5);ASTAT=Ox40;rts¡uno_1:¡6=Aseno+300; I6=%seno;rts;uno_2:¡6=Aseno+900¡ IG=%seno;rts;uno_3:i6=Aseno+2100; I6=%seno;rts;uno__4:¡6=Aseno+1500; I6=%seno;rts;uno_5:¡6=Aseno+4500; I6=%seno;rts;uno_6:¡6=Aseno+3900; I6=%seno;rts;uno 7:
19
PROGRAMA DE MODULACIÓN DIGITAL
¡6=Aseno+2700; I6=%seno;rts;uno_8:¡6=Aseno+3300; I6=%seno;rts:
Subrutina modulación 8QAM
QAM8:
.const e=0x4000;
.constf=80;m6=f;
¡f not cejump lazo_8q;cali ieer6_bit;lazo_8q:
ax1 = dm(rx_buf + 1); { Muestra del canal Izquierdo }mx1 - dm(rx_buf + 2); { Muestra del canal derecho }
{ Generación de la forma de onda }
ar = tstbit O ofsrO;if eq jumpcaso_bO;caso_b1: ar= tstbit O of SR1;
¡f eqjump caso_b10;
caso_b11: ar=ay1;ar=ístbit O of ar;¡f eq jump caso_b110;
caso_b111: mxO = A; { muestra de sen(2*pi*f1 *t)}if mvcailfasO;myO=dm(i6,m6);mr = mxO*myO(ss); {A*sen(2*pí*f1 *t)}axO = mr1;astat=0¡jumpsalto_c2;
caso_b1 1 0: if mv cali fase_1 ;myO= dm(i6,m6);mxO=e;mr= mxO*myO(ss);axO = mr1 ;astat=0;jumpsalto_c2;
20
caso_b10:ar= tstbit O of ar;
PROGRAMA DE MODULACIÓN DIGITAL
if eq jump caso_b100;
caso_b101:¡f mvcall fase_2;myO=dm(¡6)m6);mxO=A;mr= mxO*myO(ss)¡astat=0;axO = mr1;jump salto_c2;
caso_b100:¡f mv cali fase_2;myO= dm(¡6,m6);mxO=e;mr= mxO*myO(ss);astat=0;axO = mr1 ¡
jump salto_c2;
caso_bO: ar= tstbit O of SR1;¡f eq jump caso_bOO;
caso_b01: ar=ay1;at^tstbit O of ar¡
¡f eq jump casojDOI 0;
caso_b011:¡f mvcall fase_4¡myO = dm(¡6,m6); {muestra de sen(2*pi*fl*t)}mxO = A;mr= mxO*myO(ss); {A*sen(2*pi*f1*t)}astat=0;axO = mrl;jump salto_c2;
caso_b010;if mv cali fase_4;myO=dm(¡6,m6);mxO=e;mr= mxO*myO(ss);astat=0;axO = mrl;
jump salto_c2;
caso__bOO: ar=ay1;ar= tstbit O of ar;if eq jump caso_bOOO;
caso_b001:if mvcall fase_3;myO=dm(i6,m6);mxO=A;mr= mxO*myO(ss);axO = mrl;astat=0;jump salto_c2;
21
PROGRAMA DE MODULACIÓN DIGITAL
caso_bOOO:if mv callfase_3;myO= dm(¡6,m6);mxO=e;mr = mxO*myO(ss);axO = mr1;astat=0;jump salío_c2;
Env¡o de muestras procesadas al CODEC-
salto_c2: dm(tx_buf + 1) = axO;dm(tx_buf+2) =
ar=dm(numero);af=pass ar;ax1=l2;ar=ax1-af;if ne rti;axO=0¡dm(tx_buf+ 1) = axO;dm(íx_buf + 2) = axO;
rti;
/
Ieer6_bit:axO=12;ar=axO-ayO;if eq jump peso;ar=ayO+i;ayO=ar;dm(numero)=ar;cntr=60;srO= dm(i5,m5);srl=dm(Í5,m5);
ASTAT=Ox40;rts;fase_1 ;i6=Aseno+600; I6=%seno¡rts;fase__2:i6=Aseno+1800; I6=%seno;rts;fase_3:i6=Aseno+3000; I6=%seno;rts;fase_4:¡6=Aseno+4200; !6-%seno;rts;
22
PROGRAMA DE MODULACIÓN DIGITAL
peso:axO=l;dm(bandera)=axO;rt¡;
Finalización del CODEC y ADSP
.include<c:\adi_dsp\lab_dsp\fin.dsp>;
23
PROGRAMA DE DEMODULACIÓN DIGITAL
********** ESCUELA POLITÉCNICA NACIONAL
********** FACULATAD DE INGENIERÍA ELÉCTRICA ****************
********** SISTEMA MODSIS ****************
********** PROGRAMA DE DEMODULACIÓN ****************
Realizado por:GERARDO SALCEDO VALLEJORODRIGO VERA GONZÁLEZ
Quito, Ecuador 1999.
******** Selección de la frecuencia de muestreo del CODEC **********}
.const fs = Oxc85c; { 48000 Hz}
{ ******** Inicializacion del CODEC y ADSP **********^
.¡nclude <c:\adLdsp\Iab_dsp\inic¡o.dsp>;
Definición de constantes y variables para el programa DEMOD
.const tx_num_of_bits = 10;
.const rx_num_of_bits = 8;
.const RX_BIT_ADD = Ox0100;
.const TX_BIT_ADD = OxfeOO;
.const PERIOD = 1144;
.const TSCALE= OxSffb;
.const TCOUNT= OxSffc;
.const TPERIOD= OxSffd;
.const System_ControLReg= OxSfff;
.var código;
.var numero;
.var band__txj¡sto;
.var band_rxjísto;
.var band_rx_parada_todavia¡
.var band_rx_no_palabra;
.var band_rx_off;
.var timer_tx_ctr;
.var timer_Dc_ctr;
I PROGRAMA DE DEMODULACIÓN DIGITAL
,var usuario_Jx_buffer;.var usuario_rx_buffer;.var ínterno_íx_buffer¡.var ¡nterno_jx_buffer;.var bandera;.var b¡ts_izq j n_tx;.var bitsjzq_in_rx¡.var baud_period;.var var_10;.var banda;.varvar_20;.varvar_30;
.var/dm/c¡rc dat[600];
.var/dm/c¡rc data_demod[30];
.var/dm/c¡rc dat1[300];
.var/dm/circ datO[1200];
axO=0;dm(var_10)=axO;dm(var_20)=axO;
Rutina de enlace entre el computador y el ADSP-2181{Recepción del código}
E
dem__dat:axO=0;
dm(var_10)=axO;AR=195;DM(Baud__Per¡od) = AR;CALL InitJJART;CNTR=5100;DO aLOOP UNTIL CE;
aLOOP: NOP;CNTR=5100;DObLOOPUNTILCE;
bLOOP: NOP;
CALLTurn_RX_On;
CALLGet_Char_AXl;
ar=tstbit O of ax1;dm(0x4c)=ar;ar=tstb¡t 1 of ax1;if eq jump ponerO;axO=Ox1;dm(Ox4d)=axO;jump bít_2;
ponerO: axO=OxO;dm(Ox4d)=axO;
b¡t_2: ar=tstb¡t2ofax1;
PROGRAMA DE DEMODULACIÓN DIGITAL
if eq jurnp ponerOO;axO=Oxl;dm(Ox4e)=axO;jump bit_3;
ponerOO; axO=OxO¡dm(Ox4e)=axO;
bit_3: ar=tstbit3 of ax1;if eq jump ponerOOO;axO=Ox1;dm(Ox4f)=axO;jump uarM;
ponerOOO: axO=OxO;dm(Ox4f)=axO;
uart_1:
CALLOut_Char_AX1;
cntr=5000;do jloop until ce;jloop: nop;cntr=5000;do eloop until ce;eloop: nop;cntr=5000;do sloop until ce;sloop: nop;cali íurn_rx_off;axO=1;dm(var_10)=axO;
Rutina interna del ADSP para producir la demodulación digital
ifc=0xff;nop;
axO = b#0001000000000000; dm (Sys_CtrI_Reg) = axO;
imask =0x30;dis timer;
i7=Adata_demod;I7=%data_demod;m7=l;
.var salida_1;
.var análisis;
.varcounter;
.initcountenO;i5=Adat;I5=%dat;
PROGRAMA DE DEMODULACIÓN DIGITAL
m5=1;¡2=AdatO;I2=%dat0;m2=1;¡4=Adat1;I4=%dat1;m4=1;
ayO=OxcOOO;dm(banda)=ayO¡ayO=0;axO=0;dm(salida_1)=ax0;dm(analis¡s)=axO;dm(var_30)=axO;
{*********** Procesamiento de las muestras de entrada
espera: ¡dle; { Lazo infinito de espera de una interrupción }ar= dm(fin_band);
ar = pass ar¡if ne rts; { Si se presiona IRQE retorna al programa principal}ar=dm(salida_1);ar=pass ar;¡f nejump buffer;ar=dm(var_30);ar=pass ar;if nejump salida_100;jump espera;
salida_100:axO=0;dm(var_20)=axO;jump dem^dat;
{ Subrutina de procesamiento de muestras (salto a demodulación deseada) }
¡nput_samples; ena sec_reg¡ { Habilitación del banco de registros secundario }togglefll;
ax1 = dm(rx_buf + 1); { Muestra del canal izquierdo }ay1 = dm(rx_buf + 2); { Muestra del canal derecho }
4
PROGRAMA DE DEMODULACIÓN DIGITAL
axO=dm(Ox4c);ar= tstbitO of axO;¡f ne jump abqSq;Jumpfd8pb1200b4800;
abq8q: {1XX}axO=dm(Ox4d);ar=tstbitO of axO;¡f ne jump b8q;jump aq;
b8q; {11X}axO=dm(Qx4e);ar= tstbit O of axO;¡f ne jump demqamS; {111}jump dembpsk; {110}
aq:{10X}axO=dm(Ox4e);ar= tstbit O of axO;if ne jump demqpsk; {101}jump demask; {100}
fd8pb1200b4800: {OXX}axO=dm(Ox4d);ar= tstbit O of axO;¡f ne jumpfSp;jump db1200b4800; {OOx}
f8p: {01X}axO=dm(Ox4e);ar= tstbit O of axO;¡f ne jump dempskS; {011}jumpdemfsk; {010}
db1200b4800:axO=dm(Ox4e);ar= tstbit O of axO;¡f ne jump demdpsk; {001}jumpb1200b4800; {000}
b1200b4800:
axO=dm(Ox4f);ar= tstbít O of axO;if ne jump dembpsk4800; {0001}jump dembpskl 200; {0000}
*************** 0,,K,-, ,+rnr, HQn-i/-irlnli^i^n ACl/" ****************•>Subrutina demodulación ASK
PROGRAMA DE DEMODULACIÓN DIGITAL
{Almacenamiento de datos en un bufferde 600 localidades}
demask:
ar=dm(analisis);ar=pass ar;¡f eq jump reto;axO=Ox0257;ar=axO-ayO;if eq jump salir;ar=ayO+1;ayO=ar;reto:axO=Ox0400;ar=ay1-axO;if gtjump lazcM;an=axO+ay1;if Itjump lazcM;ar=dm(analisis);ar=pass ar;if eq jump tiempo;axO=0;dm(¡5,m5)=axO;jump envió;lazo_1:axO=l;dm(i5,m5)=axO;dm(analisis)=axO;jump envió;
{*************** Subrutina demodulación FSK ****************}{Almacenamiento de datos en un bufferde 600 localidades}
demfsk:
ar=dm(analisis);ar=pass ar;¡f eq jump reto_2;axO=Ox0257;ar=axO-ayO;if eq jump salir;ar=ayO+l;ayO=ar;jump ru¡do_2;reto_2:axO=Ox700;jump uno_2;ruido_2:axO=0;uno_2:ar=ay1-axO;if gtjump lazo_12;
PROGRAMA DE DEMODULACIÓN DIGITAL
ar=axQ+ay1;¡f ítjump lazo_22;jump tiempo;lazo_12:axO=1;dm(¡5,m5)=axO¡dm(analísis)=ax0;jump envío;lazo_22:axO=0;dm(¡5,m5)=axO;axO=1¡dm(analis¡s)=axO;jump envío;
{*************** Subrutina demodulación BPSK ****************}{Almacenamiento de datos en un bufferde 600 localidades)
dembpsk:
ar=dm(analisis);ar=pass ar;¡f eq jump reto_3¡axO=Ox0257;ar=axO-ayO;if eq jump salir;ar=ayO+i;ayO=ar;jump ruido_3;reto_3:axO=Ox0800;jump uno;ruido_3:axO=0;uno:ar=ay1~axO;if ge jump lazo_13;ar=axO+ay1;if ítjump lazo_23;jump tiempo;lazo_13:axO=1;dm(i5,m5)=axO;dm(analisis)=ax0;jump envió;lazo_23:axO=0;dm(¡5,m5)~axO;axO=1;dm(analisis)=axO;jump envío;
PROGRAMA DE DEMODULACIÓN DIGITAL
**m, Subrutina demodulación BPSK1200 ****************}(Almacenamiento de datos en un bufferde 1200 localidades}
dembpsk1200:
ar=dm(analisis);ar=pass ar;if eq jump reto_0;axO=Ox04af;ar=axO-ayO;if eq jump salir;an=ayO+1;ayO=ar;jump ruido_0;reto_0:axO=Ox0800;jump unoJD;ruidoJD:axO=0;uno_0:ar=ay1-axO¡if ge jumplazo_10;ar=axO+ay1;if Itjump lazo_20;jump tiempo;lazojIO:axO=1;dm(¡2,m2)=axO;dm(analisis)=axO;jump envió;!azo_20:axO=0¡dm(i2,m2)=axO;axO=1;dm(analisis)=axO;jump envió;
{*************** Subrutina demodulación BPSK4800 ****************}{Almacenamiento de datos en un bufferde 300 localidades}
dembpsk48QO:
ar=dm(analisis);ar=pass ar;if eq jump reto_8;axO=Ox012b;ar=axO-ayO;if eq jump salir;
PROGRAMA DE DEMODULACIÓN DIGITAL
ar=ayO+1;ayO=ar;jump ruido_8;reto_8:axO=Ox0800;jump uno_8;ruido_8:axO=0;uno_8:ar=ay1-3xO;¡f ge jump Iazo_18;ar=axO+ay1;¡f Itjump lazo_28;jump tiempo;!szo_18:axO=1;dm(¡4,m4)=axO;dm(analisis)=axO;jump envió;lazo_28:3x0=0;dm(Í4Jm4)=axO;axO=1;dm(analisis)=axO;jump envío;
{*************** Subrutina demodulación DPSK ****************j{Almacenamiento de datos en un buffer de 600 localidades}
demdpsk:
ar=dm(analisis);ar=pass ar;if eq jump reto_4;axO=Ox0258;ar=axO-ayO;¡f eq jump salir;ar=ayO+1;ayO=ar;jump ruido_4;reto_4:axO=Ox0560;jump uno_4;ruido_4:3x0=0;uno_4:sr=ay1-3xO;¡f ge jump lazo_14;ar=axO+ay1;if Itjump lazo_24;jump tiempo;lazo 14:
PROGRAMA DE DEMODULACIÓN DIGITAL
axO=1;dm(¡5,m5)=axO;dm(analisis)=axO;jump envió;lazo_24:axO=0;dm(i5,m5)=axO¡axO=1;dm(analisis)=axO;jump envío;
A * A A A A A A A A A A A A Subrut¡na demodulación QPSK A A A A A A A A A A A A A A A A }{Almacenamiento de datos en un buffer de 600 localidades}
demqpsk:
ar=dm(analisis);ar=pass ar;if eq jump reto_5;axO=Ox0258;ar=axO-ayO;if eq jump salir;ar=ayO+1;ayO=ar;jump ruido_5;reto_5:axO=Ox0800;jump uno_5;ruido_5:axO=0;uno_5:ar=ay1-axO;if ge jump lazo_15;ar=axO+ay1;¡f Itjump lazo_25;jump tiempo;lazo_15:axO=1;dm(¡5)m5)=axO;dm(analisis)=axO;jump envió;Iazo_25:axO=0;dm(¡5,m5)=axO;axO=1;dm(analisis)=axO;jump envió;
10
PROGRAMA DE DEMODULACIÓN DIGITAL
Subftitína demodulación 8PSK ^^*^**********j{Almacenamiento de datos en un bufferde 600 localidades}
dempskS:
ar=dm(anal¡s¡s);ar=pass ar;if eq jump reto_6;3x0=0x0258;ar=axO-ayO;if eq jump salir;ar=ayO+1;ayO=ar;jump ruido_6;reto_6:axO=Ox0800¡jump uno_6;ruido_6:axO=0;uno_6:ar=ay1~axO;¡f ge jumplazo_16;ar=axO+ay1;if Itjump lazo_26;jump tiempo;lazo_16:axO=1;dm(¡5,m5)=axO;dm(analisis)=axO;jump envío;lazo_26:axO=0;dm(¡5,m5)=axO;axO=1;dm(analisis)=axO;jump envió;
{*************** Subrutina demodulación 8QAM ****************}{Almacenamiento de datos en un bufferde 600 localidades}
demqamS:
ar=dm(analisis);ar=pass ar;if eq jump reto_7;axO=Ox0257;ar=axO-ayO;
11
PROGRAMA DE DEMODULACIÓN DIGITAL
íf eq jump salir;ar=ayO+1;ayO=ar;jump ruidoJZ;reto_7:axO=Ox900;jump unoJ7;ruidoJ7:axO=0;uno_7:ar=ay1-axO;if ge jump lazo_17¡ar=axO+ay1;if Itjump !azo_27;jump tiempo;!azo_17:
axO=Ox4000;ar=axO-ay1;¡f gtjump Iazo_1a7;
axO=3;dm(¡5,m5)=axO;axO=1;dm(anaiisis)=axO;jump envió;Iazo_1a7:axO=1;dm(¡5,m5)=axO;dm(anal¡s¡s)=axO;jump envío;
lazo_27:
axO=Ox04000;ar=axO+ay1;if gtjump Iazo_2a7;axO=3;dm(i5,m5)=3xO;axO=1;dm(analisis)=axO;jump envió;
I3zo_2a7:axO=0;dm(¡5,m5)=axO;axO=1;dm(analisís)=axO;
Env¡o de muestras procesadas al CODEC-
envio:dm(tx_buf+ 1) = ay1;
12
PROGRAMA DE DEMODULACIÓN DIGITAL
dm(tx_buf+2) = ay1;
rti;
tiempo:ar=dm(var_20);ar=pass ar;if eq rti;axO=32767;ayO=dm(banda);ar=axO-ayO;if eq jump perra;ar=ayO;ar=ar+l;dm(banda)=ar;ayO=0;
rti;
perra:axO=1;dm(var_30)=axO;
rti;
Subrutina de Relectura del código
buffen
axO=dm(Ox4c);ar= tstbit O of axO;if ne jump abq8q_1;jump fd8pb1200b480(M;
abq8q_1: {1XX}axO=dm(Ox4d);ar= tstbit O of axO;if nejump b8q_1;jump aq_1;
b8q_1: {11X}axO=dm(Ox4e);ar= tstbit O of axO;if ne jump bufqamS; {111}jump bufbpsk; {110}
aq_1: {10X}axO=dm(Ox4e);ar= tstbit O of axO;if nejump bufqpsk; {101}
13
PROGRAMA DE DEMODULACIÓN DIGITAL
jump bufask; {100}
fd8pb1200b4800_1: {OXX}axO=dm(Ox4d);ar= tstbit O of axO;if ne jumpf8p_1;jump db1200D4800J; {OOx}
f8p_1; {01X}axO=dm(Ox4e);ar= tstbit O of axO;¡f nejump bufpskS; {011}jump buffsk; {010}
db1200b4800_1:axO=dm(Ox4e);ar= tsíbit O of axO;¡f ne jump bufdpsk; {001}jump b1200b4800_1; {000}
b1200b4800_1:
axO=dm(Ox4f);ar= ístbitO of axO;¡f nejump bufbpsk4800; {0001}jump bufbpsk1200; {0000}
Rut¡na de creación de un buffer de datos ****************}
{****** Subnjtina de Creación de un buffer de datos del buffer de ASK ******}
bufask:¡5=Adat+26;llenar:m5=20;
dm(i7,m7)=axO;ar=dm(counter);ar=ar+1;dm(counter)=ar;ayO=ar;axO=30;ar=axO-ayO;if nejump llenar;axO=0;dm(counter)=axO;jump demjni;
14
PROGRAMA DE DEMODULACIÓN DIGITAL
Subrutina de Creación de un buffer de datos del buffer de FSK
buffsk:i5=Adat+12;15=0;
¡7=Adata__demod;I7=%data_demod;m7=1;
IIenar_2:m5=20;axO=dm(i5)m5);dm(¡7,m7)=axO;ar=dm(counter);ar=ar+1;dm(counter)=ar;ayO=ar;axO=30;ar=axO-ayO;if nejumpllenar_2;axO=0;dm(counter)=axO;jump demjni;
Subrutina de Creación de un buffer de datos del buffer de BPSK *******}
bufbpsk:¡5=Adat+2;15=0;m5=20;
IIenar_3:Ífc=0x0060;nop;
dm(i7,m7)=ar;ar=dm(counter);ar=ar+1;dm(counter)=ar;ayO=ar¡axO=30;ar=axO-ayO;if ne jump IIenar_3;axO=0;dm(counter)=axO;jump demjni;
{******* Subrutina de Creación de un bufferde datos del bufferde BPSK1200 *******}
15
PROGRAMA DE DEMODULACIÓN DIGITAL
bufbpsk1200:¡5=AdatO+3;15=0;m5=40;¡7=Adata_demod;I7=%data_demod;m7=1;
IIenar_0:ifc=0x0060;nop;ar=dm(i5,m5);dm(¡7)m7)=ar;ar=dm(counter);ar=ar+1;dm(counter)=ar;ayO=ar;axO=30;ar=axO-ayO;if ne jump IIenar_0;axO=0;dm(counter)=axO;jump demjni;
Subrutina de Creación de un bufferde datos del bufferde BPSK4800
bufbpsk4800:
¡5=Adat1+2;15=0;m5=10;¡7=Adata_demod;I7=%data_demod;m7=1:
l!enar_8:¡fc=0x00ff;nop;ar=dm(i5,m5);dm(i7,m7)=ar;ar=dm(counter);ar=ar+1;dm(counter)=ar¡ayO=ar;axO=30;ar=axO-ayO;if ne jump llenar_8;axO=0;dm(counter)=axO;jump demjni;
16
PROGRAMA DE DEMODULACIÓN DIGITAL
Subrutina de Creación de un buffer de datos del buffer de DPSK
bufdpsk:
axO=0;dm(data_demod)=axO;
¡5=Adat+2;¡6=Adat+22;¡7=Adata_demod+1;15=0;16=0;
ay1=0x1;
llenar_4:m5=20;ar=dm(¡5,m5);ay1=dm(¡6,m5);
ar=arXOR ay1;ar= .notar;ar= arand 1;
dm(í7,m7)=ar;ar=dm(counter);ar=ar+1;dm(counter)=ar;ayO=ar;axO=29;ar=axO-ayO;if nejump llenar_4;axO=0;dm(couníer)=axO;jump demjni;
Subrutina de Creación de un buffer de datos del buffer de QPSK *******}
bufqpsk:
i5=Adat+20;¡6=Adaí+5;15=0;16=0;m7=1;m5=40;ifc=0x00ff;nop;
llenar 5:
17
PROGRAMA DE DEMODULACIÓN DIGITAL
axO=dm(í5,m5);dm(i7,m7)=axO;axO=dm(¡6,m5);dm(¡7,m7)=axO;
ar=dm(counter);ar=ar+1;dm(counter)=aF;ayO=ar;axO=15;ar=axO-ayO;if ne jumpllenar_5;axO=0;dm(counter)=axO;jump demjni;
Subrutina de Creación de un buffer de datos del buffer de 8PSK *******}
bufpskS:
i5=Adat+30;¡6=Adat+8;¡2=Adat+4;i3=Adat+26;I5=0;16=0;12^0;13=0;
m4=1;m5=60;m2=60;
llenar_6:¡fc=0x0060;nop;axO=dm(¡5,m5);dm(¡7,m7)=axO;ar=pass axO;if eq jump caso_0;axO=dm(Í6,m5);dm(Í71m7)=axO;ar=pass axO;íf eq jump caso_10;
caso_11: (se invierte el bit de ¡3}axO=dm(i3,m2)¡ar=pass axO;if eq jump one;axO=0¡jump two;
18
PROGRAMA DE DEMODULACIÓN DIGITAL
one:axO=1;two:dm(¡7,m7)=axO;modify (¡2,m2);jump contar;
caso_10:axO=dm(¡2,m2);ar=pass axO;if eq jumpthree;axO=0;jump four;three:axO=1;four:dm(¡7,m7)=axO;modify (¡3,m2);jump contar;
casojD:axO=dm(i6,m5);dm(í7,m7)=axO;ar=pass axO;¡f eq jump caso_00;
caso_01:axO=dm(¡2,m2);dm(¡7,m7)=axO;modify (¡3,m2);jump contar;
caso_00:axO=dm(i3,m2);dm(i7,m7)=axO;modify (Í2,m2);
contar;
ar=dm(counter);ar=ar+l;dm(counter)=ar;ayO=ar;axO=10;ar=axO-ayO;if ne jump ílenar_6;axO=0;dm(counter)=axO;jump demjni;
{******* Subrutina de Creación de un bufferde datos de! bufferde 8QAM *******}
bufqamS:
i5=Adat+2;
19
PROGRAMA DE DEMODULACIÓN DIGITAL
¡6=Adat+14;i2=Adat+38;¡3=Adat+53;m7=1;m2=60;m5=60;12=0;I3=0;15=0;16=0;llenar_7:axO=dm(i5Jm5);dm(¡7,m7)=axO;axO=dm(i6,m5);dm(¡7,m7)=axO;
axO=dm(i2,m2);ay1=dm(¡3,m2);ar=axO+ay1;ay1=0x3;ar=ar-ay1;if ge jump b¡tMuno_7;axO=0;dm(¡7,m7)=axO¡jump contar_7;b¡t_uno_7:axO=1;dm(¡7,m7)=axO;
contar_7:
ar=dm(counter);ar=ar+l;dm(counter)=ar;ayO=ar;axO=10;ar=axO-ayO;if nejump llenar^?;axO=0;dm(couníer)=axO;jump demjni;
Rutina de enlace entre el computador y el ADSP-2181{transmisión de datos}
dem ¡ni;
AR=195;DM(Baud_Period) = AR;CALLIniíJJART;
20
PROGRAMA DE DEMODULACIÓN DIGITAL
CNTR = 5000;DOXLOOPUNTILCE;
XLOOP: NOP;CNTR =5000;
DOYLOOPUNTILCE;YLOOP: NOP;¡7=Adata_demod;I7=%data_demod;m7=1;
CALLTurn_RX_On;axO=0;dm(bandera)=axO;
cntr^S; { Numero de carcteres enviados a la computadora}DOMLOOP UNTIL ce;cali turn_rx_off;
CALLOut_Char_AXl;
MLOOP: NOP;
HOLA:cntr=5000;do zloop until ce;zloop: nop;cnír=5000;do ploop until ce;ploop: nop;
cali íurn_rx_off;axO=0;dm(var_10)=axO;
axO=1;dm(var_20)=axO;jump dem_dat;
• ******** Subrutína de enlace entre el computadory el ADSP-2181 **********}
init_uart:axO=0;dm(TSCALE)=axO;
axO=dm(baud_period);
dm(TCOUNT)=axO;dm(TPERIOD)=axO;
axO=1;dm(band_tx_Iisto)=axO;dm(band_rx_Í¡sto)=axO;dm(band_rx_parada_todav¡a)=axO;dm(band_rx_no_palabra)=axO;dm(band_rx_off)=axO;
setflag_out;
21
PROGRAMA DE DEMODULACIÓN DIGITAL
ifc=0x003f;nop;imask=b#010001;ena íimer;rts;
process_a_bit:
ena sec_reg;axO=dm(band_tx_Iisto);ar=pass axO;if nejump receiver;
Sección de transmisión
ayO=dm(t¡mer_tx_ctr);ar=ayO-1;dm(timer_tx_ctr)=ar;¡f nejump receiver;
sr1=dm(¡7,m7);adios_l;sr=Ishiftsr1 by-1 (h¡);dm(interno_tx_buffer)=sr1;ar=dm(var_10);ar=pass ar;ífeqjump salida;
ar=pass srO;
if ge reset flag_out;if Itsetflag_out;
salida: toggle fI1;ayO=3;dm(timer_íx_ctr)=ayO;
ayO=dm(bits_izq_in_tx);ar=ayO-1;dm(b¡ts_izq_in_tx)=ar;if gí jump receiver;
axO=1;dm(bandMtxJisto)=axO;
^Sección de Recepcion_
receiver:axO=dm (ba nd_rx_off);ar=pass axO;if ne rti;
22
PROGRAMA DE DEMODULACIÓN DIGITAL
axO=dm(band_rx_parada_todavía);ar=pass axO;¡f ne jump rx__test_ocupado;
ayO=dm(timer_rx_ctr);ar=ayO-1;dm(t¡mer_rx_ctr)=ar;¡f ne rti;
axO=1;dm(band_rx_parada_todavia)=axO;dm(band_rx_lisío)=axO;
axO=dm(ínterno_rx_buffer);dm(usuario_rx_buffer)=axO;
axO=0;dm(band_rx_no_palabra)=axO;rti;
rx_íest_ocupado:axO=dm(band_rx_listo);ar=pass axO;if eq jump rx_ocupado;
if fiagjn jump rx_exit;
axO=0;dm(band_rxj¡sto)=ax0;dm(interno_tx_buffer)=axO¡
axO=4;dm(timer_rx_ctr)=axO;
axO=rx_n u m_of_bits;d m (bitsjzqj n_rx)=axO;
rx_exit:rt¡;
oc_ocupado:ayO=dm(t¡mer_rx_ctr);ar=ayO-1;dm(t¡mer_rx_ctr)=ar;íf ne rti;
rcv:axO=3;dm(timer_rx_ctr)=axO;
ayO=RX_BITMADD;ar=dm(interno_rx_buffer);¡f noí fiagjn jump pad_zero;ar=ar+ayO;
23
PROGRAMA DE DEMODULACIÓN DIGITAL
pad_zero:sr=Ishíft arby-1 (lo);dm(interno_rx_buffer)=srO;
ayO=dm(b¡ts_izqjn_rx);ar=ayO~1;dm (bitsJzq j n_rx)=a r¡¡fgtrti;
axO=3;drn(tirrierjx_ctr)=axO;axO=0;dm(band_rx_parada_todavia)=axO;rti;
invoke_UART__transmit:axO=3;dm(t¡mer__tx_ctr)=axO;
axO =tx_n u m_of_b¡ts;dm(biís_¡zq_in_tx)=axO;sr1=0;
srO=TX_BIT_ADD;ar=dm(usuario_tx_buffer);sr=sr or Ishift ar by 1 (lo);dm(¡nterno_tx_jDuffer)=srO;
axO=0;dm(band_tx_Iisto)=axO;rts;
get_charMax1:axO=dm(band_rx_no_pa[abra);
ar=pass axO;if ne jump get_char_ax1;
ax1=dm(usuario_rx_buffer);axO=1;
dm(band_rx_no_palabra)=axO;rts;
out_char_ax1:ax0=dm(band_txj¡sto);ar^pass axO;¡f eq jump out_char_ax1;dm(usuar¡o_tx_buffer)=ax1;cali ¡nvoke_UART_transmit;
rts;
turn_rx_on:axO=0;
dm(band_rx_off)=axO;rts;