lab rs232progrmmg 10

14

Click here to load reader

Upload: francisco-gomez

Post on 26-Jun-2015

213 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 2 de 14

Nombre del Estudiante:__________________________

Código del Estudiante:______________

Comunicaciones Digitales

Programación del RS-232 para comunicación serial PARTE I: Objetivos

• La finalidad de este laboratorio es dar al estudiante una introducción a la programación del puerto serial RS-232 mediante el uso de distintos lenguajes de programación.

• Ampliar los conocimientos sobre programación en lenguaje C/C++, y Visual Basic para implementación del RS-232.

PARTE II: Equipo a utilizarse Hardware:

• 2 Computadores NEC Powermate (Aula M105).

• 1 Cable de Módem Nulo para la comunicación entre puertos seriales. Software:

• Turbo C con librerías “dos.h” y “bios.h” para comunicación por puertos .

• Microsoft Visual Basic 6.0. PARTE III: Introducción y Marco Teórico

Comunicación serial vía el puerto serial RS-232 El RS-232 es el puerto serial más conocido y usado para transmitir datos en comunicación puerto a puerto. Aunque el puerto serial es más difícil de programar que el puerto paralelo, es la forma más eficaz de implementar una transmisión de datos, ya que requiere menos alambres para la conexión reduciendo de esta forma su costo. El RS-232 es la línea de comunicación que permite la transmisión de datos usando solamente tres acoplamientos del alambre. Estos tres acoplamientos son el de transmisión, el de recepción y el de tierra común (ground).

Page 2: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 3 de 14

Las líneas de transmisión y recepción en este tipo de conexión envían y reciben datos entre las computadoras. Como el nombre lo indica, los datos se transmiten en serie. Los dos pines son TXD (Transmisión) y RXD (Recepción) . Hay otras líneas en este puerto como RTS, CTS, DSR, DTR, RTS y RI. El ‘1’ y ‘0’ son los datos que definen un nivel de voltaje de 3V a 25V y de -3V a -25V respectivamente.

Las características eléctricas del puerto serial según el estándar de la EIA (Electronics Industry Association) para el RS-232C especifican una velocidad máxima de 20.000bps, que es lento comparado a la velocidad de los puertos estándares de hoy en día. Por esta razón, hemos elegido el nuevo estándar de RS-232D, que fue lanzado recientemente.

El RS-232D existe en dos tipos distintos, el tipo D de 25 pines y tipo D de 9 pines, que son conectores machos en la parte trasera del computador. Se necesita un conector hembra en su sistema de comunicación que vaya desde anfitrión a la computadora huésped.

Las salidas de los pines del D-9 y del D-25 se muestran a continuación:

No. del pin Tipo D-9.

No. del pin. Tipo D-25

Pines de Salida

Función

3 2 RD Recibe los datos (entrada de datos seriales) 2 3 TD Transmite los datos (salida de datos seriales) 7 4 RTS Solicita permiso para enviar (reconoce si el

módem está listo para intercambiar los datos) 8 5 CTS Libre para enviar (el módem se alista para

intercambiar datos) 6 6 DSR Estado READY de los datos (el UART establece

un acoplamiento) 5 7 SG Tierra de la señal 1 8 DCD Detector de Portador(esta línea es activa cuando

el módem detecta un portador) 4 20 DTR Terminal de datos listos. 9 22 RI Indicador de Timbre (se activa cuando el

módem detecta la señal de timbre del PSTN) Definiciones UART (universal asynchronous receiver / transmitter), Se trata del chip que controla los puertos serie del ordenador. En el caso de los módems internos no tiene especial importancia, ya que suelen traer la suya, preparada para la velocidad que necesitan. Los externos, sin embargo, puesto que se conectan a uno de los puertos COM ya existentes en el ordenador, dependen de la velocidad de la UART de éste.

Page 3: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 4 de 14

