Top Banner
PROYECTO 1 http://www.desarrollopic.com/tutoriales/proyecto-usb- con-pic-winp/ PICtool v1.0 06/04/2011 !era nuestro primer proyecto para comunicaci"n #!$ %.&' utili(ando como inter)a( al P*C1+,% &' est dise ado para correr ba0o indows 2P e in)eriores' tendr la )inalidad de introducirnos en el tema 34plicaciones #!$3 y 5ue a 6eces no sabemos c"mo abordar' pues a pesar de tanta in)ormaci"n es di)7cil encontrar al8o certero para eplorar el tema' espero mis ami8os les sea de ayuda' como lo )ue para m7 en su momento' no ol6iden pre8untar o hacerme lle8ar sus comentarios pues solo as7 aprendemos todos. Este sencillo proyecto est dise ado para recibir datos del puerto #!$ del PC' mediante los cuales estaremos conmutando 9 salidas l"8icas en 9 pines del P*C' el dato 5ue estaremos recibiendo es un pa5uete de % bytes' uno correspondiente al modo y otro al n mero de led a conmutar' es decir: 1er byte' !i modo ; 3&3 entonces entra a modo <E= %do byte' !i dato ; 31 " % " > " 93' conmutar <E= correspondiente <a idea central de )uncionamiento es la si8uiente: PC ?---@ =R*AER 2P ?---@ P*C1+,% & Por tal moti6o los > elementos deben re8irse por dos c"di8os importantes para 5ue eista comunicaci"n y reconocimiento entre ellos: Product *= y Aendor *=. Aendor *=: Este c"di8o es la )irma de al8una empresa para utili(ar la comunicaci"n #!$' y BO debe ser cambiada. icrochip; &9=+. Product *=: Este c"di8o puede ser modi)icado por el usuario' para personali(ar al8 n circuito en particular. El proyecto P*Ctool 61.& )ue desarrollado en 9 pasos importantes: 1.-=ia8rama Electr"nico DE4 <EF %.-Edicion de C"di8o P*C1+,% & DCC!F >.-Edicion de =ri6er indows 2P D$loc de notasF 9.-Edicion de *nter)a( r )ica DAisual CGF 4 continuaci"n iremos eplicando cada paso:
21

Proyectos Pic y Usb

Oct 06, 2015

Download

Documents

Horacio Bostico

proyecto de comunicacion de controladores pic por usb
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript

PROYECTO 1http://www.desarrollopic.com/tutoriales/proyecto-usb-con-pic-winxp/

