escuela politÉcnica nacional facultad de ingenierÍa...

72
I ESCUELA POLITÉCNICA NACIONAL FACULTAD DE INGENIERÍA ELÉCTRICA TESIS DE GRADO 'DISEÑO Y CONSTRUCCIÓN DE UN SISTEMA DE MODULACIÓ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 VALLEJO RODRIGO MIGUEL VERA GONZÁLEZ I 1999

Upload: others

Post on 23-Apr-2020

16 views

Category:

Documents


0 download

TRANSCRIPT

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

I

I

II

IIII

I

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;

PROGRAMA DE DEMODULACIÓN DIGITAL

turn_rx_off:axO=1;

dm(band_rx_off)=axO;rts;

salir:axO=1;dm(salida_1)=ax0;axO=0;dm(analisis)=axO;rti;irqe: axO=1;

dm(fin_band) = axO;rti;

******** Finalización del CODEC y ADSP

.include <c:\ad¡_dsp\Iab_dsp\fin.dsp>;

25