Baud, por lo general, el baud rate de un módem significa que tantos bits puede enviar o recibir por segundo. Técnicamente, baud es el número de veces por segundo que la señal portadora cambia su valor - por ejemplo un módem de 1200 bits por segundo corre a 300 baud, pero mueve 4 bits por baud (4 x 300 = 1200 bits por segundo).

Sobre el DTE Y el DCE :

Los dispositivos que utilizan los cables seriales para su comunicación, están divididos en dos categorías. Estos son DCE (Equipo de comunicaciones de datos) y DTE (Equipo terminal de datos). Los Equipos de comunicaciones de datos (DCE) son dispositivos tales como el módem, adaptador de TA, impresora, etc. Mientras que los Equipos terminales de datos son la computadora o un terminal. Así, un dispositivo terminal de datos típico es una computadora y un dispositivo típico de comunicaciones de datos es un módem. La gente habla a menudo de las velocidades DTE/DCE o DCE/DCE. El DTE/DCE es la velocidad entre su módem y computadora, referidos a veces a la velocidad del terminal. Esto debe correr en velocidades más rápidas que las DCE/DCE. Las velocidades DCE/DCE es la conexión entre módems, llamados a veces la velocidad de la línea.

La mayoría de la gente tiene hoy módems de 28.8K o 33.6K. Por lo tanto, debemos esperar que la velocidad DCE/DCE sea de 28.8K o 33.6K. En vista de la alta velocidad del módem debemos esperar que la velocidad DTE/DCE esté alrededor de 115.200 bps (Velocidad Máxima del 16550a UART). El programa de comunicación a implementarse tiene configuraciones para la velocidad DCE/DTE.

Si estuviésemos transfiriendo un archivo de texto a 28.8K (DCE/DCE), el módem comprime el archivo que se está transfiriendo realmente a 115,2 K entre las computadoras y así la velocidad DCE/ DTE es también de 115,2 K. Se concluye así que la razón DCE/DTE debe ser mucho mayor que la velocidad de conexión del módem. Por lo tanto, si nuestra velocidad DTE/DCE es varias veces más rápidamente que la DCE/DCE la computadora puede enviar datos a su módem en 115.200 bps. ¿Qué es MÓDEM NULO? El módem nulo se utiliza para conectar dos DTE’s juntos. Esto se utiliza para transferir archivos entre las computadoras usando protocolos como el Zmodem, Xmodem, etc.

Page 4: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 5 de 14

Figura: Conexiones del módem nulo usando el conector de RS-232D

La figura anterior muestra la forma de conectar el cableado del módem nulo. Las

computadoras huésped e invitada se conectan a través de los pines de TD, RD, y SG. Cualquier dato que se transmita a través de línea TD desde el anfitrión al huésped se recibe por la línea RD. La computadora huésped debe tener la misma disposición de pines que el anfitrión. La línea de tierra de la señal (SG) de las ambas debe ser puesta en cortocircuito de modo que los argumentos sean comunes para cada computadora.

El Data Terminal Ready (DTR) se conecta al Data Set Ready (DSR) y al Carrier Detect (CD) en ambas computadoras. Cuando el DTR se activa afirmativamente, el Data Set Ready y Carrier Detect inmediatamente se activan. En este punto, la computadora piensa que el módem virtual con el cual está conectado está listo y ha detectado el portador del otro módem.

Toda nuestra atención ahora se concentra en el Request to Send y el Clear to Send. Como ambas computadoras se comunican a la misma velocidad, el control de flujo no es necesario estas ya que estas dos líneas están unidas en la computadora. Cuando la computadora desea enviar datos, da a Request to Send un valor alto y a la vez activa el Clear to Send, inmediatamente recibe una contestación afirmativa y se produce al transmisión.

El indicador de timbre se utiliza solamente para decir a la computadora que hay un timbre en la línea telefónica. Puesto que no usaremos esta opción, esto queda desconectado. IIIa) ¿Cómo programar el puerto serial usando lenguaje C/C++ ? Hay dos métodos populares para enviar datos a/o desde un puerto serial usando Turbo C. Uno es utilizando el outportb(PORT_ID, DATA) o el outport(PORT_ID, DATA) definido en la librería “dos.h”. Otro método es utilizando la función bioscom() definida en “bios.h”.