PICtool v1.006/04/2011Sera nuestro primer proyecto para comunicacin USB 2.0, utilizando como interfaz al PIC18F2550, est diseado para correr bajo Windows XP e inferiores, tendr la finalidad de introducirnos en el tema "Aplicaciones USB" y que a veces no sabemos cmo abordar, pues a pesar de tanta informacin es difcil encontrar algo certero para explorar el tema, espero mis amigos les sea de ayuda, como lo fue para m en su momento, no olviden preguntar o hacerme llegar sus comentarios pues solo as aprendemos todos.Este sencillo proyecto est diseado para recibir datos del puerto USB del PC, mediante los cuales estaremos conmutando 4 salidas lgicas en 4 pines del PIC, el dato que estaremos recibiendo es un paquete de 2 bytes, uno correspondiente al modo y otro al nmero de led a conmutar, es decir:1er byte, Si modo = "0" entonces entra a modo LED2do byte, Si dato = "1 2 3 4", conmutar LED correspondienteLa idea central de funcionamiento es la siguiente:PC DRIVER XP PIC18F2550Por tal motivo los 3 elementos deben regirse por dos cdigos importantes para que exista comunicacin y reconocimiento entre ellos: Product ID y Vendor ID.Vendor ID: Este cdigo es la firma de alguna empresa para utilizar la comunicacin USB, y NO debe ser cambiada. Microchip= 04D8.Product ID: Este cdigo puede ser modificado por el usuario, para personalizar algn circuito en particular.El proyecto PICtool v1.0 fue desarrollado en 4 pasos importantes:1.-Diagrama Electrnico (EAGLE)2.-Edicion de Cdigo PIC18F2550 (CCS)3.-Edicion de Driver Windows XP (Bloc de notas)4.-Edicion de Interfaz Grfica (Visual C#)A continuacin iremos explicando cada paso:Paso 1Utilizaremos un diagrama sencillo que sea fcil de armar en protoboard, manejaremos pocos componentes, no es necesario llegar hasta el diseo en PCB, pues ms adelante con nuevos proyectos iremos aadiendo ms componentes; por ende recomiendo que el armado se quede en protoboard por ahora.Aremos uso del software EAGLE 1.10.0 para disear el esquemtico de nuestro circuito en cuestin.Los materiales necesarios son:1-Protoboard1-PIC18F25501-Conector USB tipo B1-Capacitor cermico 470nF1-Capacitor cermico 100nF2-Capacitores cermicos 22pF1-Cristal 12MHz1-Resistor 10K4-Resitores 3304-Leds 3mm*Cable, pinzas etc.Ver figura 1, correspondiente al diagrama electrnico:

Figura 1

Figura 2Las caractersticas generales son:-Utiliza un cristal de 12MHz-Un capacitor de 100nF para evitar ruido-Un capacitor de 470nF necesario en el pin Vusb-Y las conexiones correspondientes a las 4 salidas lgicas, ver figura 2:LED1= PORTC.1LED2= PORTC.2LED3= PORTC.6LED4= PORTC.7Para ir relacionando los pines del micro a lo mencionado ver figura 3.

Figura 3Despus de haber aplicado el diagrama anterior, el armado del circuito en la protoboard debera verse similar a la figura 4.

Figura 4Paso 2Para la edicin del cdigo a implementar al PIC18F2550 se utilizara el compilador PIC C Compiler CCS, para trminos generales ser editado en "cdigo C", para ello utilizaremos 4 libreras propias al compilador:pic18f2550.h= Librera para utilizar dicho dispositivo con todas sus caractersticas en hardware. Propia del compilador y no debe modificarse.pic18_usb.h= Librera correspondiente al uso de la comunicacin USB para PIC18. Propia del compilador y no debe modificarse.usb.c= Librera para uso estndar de comunicacin USB. Propia del compilador y no debe modificarse.descriptor_USB.h= Librera que contiene la configuracin y descripcin general del dispositivo a conectar. Librera de ejemplo que fue modificada para utilizar con este proyecto en particular, ubicada en la carpeta de samples del compilador con el nombre de "usb_desc_scope.h", son 2 las partes modificadas (ver figura 5):1-Vendor ID, VID= 04D8, cdigo correspondiente a la firma de Microchip para utilizar comunicacin USB.2.-Product ID, PID= 0090, cdigo cualquiera, escogido para este proyecto en particular y que debe ser igual al de la Interfaz y Driver.*Por lo tanto PIC, Driver e Interfaz deben tener el mismo VID y PID.

Figura 5Retomando, la funcin principal del PIC es leer los dos bytes enviados desde el PC, en donde el 1er byte corresponde al modo y el 2do al nmero de led, entonces:-El primer byte enviado corresponde al modoMODO = 0x00, 1er byte-El segundo byte corresponde al nmero de LED y pude ser cualquiera de los cdigos siguientes:LED1 = 0x01, 2do byteLED2 = 0x02, 2do byteLED3 = 0x03, 2do byteLED4 = 0x04, 2do byteApagar LED's = 0x05, 2do byteEl cdigo C bsico para la conmutacin de dichos leds es el siguiente:>>>----------------------------------------------------------------------------------if(modo==0) //El 1er byte corresponde al modo LED?{switch(dato) // 2do byte para el led correspondiente{case 1:{output_toggle(LED1); break;}case 2:{output_toggle(LED2); break;}case 3:{output_toggle(LED3); break;}case 4:{output_toggle(LED4); break;}case 5:{LED_OFF(LED1); LED_OFF(LED2); LED_OFF(LED3); LED_OFF(LED4); break;} }}-----------------------------------------------------------------------------------output_toggle--->PORTC.1= 0El cdigo completo se muestra a continuacin:>>>--------------------------------------------------------------------------------------#include #fusesHSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN#use delay(clock=48000000)#define USB_HID_DEVICE FALSE#define USB_EP1_RX_ENABLE USB_ENABLE_BULK#define USB_EP1_RX_SIZE 2#include #include "descriptor_USB.h"#include #define LED1 PIN_C1#define LED2 PIN_C2#define LED3 PIN_C6#define LED4 PIN_C7#define LED_ON output_high#define LED_OFF output_low#define modo datain[0]#define dato datain[1]void main(void){ int8 datain[2]; LED_OFF(LED1); LED_OFF(LED2); LED_OFF(LED3); LED_OFF(LED4); LED_ON(LED1); LED_ON(LED4); usb_init(); usb_task(); usb_wait_for_enumeration(); LED_OFF(LED1); LED_OFF(LED4); LED_ON(LED2); LED_ON(LED3); delay_ms(1000); LED_OFF(LED2); LED_OFF(LED3); while (TRUE) { if(usb_enumerated()) { if (usb_kbhit(1)) { usb_get_packet(1, datain, 2); if (modo==0) { switch(dato) { case 1: {output_toggle(LED1); break;} case 2: {output_toggle(LED2); break;} case 3: {output_toggle(LED3); break;} case 4: {output_toggle(LED4); break;} case 5: {LED_OFF(LED1); LED_OFF(LED2); LED_OFF(LED3); LED_OFF(LED4); break;} } } } } }}----------------------------------------------------------------------------------->>>*Ms adelante se proporcionaran todos los archivos relacionados a este proyecto: estn comentados.Compilando (CCS)el cdigo anterior se genera nuestro valioso .HEX, que podremos cargar a nuestro PIC18F2550 con cualquier programador.Paso 3Microchip proporciona un DRIVER que corre bajo Windows XP, para comunicacin USB para la familia PIC18, el cual puede descargarse desde su sitio web.El nombre delDriver es MCHPUSB, y est compuesto por 5 elementos:1.-Ioctls.h2.-mchpusb.cat3.-mchpusb.inf4.-mchpusb.sys5.-mchpusb64.sysEn nuestro caso nos interesa solo en"mchpusb.inf",se trata del archivo a modificar pues contiene los cdigosVID y PIDque necesitamos configurar.De los 4 pasos este es el ms fcil, pues solo necesitamos modificar el cdigo PRODUCT ID = PID, el valor para dicho cdigo ser0090, el cdigo VID no ser necesario cambiarlo, pues es la firma de Microchip para el uso de comunicaciones USB, el cual corresponde a04D8, ya est escrito por defecto en el INF.En la Figura 6 puede verse la seccin a editar.

Figura 6Una vez editada esta parte nuestro Driver estara listo para interactuar entre el PIC18F2550 y la Interfaz de Visual C#.Desde este punto si ya tenemos el hardware armado con el PIC programado; ya podemos conectar el circuito a la pc e instalar el driver anteriormente editado.Al conectar por primera vez el PICtool v1.0 nos aparece una ventana solicitando el driver, direccionamos manualmente hasta donde se encuentra nuestro "Driver_PICtool", ver figura 7.

Figura 7Aceptamos y esperamos a que se instale el driver, durante el proceso encendern los leds 1 y 4, al completar la instalacin encendern los leds 2 y 3; durante un segundo y finalmente se apagaran. Al final de la instalacinveremos en el pc una ventana como en la figura 8.

Figura 8Ahora nuestro hardware y driver estn listos, pero aun no harn nada, pues hace falta la interfaz grfica para mandar los dos bytes que necesita el hardware para conmutar las 4 salidas lgicas.Paso 4Editaremos una interfaz grafa sencilla utilizando el software Visual C# 2005, a travs de esta controlaremos las 4 salidas lgicas en nuestro hardware, haremos uso de 5 botones; 4 correspondientes a las salidas lgicas y el 5to para poner a "cero" todas las salidas, entonces:Boton1= LED1, salida 1Boton2= LED2, salida 2Boton3= LED3, salida 3Boton4= LED4, salida 4Boton5= Poner a cero todoUna vez que sabemos lo que necesitamos para nuestra interfaz; para interactuar con el hardware, pasamos a un elemento importante, necesitamos un archivo .DLL para extraer parmetros de control para la comunicacin USB, podremos aadir los cdigos VID y PID y as asociar nuestros 3 elementos: PIC, DRIVER e INTERFAZ.El elemento .DLL es indispensable, y tambin nos lo proporciona Microchip, el "mpusbapi.dll" nos facilitara el manejo del puerto USB y no es necesario modificarlo, solo necesitamos aadirlo a la hora de generar la aplicacin .EXE en Visual C#.Abrimos Visual C# 2005, en archivo seleccionamos nuevo proyecto y a su vez seleccionar "Aplicacin para Windows", a partir de aqu podemos nombrar y guardar el proyecto. Ver figura 9.

Figura 9Al aceptar aparecer una pequea ventana a la que agregaremos 5 botones, los cuales tomaremos del cuadro de herramientas del lado izquierdo de nuestra pantalla. Ver figura 10.

Figura 10Al aadir un botn aparecer como "botn", que despus podremos cambiar a "LED1".Hasta este punto debemos aclarar que para llamar en el cdigo C a cualquier botn debemos llamarlo por su nombre y no con el texto, por ejemplo: El botn 1 tiene como ttulo "LED1", pero se llama "led1".El texto es el que puede ver el usuario en la interfaz, y el nombre es el utilizado para manipular la accin del mismo por el programador.Para ir creando el cdigo que necesitamos para cada botn iremos a la seccin de propiedades, y seleccionamos "eventos", para cada botn escribiremos el nombre y la accin: led1_click, de esta manera al darenter;se ira creando automticamente una seccin de cdigo para cada botn, ver figura 11.

Figura 11Al generar un cdigo por cada botn, ya solo ara falta editar su accin, es decir; el contenido de cada llave.Por ejemplo, si nos enfocamos en el botn LED1, debemos escribir las instrucciones que manden un byte de modo led y otro correspondiente al led, entonces:usbapi.ledPIC(0x01);1er byte ledPIC = 0x002do byte = 0x01Por lo que estaramos enviando desde la interfaz un paquete de 2 bytes, el hardware los recibir y entender que debe conmutar el LED1. Ver figura 12.

Figura 12Una vez editados todos los botones debemos agregar las siguientes lneas al principio del cdigo:1-using System.Diagnostics; //Clase para abrir pgina web2-PICtoolAPI usbapi = new PICtoolAPI();//para incluir acciones apiVer figura 13.

Figura 13Al guardar el proyecto, se genera un archivo con el nombre de"program.cs",cambiaremos de nombre este archivo por"PICtoolAPI.cs",borraremos todo su contenido y pegaremos el siguiente texto:using System;using System.Collections.Generic;using System.Windows.Forms;using System.Runtime.InteropServices; // Clase para importar DLLusing PVOID = System.IntPtr;using DWORD = System.UInt32;namespace PICtool{ unsafe public class PICtoolAPI { #region Definicin de los Strings: EndPoint y VID_PID string vid_pid_norm = "vid_04d8&pid_0090"; string out_pipe = "\\MCHP_EP1"; string in_pipe = "\\MCHP_EP1"; #endregion #region Funciones importadas de la DLL: mpusbapi.dll [DllImport("mpusbapi.dll")] private static extern DWORD _MPUSBGetDLLVersion(); [DllImport("mpusbapi.dll")] private static extern DWORD _MPUSBGetDeviceCount(string pVID_PID); [DllImport("mpusbapi.dll")] private static extern void* _MPUSBOpen(DWORD instance, string pVID_PID, string pEP, DWORD dwDir, DWORD dwReserved); [DllImport("mpusbapi.dll")] private static extern DWORD _MPUSBRead(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds); [DllImport("mpusbapi.dll")] private static extern DWORD _MPUSBWrite(void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds); [DllImport("mpusbapi.dll")] private static extern DWORD _MPUSBReadInt(void* handle, DWORD* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds); [DllImport("mpusbapi.dll")] private static extern bool _MPUSBClose(void* handle); #endregion void* myOutPipe; void* myInPipe; static void Main() { Application.EnableVisualStyles(); Application.Run(new PICtool()); } public void OpenPipes() { DWORD selection = 0; myOutPipe = _MPUSBOpen(selection, vid_pid_norm, out_pipe, 0, 0); myInPipe = _MPUSBOpen(selection, vid_pid_norm, in_pipe, 1, 0); } public void ClosePipes() { _MPUSBClose(myOutPipe); _MPUSBClose(myInPipe); } private void SendPacket(byte* SendData, DWORD SendLength) { uint SendDelay = 1; DWORD SentDataLength; OpenPipes(); _MPUSBWrite(myOutPipe, (void*)SendData, SendLength, &SentDataLength, SendDelay); ClosePipes(); } private void ReceivePacket(byte* ReceiveData, DWORD* ReceiveLength) { uint ReceiveDelay = 1; DWORD ExpectedReceiveLength = *ReceiveLength; OpenPipes(); _MPUSBRead(myInPipe, (void*)ReceiveData, ExpectedReceiveLength, ReceiveLength, ReceiveDelay); ClosePipes(); } public void ledPIC(uint led) { byte* send_buf = stackalloc byte[2]; send_buf[0] = 0x00; //Modo LED send_buf[1] = (byte)led; //Seleccionar LED SendPacket(send_buf, 2); //Enviar paquete } }}En el archivo anterior modificamos dos cosas importantes:1-Se aadi cdigo referente al cdigo VID y PID adems de la extraccin de algunos parmetros del archivo"mpusbapi.dll",recordemos que se trata de un archivo proporcionado por microchip para este tipo de aplicaciones.2-Se agreg la funcinledPIC, la cual nos ayuda a mandar los dos bytes cada que se presiona un botn de la interfaz.Ver figuras 14 y 15.

Figura 14

Figura 15Ahora ya solo nos falta una cosa, guardar el archivo"mpusbapi.dll"dentro de la carpeta donde se guard el proyecto PICtool creado en visual C# 2005, dar clic en "proyecto"-->clic en "agregar elemento existente" y direccionar la mpusbapi que guardamos anteriormente. Finalmente modificar una casilla en propiedades del proyecto; esto es que al momento de generar l .EXE nos jale los parmetros necesarios del mpusbapi, para eso debemos permitir "GENERAR" con cdigo no seguro, ver figura 16.

Figura 16FINALMENTE estamos listospara probar nuestro proyecto, ya solo debemos dar clic en GENERAR y listo!!. Suerte.En la seccin de DESCARGAS podrn adquirir todos los archivos fuente de este proyecto, sin ms por el momento espero sea de ayuda.

PROYECTO 2http://www.desarrollopic.com/tutoriales/proyecto-usb-con-pic-win7-8/

PICtool v2.030/09/2013Con los nuevos sistemas operativos de Windows(Vista, Win7, Win8); el driver de Microchip ya no es compatible, nos deja fuera de la mxima velocidad (12Mbs), resultando como nicos modosHID y CDC.Pero gracias al driver genricoWinUSBde Windows, retomaremos la comunicacin USB 2.0 con la serie favorita de microntroladores PIC18Fxx5x, que traen el hardware para dicha comunicacin, en modo"Custom Driver"devolvindonos los 12Mbs, compatible con los nuevos sistemas en sus versiones de 32 y 64bits.El desarrollo es sencillo, utilizaremos el PIC18F2550 con un cristal de 20MHz,al igual que el proyecto anterior,constara de 4 salidas lgicas del puerto B, que activaremos y desactivaremos a voluntad desde la interfaz.Idea central:PC WinUSB(Vista, Win7, Win8) PIC18F2550La organizacin USB de los nuevos sistemas de Windows ya no exige que Hardware, Driver e Interfaz contengan el mismo cdigo VID y PID, hoy la identificacin es por "Rutas".Slo Hardware y Driver deben contener el mismo VID y PID, mientras que Driver e Interfaz la misma Ruta.Esto supone que pueden conectarse varios dispositivos con el mismo VID y PID al mismo PC, al instalarse de identifica a cada uno por su Ruta.El desarrollo consta de 4 pasos, que describiremos brevemente, la mayora de las caractersticas ya estas explicadas(Proyecto 1):1-Diagrama (EAGLE 6.4.0)2-Firmware PIC18F2550 (CCS v4.140)3-Driver WinUSB (Sin editar)4-Interfaz Grfica (VC# 2008 Express)Paso 1A continuacin el diagrama electrnico(Figura 1).Materiales:4-Resistores 330 ohms1-Resistor 10K1-Capacitor 100nF1-Capacitor 470nF2-Capacitores 22pF1-Cristal 20MHz1-Push button4-LEDs std1-Conector USB-B/H

Figura 1LEDs conectados al PUERTO B(Figura 2):PORTB.5 = LED1PORTB.4 = LED2PORTB.3 = LED3PORTB.2 = LED4

Figura 2Paso 2El Firmware del PIC18F2550 esta editado en CCS(Lenguaje C), el programa principal es relativamente sencillo, la verdadera magia est en la librera que es llamada para el uso de la comunicacin USB: "pic18_WinUSB.h", la cual contiene los cdigos VID y PID, que debern ser iguales al Driver, especficamente al archivo "*.inf", se recomienda no modificar esta librera.En caso de querer modificar el programa para una aplicacin ms completa, con tan slo el programa principal bastara, por ejemplo: de requerir una mayor capacidad del buffer para recibir bytes.. Tan slo hay que aumentar el tamao del mismo(Figura 3).

Figura 3CDIGO:El programa conmuta(1 0) 4 pines del puerto B, segn lo que reciba de la comunicacin USB.#include #fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN#use delay(clock=48000000)#use FAST_IO (B)#define USB_HID_DEVICE FALSE #define USB_EP1_TX_ENABLE USB_ENABLE_BULK #define USB_EP1_RX_ENABLE USB_ENABLE_BULK #define USB_EP1_TX_SIZE 2 #define USB_EP1_RX_SIZE 2 #include #include "pic18_WinUSB.h" #include #define led1 PIN_B5#define led2 PIN_B4#define led3 PIN_B3#define led4 PIN_B2#define pin_on output_high#define pin_off output_lowvoid main(void) { int8 iBuff[2]; set_tris_b(0x00); delay_cycles(5); pin_off(led1); pin_off(led2); pin_off(led3); pin_off(led4); usb_init(); usb_task(); usb_wait_for_enumeration(); while (TRUE) { if(usb_enumerated()) { if (usb_kbhit(1)) { usb_get_packet(1, iBuff, 2); if (iBuff[0] == 0) { if (iBuff[1] == 1) output_toggle(led1); if (iBuff[1] == 2) output_toggle(led2); if (iBuff[1] == 3) output_toggle(led3); if (iBuff[1] == 4) output_toggle(led4); } } } }}Aqu la parte importante de la librera "pic18_WinUSB.h", que contiene el VID y PID, y que deber coincidir con la descripcin(INF) del Driver (Figura 4).

Figura 4Paso 3El driver genrico"WinUSB"es proporcionado por Microsoft, al conectar por 1ra vez el Hardware; es necesario direccionar manualmente dicho driver, al hacerlo aparece por defecto un mensaje indicando que puede ser peligroso instalarlo, le damos clic en aceptar y finalizamos la instalacin.Con el Driver es importante resaltar 2 puntos:1ro-El VID y PID del Driver son los mismos que contiene el Firmware del PIC18F2550(Figura 5).

Figura 52do-La "RUTA" del driver es la misma que contiene la Interfaz Grfica(Figura 6).

Figura 6Paso 4La Interfaz Grfica est diseada con Visual C# 2008, lenguaje C, el cdigo es muy parecido al Proyecto 1.Se trata de 4 botones que envan un paquete de 2byte cada uno:1er byte= Modo (0x00)2do byte= Led (0x01/0x02/0x03/0x04)El 1er byte no es de mucha utilidad en esta aplicacin, pero lo ser para aquellos que quieran agregar ms funciones, por ejemplo: Modo 0x00=LEDs, 0x01=Relay, 0x02=CH1/ADC etc.El 2do byte indica el LED a conmutar: LED1=0x01, LED2=0x02, LED3=0x03 y LED4=0x04 (Figura 7).

Figura 7Ejemplo de cdigo para un botn VC#(Figura 8):

Figura 8Cdigos fuente en la seccinDESCARGAS,con el nombre de"PICtool v2.0", espero sea de ayuda, saludos.