Uso del outportb()

Page 5: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 6 de 14

El outportb de la función () envía un byte al puerto ‘PORT_ID’. El outport() de la función envía una palabra. Estas funciones se pueden utilizarse para cualquier puerto incluyendo el puerto serial o puertos paralelos. De igual manera para recibir se usa lo siguiente:

inport Lee una palabra de un puerto de hardware

inportb Lee un byte de un puerto de hardware

outport Envía una palabra a un puerto de hardware

outportb Envía un byte a un puerto de hardware

Declaración:

int inport(int portid); unsigned char inportb(int portid); void outport(int portid, int value); void outportb(int portid, unsigned char value);

Observaciones:

inport Trabaja justo como la instrucción 80x86 IN. Lee el valor bajo de una palabra del portid, y el alto desde el portid + 2.

inportb Es un macro que lee un byte

outport Trabaja justo como la instrucción 80x86 OUT. Escribe el valor bajo del byte en portid, y el alto en portid + 1.

outportb Es un macro que escribe el valor del arumento.

portid: Inport- Puerto del cual inport e inportb leen. Outport- Puerto donde outport y outportb escriben. value: Palabra que outport escribe a portid; Byte que outport escribe a portid;

Si se llama a inportb o outportb cuando se ha incluido “dos.h”, son tratados como macros que amplían al código. Si usted no incluye “dos.h”, o si usted incluye dos.h y #undef macro(s), usted consigue las funciones del mismo nombre. Valor de retorno:

• inport y inportb devuelven el valor leído. • outport y outportb no retornan ningún valor.

Uso el bioscom

Page 6: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 7 de 14

El bioscom() y el _bios_serialcom() se utilizan en la comunicación serial usando el conector RS-232. Declaración:

• bioscom(int cmd, char abyte, int port) • _bios_serialcom(int cmd, int port, chat abyte)

Tanto bioscom() y _bios_serialcom() utilizan la interrupción 0x14 del bios para realizar varias comunicaciones sobre los puertos I/O .

cmd: La operación I/O que se realizará.

cmd (bioscom) cmd(_bios_serialcom) Acción

0 _ COM_INIT Inicializa los parámetros del puerto

1 _ COM_SEND Envía el carácter al puerto

2 _ COM_RECEIVE Recibe el carácter del puerto 3 _ COM_STATUS Vuelve al estado actual del

puerto de comunicación portid: Puerto al cual los datos son enviados o del cual los datos son extraídos.

0: COM1 1: COM2 2: COM3

abyte: Cuando cmd = 2 ó 3 (_ COM_SEND ó _ COM_RECEIVE) el parámetro abyte es ignorado. Cuando el cmd = 0 (_ COM_INIT), abyte es una combinación OR de los siguientes bits (uno de cada grupo):

Page 7: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 8 de 14

Por ejemplo, si

abyte = 0x8B = (0x80|0x08|0x00|0x03) = (_ COM_1200|_ COM_ODDPARITY|_ COM_STOP1|_ COM_CHR8)

el puerto de comunicaciones se fija a:

• 1200 baudios (0x80 = _ COM_1200) • Paridad impar (0x08 = _ COM_ODDPARITY) • 1 bit de parada (0x00 = _ COM_STOP1) • Datos de 8 bits (0x03 = _ COM_CHR8)

Para inicializar el puerto con los ajustes antedichos tenemos que escribir: bioscom(0, 0x8B, 0)

Para enviar datos a COM1, el formato de la función será bioscom(1, datos, 0). De forma similar bioscom(1, 0, 0) leerá un byte desde el puerto. El ejemplo siguiente ilustra cómo los programas de puerto serial funcionan. Cuando un dato está disponible en el puerto, este se ingresa y se muestra sobre la pantalla y su una tecla es presionada, el valor ASCII será enviado al puerto. #include <bios.h> //Librería que contiene al bioscom #include <conio.h> //Librería que contiene las funciones de ingreso y salida de datos del usuario. #define COM1 0 //Da a COM1 un valor de 0 #define DATA_READY 0x100 //Da a DATA_READY un valor de 0x100

Valor del abyte bioscom _ bios_serialcom

Significado

0x02 0x03

_ COM_CHR7 _ COM_CHR8

Datos de 7 bits Datos de 8 bits

0x00 0x04

_ COM_STOP1 _ COM_STOP2

1 bit de parada 2 bits de parada

0x00 0x08 0X10

_ COM_NOPARITY _COM_ODDPARITY _ COM_EVENPARITY

Ninguna paridad Paridad impar

Paridad uniforme

0x00 0x20 0x40 0x60 0x80 0xA0 0xC0 0xE0

_ COM_110 _ COM_150 _ COM_300 _ COM_600 _ COM_1200 _ COM_2400 _ COM_4800 _ COM_9600

110 baud 150 baud 300 baud 600 baud 1200 baud 2400 baud 4800 baud 9600 baud

Page 8: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 9 de 14

#define SETTINGS (0x80|0x02|0x00|0x00) //Da a SETTINGS características señaladas en la parte anterior al código. int main(void) //Empieza el programa { int in, out, status; //Define 3 variables de tipo entero bioscom(0, SETTINGS, COM1); //Inicializa parámetros del puerto cprintf("Datos a enviar: "); //Imprime el mensaje entre paréntesis while (1) //Inicia un lazo infinito { status = bioscom(3, 0, COM1); //Vuelve al estado inicial del puerto if (status & DATA_READY) //Si el Puerto está listo if ((out = bioscom(2, 0, COM1) & 0x7F) != 0) //Si recibe un putch(out); caracter lo

imprime

if (kbhit()) //Si se ingreso un caractér { if ((in = getch()) == 27) //A la variable in se le asigna break; un valor ASCII, y si este es

el ESC sale del lazo y del programa bioscom(1, in, COM1); //Envia la información en in

} } return 0; }

Cuando se compila y corre el programa en ambas las computadoras, los caracteres mecanografiados en una computadora deberán aparecer en la pantalla de la otra computadora y viceversa.

Para comprobarlo, se puede utilizar la conexión loop-back como se muestra. Aquí, los datos se transmiten a sí mismo. La conexión del enchufe del loop-back es como sigue.

Fig 2. Conexión del loop-back

Si se corre el programa anterior con la conexión como en este diagrama, el carácter incorporado al teclado se debe exhibir en la pantalla. Este método es provechoso en programa del puerto serial de la escritura con la sola computadora.

Page 9: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 10 de 14

IIIb) ¿Cómo programar en Visual Basic 6.0?

El Controlador MSComm permite realizar comunicaciones seriales para aplicaciones específicas, permitiendo la recepción y transmisión de datos desde el puerto serial.

Sintáxis del MSComm

Notas

El controlador MSComm permite el manejo de las dos siguientes formas de comunicación:

• Comunicacion Event-driven -Es un método muy poderoso para el manejo de las interacciones de un puerto serial. En muchas situaciones uno quiere ser notificado el momento que un evento tiene lugar, tal como cuando un carácter llega o un cambio ocurrido en las líneas Carrier Detect (CD) o Request To Send (RTS). En tales casos, se usa la opción OnComm del MSComm para captar y manejar estos eventos durante la comunicación. La opción OnComm tambien detecta y maneja errores en la comunicación. Para una lista de los posibles eventos y errores que puede detectar se debe buscar en la ayuda de VB 6.0 sobre las propiedades del CommEvent.

• También se puede elegir los eventos y errores de acuerdo al valor de CommEvent luego de cada función critica del programa. Esto puede ser preferible si la aplicación a realizarse es pequeña y auto sustentable. Por ejemplo, si se está escribiendo un marcador simple de teléfono, puede no tener sentido generar un evento luego de recibir cada caracter, porque los únicos caracteres que se planea recibir son las respuestas correctas del modem.

Cada MSComm que se usa corresponde a un puerto serial distinto. Si uno necesita acceso a más de un Puerto serial en una aplicación, se debe usar más de un controlador MSComm. Además el MSComm tiene muchas propiedades importantes, las que deben ser más familiares para nuestro propósito deben ser:

Propiedades Descripcion

CommPort Configura y retorna el número del puerto de comunicación.

Settings Configura y retorna el índice de baud, paridad, número de bits, y bits de parada como una cadena.

PortOpen Configura y retorna el estado del Puerto de comunicación. También cierra y abre el puerto.

Input Retorna y remueve caracteres del buffer de recepción.

Page 10: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 11 de 14

Output Escribe una cadena de caracteres para el buffer de transmisión.

Ejemplo del MSComm

El siguiente ejemplo muestra comunicación serial simple usando el MODEM:

Private Sub Form_Load () ' Crea un string Dim Instring As String ‘ Usa COM1 MSComm1.CommPort = 1 ‘9600 baud, sin paridad, 8 datos y 1 bit de parada. MSComm1.Settings = “9600,N,8,1” ‘Lee todo el buffer cuando la entrada está en uso MSComm1.InputLen = 0 ‘Abre el puerto MSComm1.PortOpren = True ‘Manda el mensaje de atención al MODEM. MSComm1.Output = “ATV1Q0” & Chr$(13) ‘Asegura que el modem responde OK ‘Espera que los datos retornen al Puerto Serial Do DoEvents Buffer$ = Buffer$ & MSComm1.Input Loop Until InStr(Buffer$, “OK” & vbCRLF) ‘Lee el “OK” en el Puerto y cierra el Puerto MSComm2.PortOpen = false End Sub

PARTE IV: Procedimiento Programación en C/C++

Para la parte práctica en lenguaje C/C++, nuestro objetivo será implementar el programa que aparece como ejemplo de la parte IIIa para comprobar su funcionamiento, para esto:

1. Se ingresa al programa Turbo C 3.0 e inmediatamente se ingresa a la página de escritura de código.

2. Escribimos el programa citado en la parte IIIa en la página de código. 3. Una vez que haya sido terminado, se escoge la opción Build All en el menú de

Compile. 4. Una vez realizada esta operación, se procede a correr el programa en la opción

Run. 5. El programa debe estar corriendo en ambas máquinas para poder ser visualizado

correctamente. Programación en Visual Basic 6.0

Page 11: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 12 de 14

Para la parte de Visual Basic, implementaremos un programa que funcione como un

chat, donde el usuario 1 pueda escoger el puerto por el que va a trabajar y se conecte al mismo a través de un botón, de igual manera puede finalizar la conexión en cualquier momento por medio de otro botón. El programa también debe contar con una venta de texto que permita registrar la conversación entre ambas computadoras, para escribir los mensajes que se enviarán debe haber una línea de texto donde se pueda realizar esta acción. El código para realizar este programa (sugerido) junto con la interfaz gráfica es:

El código es: Dim Cadena As String Private Sub Salir_Click() End End Sub Private Sub Conectar_Click() 'Comprueba que el puerto este cerrado para poder abrirlo If MSComm1.PortOpen = False Then 'Determina el puerto que hemos seleccionado If Combo1.ListIndex = 0 Then MSComm1.CommPort = 1 Else MSComm1.CommPort = 2 End If 'Determina: 9600-Velocidad en Baudios, N-No utiliza ninguna paridad, '8-Cantidad de bits de envio y recepcion por paquete, '1-Determina los bits de parada MSComm1.Settings = "9600,N,8,1" 'Lee todo el buffer de entrada para que quede vacio MSComm1.InputLen = 0

Page 12: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 13 de 14

'Abre el puerto seleccionado MSComm1.PortOpen = True Form1.Caption = "Conectado por el puerto " & MSComm1.CommPort End If End Sub Private Sub Desconectar_Click() If MSComm1.PortOpen Then 'Cierra el puerto MSComm1.PortOpen = False Form1.Caption = "Desconectado" End If End Sub Private Sub Enviar_Click() 'Envia el texto escrito. MSComm1.Output = TextoEnviar.Text & vbCr 'Coloca el texto que enviamos en la pantalla Texto.Text = Texto.Text & vbCrLf & "<Ordenador 1>" & TextoEnviar.Text TextoEnviar.SetFocus End Sub Private Sub Form_Load() Combo1.AddItem "COM 1" Combo1.AddItem "COM 2" Combo1.ListIndex = 0 End Sub Private Sub Form_Unload(Cancel As Integer) Desconectar_Click End Sub 'El evento OnComm se genera siempre que cambia el valor de la propiedad 'CommEvent e indica que se ha producido un evento o un error en la comunicación. Private Sub MSComm1_OnComm() Dim i As Integer Dim Valor As String 'recoge el valor de entrada Valor = MSComm1.Input 'busca la posicion del caracter de salto de linea i = InStr(Valor, Chr(13)) 'si no hay ningún salto de línea, quiere decir que la información que recibe 'es parte de una cadena recibida con anterioridad. If i = 0 Then Cadena = Cadena & Valor Else Cadena = Cadena & Left(Valor, i - 1) Texto.Text = Texto.Text & vbCrLf & "<Ordenador 2>" & Cadena Texto.SelStart = Len(Texto.Text)

Page 13: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 14 de 14

Cadena = "" End If End Sub Private Sub TextoEnviar_KeyPress(KeyAscii As Integer) 'Si se da un ENTER en la caja de texto es equivalente a haber 'hecho un click sobre el botón de enviar If KeyPress = 13 Then Enviar.Value = True End If End Sub El proceso que hay que seguir es el siguiente:

1. Abrir Microsoft Visual Basic 6.0. 2. Crear un nuevo archivo del tipo STANDARD EXE. 3. En la barra de herramientas, se hace un clic derecho sobre este y aparece una opción

llamada componentes donde ingresaremos la opción Microsoft Comm Control 6.0:

Page 14: Lab Rs232progrmmg 10

Ingeniería Electrónica y Telecomunicaciones, USFQ

Versión 1.0 (11/09/2005) Comunicaciones II 15 de 14

Está opción debe adherirse a nuestro form para tener ya dentro de este el MSComm. De acuerdo a los nombres que se hayan asignado a cada una de los objetos dentro del form, la programación debe seguir la misma lógica del código presentado. De igual forma que en el caso anterior el programa debe estar corriendo en ambas computadoras para poder tener una ejecución de forma correcta.

PARTE VI: Preguntas

1. En el programa realizado en C/C++ se obtuvo una aplicación que permitía enviar instantáneamente un carácter de un terminal a otro. Siguiendo la lógica del programa realizado en Visual Basic cree un código en C/C++ que permita implementar una venta de chat donde cada usuario deba decidir cuando enviar su cadena de bits.

2. En el programa realizado en Visual Basic se creo una aplicación que permitía crear un chat entre dos terminales. Usando la lógica del programa en C/C++ cree una aplicación que envíe datos inmediatamente se registren en la pantalla de cada uno de los terminales.

3. Investigue sobre comunicación por puerto serial utilizando MATLAB, e implemente un programa sencillo.

4. Investigue como se puede codificar el puerto serial utilizando otros lenguajes de programación (2 mínimo) e indique la forma de declaración e implementación.

5. Averigüe las propiedades de los protocolos Xmodem y Zmodem. 6. Escriba las propiedades de tres tipos de RS-232 (i.e. RS-232C, RS-232D,etc) y

las características de cada uno de estos.