Comunicacion Usb Con El Pic Pic18F4550
Comunicacion Usb Con El Pic Pic18F4550
Comunicacion Usb Con El Pic Pic18F4550
AquiHayApuntes | Biblioman
Comunicacin USB con el PIC18F4550 2010
Pgina 2
Comunicacin USB con el PIC18F4550 2010
La placa es simple, del tipo modular ya que tiene disponible todas las patillas del PIC,
lo que permite la adaptacin a cualquier tipo de proyecto que utilice USB o no. Las
caractersticas son las siguientes:
Consideraciones de diseo.
El que la placa tenga un diseo modular permite mucha flexibilidad a la hora de probar
nuestros prototipos, basta que hagas fijo la funcionalidad de un determinado pin, para
que en el siguiente prototipo lo tengas que utilizar para otra cosa. Otra decisin
importante que hay que tener en cuenta en el diseo de la placa son los conectores a
utilizar, con respecto al conector del programador/debugger la decisin fue rpida decid
utilizar el RJ-12 ya que los programadores que utilizo (ICD-64 y el ICD2) tienen este
conector y vienen ya con el cablecito incorporado para la conexin, el esquema de
conexin del ICD-U64 a la placa lo tenis aqu .
Con respecto a los conectores para los puertos del PIC personalmente prefiero los que te
permiten el acceso a los pines individualmente, dentro de esta filosofa se pueden
utilizar regletas de conexiones que permiten utilizar cualquier tipo de cable para
conectar los mdulos de expansin array de pines (o postes) como se les quiera
llamar, que permiten la conexin fcil a travs de cablecillos rgidos,
para esta placa he utilizado los array de pines, con respecto a las regletas de conexiones
tienen la ventaja de que te ahorras el atornillado de los cables, ocupan menos espacio y
son ms baratos. Las regletas de conexiones tienen a su favor que los cables quedan mas
sujetos y permiten el movimiento de los mdulos sin correr el riesgo de que se
desconecte algn cable. Con respecto al conector USB los que se utilizan normalmente
Pgina 3
Comunicacin USB con el PIC18F4550 2010
para los dispositivos son los del tipo B, si he utilizado uno del tipo A simplemente es
porque es el nico que tena disponible (reciclado de una vieja placa base de ordenador).
Con respecto al software de diseo de la placa podis utilizar el que ms os guste hay
donde elegir: Altium (Antiguo Protel), Eagle, KiCAD, OrCAD, Ares, PCB Wizar, PCB
Artist, etc.
Por ltimo queda la decisin de utilizar para el diseo una placa de circuito impreso
simple o a doble cara, el desarrollo de placas a doble capa utilizando los mtodos
caseros tradicionales como el insolado y la tcnica de la plancha suele costar un poco
ms de trabajo al principio, pero una vez que perfeccionas la tcnica su utilizacin en
circuitos de mediana complejidad es aconsejable, el que solo haga sus diseos a una
cara sabe el tiempo que hay que perder modificando el ruteo de la placa para incluir los
tediosos puentes de conexin.
Interfaz fsica
La interfaz fsica est formada por cuatro hilos dos para la alimentacin 5v (Rojo) GND
(Negro) y dos para datos D+ (verde) y D- (Blanco) Lo del signo + y - es porque es una
seal diferencial cuyo valor depende de la velocidad del bus (3,3v para low-speed y
400mV para high-speed).
Los conectores se les denomina de tipo A y de tipo B, una imagen de dichos conectores
la tenis aqu.
Pgina 4
Comunicacin USB con el PIC18F4550 2010
Velocidades del Bus
Hay que decir que el Host es el que controla la velocidad en la que circulan los datos en
el bus USB y que al ser un bus compartido, la velocidad real depender de la cantidad
de dispositivos que tengamos conectados a el en un momento determinado (mximo
127 incluyendo al Host). Por tanto los datos siguientes son solo tericos y de referencia.
Low speed: 1,5 Mbps. Soportado por las especificaciones 1.1, 2.0 y 3.0. Es la
velocidad utilizada por dispositivos como teclados, ratones, joystick, etc.
Full speed: 12 Mbps. Soportado por USB 1.1, USB 2.0 y USB 3.0. Un ejemplo
donde se utilizan estas velocidades es en transmisiones de audio.
High speed: 480 Mbps. Solo USB 2.0 y USB 3.0. Ejemplo transmisiones de
video.
Super speed: 5Gbps solo soportado en dispositivos USB 3.0, y como he dicho
antes no conozco ningn microcontrolador que soporte esta especificacin.
Transferencias
Una transferencia se puede definir como el conjunto global de los datos que forman una
comunicacin USB, una transferencia est formada a su vez por una o varias
transacciones que a su vez estn formadas por diferentes paquetes de datos que
contienen las tramas de una comunicacin USB.
Pgina 5
Comunicacin USB con el PIC18F4550 2010
Los dispositivos usan uno o ms tipos de transferencia, la de control es utilizada
siempre por todos los dispositivos en el proceso de enumeracin. Si se utiliza otra
transferencia habr que hacerlo en funcin
del tipo y cantidad de datos a transmitir.
El VID (Vendor ID) y el PIC (Product ID) son dos nmeros de 16 bits representados en
Hexadecimal, si utilizamos la clase CDC (Communications Device Class) de CCS para
la comunicacin USB estos valores los podemos modificar en el archivo
"usb_desc_cdc.h" y segn el sistema operativo instalado en el Host deberemos
modificarlos tambin en el archivo .inf, pero esto lo veremos ms adelante.
Realmente el modificar estos valores solo es til si queremos distribuir nuestro producto
comercialmente, en ese caso existe una organizacin llamada USB Implementers Forum
que se encarga de proporcionarnos previo pago correspondiente (creo que unos 1500 $)
un VID valido para que nuestro dispositivo conviva sin problemas con el resto de
dispositivos USB del mercado, adems tendremos derecho a poner el logo USB en
nuestro producto certificando de esta manera que ha pasado los controles pertinentes y
cumple con el estndar USB. Todo esto es similar al proceso que se sigue a la hora de
obtener una direccin MAC en una tarjeta de red.
Si esto no estuviera regulado tal y como est y cada dispositivo tuviera el VID y PID
que quisiera, cuando coincidieran en un mismo sistema dos nmeros iguales se
presentara un conflicto hardware y ambos dispositivos dejaran de funcionar.
Que es un endpoint?
Los endpoint son simplemente buffer de memoria RAM que son utilizados para el envo
y recepcin de datos o comandos de control durante una comunicacin USB. cada
endpoint puede ser de entrada o salida de datos o bidireccional, el endpoint 0 est
reservado para comandos de control, el proceso de enumeracin se realiza a travs del
endpoint nmero 0. Este concepto solo se aplica al dispositivo, en el host existen
tambin buffer para el envo y recepcin de datos pero no se les denomina con este
nombre.
Pgina 6
Comunicacin USB con el PIC18F4550 2010
Que es un Pipe o Tubera?
Es una conexin lgica entre un endpoint y el software del controlador del host que se
produce tras el proceso de enumeracin. Los Pipes se usan mucho en Sistemas
Operativos como UNIX/LINUX para enlazar la salida de un proceso con la entrada de
otro, en este caso el concepto es el mismo.
Pgina 7
Comunicacin USB con el PIC18F4550 2010
con un IDE multiplataforma, que nos permitir ejecutar la aplicacin en
diferentes sistemas operativos, concretamente en Windows, Linux y MAC. La
velocidad mxima al utilizar esta clase ser de 80 kBytes/s y el tipo de
transferencias soportadas son del tipo interrupcin y Bulk. Utiliza tambin driver
estndar incluidos ya en el sistema operativo, segn el sistema operativo
utilizado precisar o no de la instalacin del archivo .INF, cuando utilizamos
esta clase en el PC nos crear un puerto serie virtual y la comunicacin entre el
dispositivo y la aplicacin de escritorio se har a travs de el al igual que se
hara con un puerto serie fsico, esto supone una gran ventaja a la hora de disear
la aplicacin de escritorio, ya que cualquier IDE de programacin sea del
lenguaje que sea, dispone de un componente o librera que permite el acceso al
puerto serie fcilmente.
Existe una clase genrica llamada "Custom Class" que se utiliza cuando el
dispositivo no se asemeja a las caractersticas de ninguno de los miembros
pertenecientes a otras clases. un ejemplo de dispositivo que utiliza esta clase es
el ICD2 o ICD3 de Microchip.
Pgina 8
Comunicacin USB con el PIC18F4550 2010
opcin de utilizacin de la librera es aadirla a nuestro proyecto de
forma dinmica, para ello solo se necesita el archivo con extensin .dll
(mpusbapi.dll) proporcionado tambin por Microchip, de esta forma si
utilizamos un compilador diferente como los que nos proporciona
Microsoft en su plataforma .NET u otros como LabVIEW, Matlab,
RealBAsic, etc. No tendremos que modificar el cdigo fuente de la DLL,
simplemente la utilizaremos importando las funciones pblicas de la
DLL desde nuestra aplicacin de escritorio. Microchip proporciona
ejemplos de ambas formas. Como veis todo esto del USB da pie a
realizar las cosas de diferentes formas, ms adelante en otro ejemplo
veremos ests dos posibilidades. Pero por que utilizar esta opcin y no
utilizar siempre las clase CDC, MSD o HID que a priori parece ms fcil
su utilizacin? Simplemente porque utilizando un driver personalizado
en vez de los genricos que proporciona Windows obtenemos una
comunicacin USB ms verstil y con mayores prestaciones. Por
ejemplo, en cuanto a velocidad podremos alcanzar velocidades de hasta
1MB/s frente a los 64 KB/s de la clase HID y los 80 kBytes/s de la clase
CDC, adems el driver de Microchip soporta todos los tipos de
transferencia (Control, Iscronas, Interrup y Bulk), cosa que no ocurre
igual si utilizamos las otras clases como ya hemos visto.
Otros drivers que podemos utilizar para nuestro PIC 18fx550 son:
WinUSB: es el driver genrico para USB que propone utilizar Microsof cuando
nuestro dispositivo no puede ser manejado directamente por los drivers que ya
incluye por defecto en su sistema operativo. Para ello al igual que Microchip
proporciona los siguientes archivos: Winusb.sys, Winusb.ini y la librera
Pgina 9
Comunicacin USB con el PIC18F4550 2010
dinmica Winusb.dll que al igual que la dll de Microchip nos proporciona una
serie de funciones pblicas para acceder fcilmente al driver y a las APIs win32
de Windows desde nuestra aplicacin de escritorio.
Toda la informacin que proporcionada Microsof sobre este driver la podis
encontrar en el siguiente enlace.
libUSB: Es un driver de cdigo abierto con licencia GNU, se puede instalar en
mltiples sistemas operativos como LInux, MAC y otros, incluyendo Windows
a travs de su versin libusb-win32. Toda la informacin de este driver lo tenis
en la pgina del proyecto. Adems existen ejemplos ya hechos para utilizar con
diferentes lenguajes y entornos de programacin como: Java, Python, Ruby,
.NET, etc.
Bueno y con esto se acaba la pequea introduccin sobre USB enfocada a los PIC, la
mayora de datos y valores numricos de est informacin adems de los datasheets est
sacada de apuntes y notas tomadas por m en las diferentes presentaciones y seminarios
de Microchip a los que he podido asistir a lo largo del tiempo que estoy con esto de los
PICs, por lo que no descarto que pueda haber algn error, de vosotros depende el
verificar dichos datos y si encontris algn error sera bueno para todos que lo
comentarais en el foro.
Pgina
10
Comunicacin USB con el PIC18F4550 2010
Desarrollo del firware programa que se cargar en el microcontrolador.
Como dijimos al principio este ejemplo esta basado en el uso de la clase CDC,
utilizando el compilador de CCS versin 4.107, me ha servido de gua el ejemplo
EX_USB_SERIAL.C incluido en los ejemplos del compilador (con las modificaciones
necesarias claro), como ya sabis los ejemplos y libreras de CCS tienen copyright y su
cdigo no se puede publicar. Por lo que solo voy a comentar algunas cosas:
Unas de las cosas importantes que tenemos que tener en cuenta al programar el
Microcontrolador son los fusibles, en los que entre otras cosas se define la velocidad de
trabajo del PIC. Una caracterstica que hay que tener en cuenta cuando usamos un PIC
con interfaz USB, es que para que dicho mdulo funcione la frecuencia de reloj en la
entrada de dicho mdulo debe de ser de 48 MHz, para conseguir dicha frecuencia se
dispone de un multiplicador con pre-escaler y post-escaler. A la entrada del
multiplicador tenemos que tener una frecuencia fija de 4 MHz. En la figura de abajo se
muestra como configurar el pre-escaler del PLL cuando en nuestro circuito tenemos un
cristal de 20 MHz.
Como se ve en la figura, en este caso el pre-escaler divide los 20 MHz por 5 para
obtener los 4MHz requeridos a la entrada del PLL, este a su vez produce 96 MHz en su
salida los cuales se distribuyen por un lado al mdulo USB, dividiendo previamente la
frecuencia por 2 para obtener los 48 Mz a la entrada del mdulo por el otro lado
alimenta el post-divisor del PLL, para que podamos elegir la frecuencia de trabajo del
ncleo del micro, en este caso divide por tres por lo que tendremos 32 MHz para
alimentar al "core" del PIC.
Pgina
11
Comunicacin USB con el PIC18F4550 2010
Debido a la complejidad de la comunicacin USB o de otras como TCPIP lo que ha
hecho tanto Microchip como otros desarrolladores de compiladores como CCS es
proporcionar unas libreras que comnmente se les llama "Stacks" o pila de software
cuya finalidad es facilitar la tarea al programador de dispositivos, de tal forma que no es
necesario conocer a fondo el protocolo de comunicacin USB, simplemente se necesita
saber que funciones pblicas me proporciona el "Stack" correspondiente para poder
enviar y recibir los datos a travs del bus.
En el caso de este ejemplo que utiliza la clase CDC (Communications Device Class), las
funciones que se han utilizado para enviar y recibir datos por el bus USB son:
Hay ms funciones disponibles para su uso directo, la descripcin de cada una de ellas
las podis encontrar en la cabecera del archivo usb_cdc.h.
Otra cosa que hay que tener en cuenta es que para que la comunicacin USB se
mantenga debe ser realimentada constantemente, para ello hay que llamar
peridicamente a la funcin usb_task(), por lo que nuestro programa tendr que tener
un bucle infinito principal donde deberemos incluir la llamada a esta funcin.
Como veis es adaptar el algoritmo de nuestro programa a los requisitos que necesita el
"Stack" para que funcione correctamente. Para ello CCS dispone de un gran nmero de
ejemplos que nos sirven como plantillas para nuestros desarrollos.
De las libreras que nos proporciona CCS para la comunicacin USB utilizando la clase
CDC hay un archivo el usb_desc_cdc.h donde se guarda la informacin perteneciente a
los descriptores del
dispositivo ese archivo podemos editarlo y modificar los descriptores perteneciente al
VID, PID, consumo del dispositivo y versin del firware.
Pgina
12
Comunicacin USB con el PIC18F4550 2010
view source
print?
1.///////// Opciones de configuracin
///////////////////////////////////
2.#define USB_CONFIG_PID 0x0033
3.#define USB_CONFIG_VID 0x0461
4.#define USB_CONFIG_BUS_POWER 100 //100mA (rango de 0..500)
5.#define USB_CONFIG_VERSION 0x0100 //01.00 //range is 00.00 to
99.99
6.//////// Fin de la configuracin
//////////////////////////////////////////
Nota: segn la versin del compilador utilizado, puede que haya modificaciones en los
archivos de las libreras, en la que yo tengo las opciones de configuracin de los
descriptores vienen definidas por etiquetas al principio del archivo.
Otra cosa que se puede modificar en este archivo son los "Strings" o cadenas de
caracteres que sirven para que Windows muestre informacin referente al fabricante del
dispositivo, como por ejemplo nombre de la compaa y nombre del producto. Estas
cadenas estn colocadas al final del archivo usb_desc_cdc.h y hay que colocarlas en un
formato determinado segn se muestra en el siguiente ejemplo:
view source
print?
01.//string 1 - Fabricante
02. 20, //Longitud de la cadena = (N caracteres + 1)x2= (9+1)x2=20
03. USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
04. 'F',0,
05. 'A',0,
06. 'B',0,
07. 'R',0,
08. 'I',0,
09. 'C',0,
10. 'A',0,
11. 'N',0,
12. 'T',0,
13. 'E',0,
14.//string 2 - producto
15. 18, //Longitud de la cadena = (N caracteres + 1)x2= (8+1)X2=18
16. USB_DESC_STRING_TYPE, //descriptor type 0x03 (STRING)
17. 'P',0,
18. 'R',0,
19. 'O',0,
20. 'D',0,
21. 'U',0,
22. 'C',0,
23. 'T',0,
24. 'O',0
En el archivo .INF tambin hay un campo llamado [Strings] que podemos editar para
personalizar la informacin que presentar el Sistema Operativo sobre nuestro
dispositivo.
Pgina
13
Comunicacin USB con el PIC18F4550 2010
Que diferencia hay entre unas cadenas y otras?, pues bien, las que se encuentran en
el archivo de los descriptores se mostrarn solo la primera vez que se conecta el
dispositivo al ordenador. En Windows esa informacin aparecer en el "bocadillo"
informativo que sale a la derecha en la barra de herramientas, cuando el sistema detecta
un nuevo hardware.
Nota: en Linux esta informacin no aparece y en MAC lo probar pero claro, cuando
consiga uno.
Despus de que el dispositivo haya sido reconocido por el sistema esa informacin la
coger el S.O desde las cadenas contenidas en el archivo .INF y la podremos ver en
Windows si vamos a la ventana de "Administrador de dispositivos" seleccionamos el
dispositivo y hacemos clic en propiedades.
Bueno este punto solo es cierto a medias, ya hemos dicho que si utilizamos la clase
CDC el sistema operativo utiliza drivers genricos instalados ya en el Sistema
Operativo, pero para que Windows sepa que driver tiene que asignarle al dispositivo
precisa que se instale el archivo .INF, el proceso de instalacin de este archivo es como
si fuera un driver completo, es decir, la primera vez que enchufemos el dispositivo al
ordenador el plug and play nos detectar un hardware nuevo y nos saldr el asistente
para la instalacin del nuevo hardware encontrado. Cuando nos aparezca la ventana
preguntndonos si queremos que Windows se conecte a Windows Update para buscar el
Software seleccionaremos la opcin: No por el momento. En la siguiente ventana donde
nos pregunta que desea que haga el asistente? marcaremos la opcin de: Instalar desde
una lista o ubicacin especfica (avanzado) y en la siguiente ventana nos aparecer las
opciones de bsqueda en la que seleccionaremos la opcin Buscar el controlador ms
adecuado en estas ubicaciones y marcaremos la casilla Incluir esta ubicacin en la
bsqueda, pulsando sobre examinar seleccionaremos la carpeta donde se encuentra
nuestro archivo .INF, si todo ha ido bien comenzar el proceso de instalacin. Y una vez
instalado si abrimos el administrador de dispositivos (inicio -->ejecutar--
>devmgmt.msc) veremos que nos ha creado un puerto serie virtual, y si quieres ver el
driver que le ha asignado Windows sigue los pasos de la figura de abajo empezando por
la izquierda.
Pgina
14
Comunicacin USB con el PIC18F4550 2010
El archivo .INF que he utilizado para esta Demo es el que viene con el compilador de
CCS lo podis encontrar en la ruta donde instalasteis el compilador en la carpeta
drivers, este archivo est preparado para que funcione en Windows NT, Windows 2000,
XP, Windows Vista y Windows 7 en sus versiones de 32 y 64 bits.
Y como se hace todo esto en Linux? pues muy sencillo porque no hay que instalar
ningn archivo .INF automticamente el Sistema Operativo reconoce el dispositivo y le
asigna el driver correcto. Lo podemos ver si abrimos la carpeta /dev que es el directorio
donde se guardan los controladores de dispositivos en Linux, como ya sabis todo en
Linux se gestiona como si de un archivo se tratara, despus de conectar el dispositivo
veremos que se nos ha creado un nuevo archivo (puerto COM) con el nombre
ttyACM0, ese ser el puerto al que tendremos que conectarnos desde la aplicacin de
escritorio.
La distribucin de Linux con la que he probado la demo ha sido Ubuntu 10.04 LTS con
el kernel 2.2.25
Bueno ya hemos conseguido que nuestro ordenador reconozca a nuestro PIC como un
dispositivo vlido, lo nico que nos queda ahora es crear la aplicacin de escritorio para
que podamos comunicarnos con el.
Pgina
15
Comunicacin USB con el PIC18F4550 2010
Desarrollo de la aplicacin de escritorio
El que programe habitualmente aplicaciones de escritorio no hace falta que lea esto ya
que probablemente ya habr elegido con que lenguaje y con que IDE hacer la
aplicacin. El que no tenga mucha experiencia en esto puede que se pregunte que IDE
de programacin es el mejor?. Desde luego hay donde elegir: LabView, Matlab,
DEV++, Gambas, Eclipse, NetBeans, Visual Studio, Boa Constructor, Borland C++
Builder, MonoDevelop, RealStudio, etc.
Cada uno de estos IDES compila o interpreta segn el caso el cdigo escrito en
diferentes lenguajes como Basic,.NET, C++, Java, Python, G, etc.
Para esta demo he utilizado RealStudio en su versin para Linux, este IDE utiliza como
lenguaje de programacin un Basic moderno orientado a objetos, es Multiplataforma y
con un solo clic de ratn compila el mismo cdigo fuente para tres plataformas
diferentes (Windows, Linux y MAC). Produce un ejecutable compilado en cdigo
nativo por lo que no necesita de ninguna mquina virtual ni de ningn pesado
Framework en la mquina donde se ejecute la aplicacin. Dispone de un componente
(como la mayora de los IDES) para gestionar los puertos COM y lleva integrado la
base de datos SQLite, ideal para guardar datos procedentes del PIC. Es un producto
comercial pero flexible en el tema de las licencias, hay varias opciones con diferentes
precios, esta demo est hecha con la versin Trial completamente funcional durante
treinta das (mas que suficientes para hacer este ejemplo y darse una idea de como es el
entorno de programacin), toda la informacin sobre este IDE se encuentra en la pgina
oficial de Real Software.
Pgina
16
Comunicacin USB con el PIC18F4550 2010
Quiere decir que por que e elegido este IDE para hacer el ejemplo lo considero mejor
que los dems?, pues ni Si ni NO. es simplemente una opcin ms a elegir. Cualquiera
de los IDES anteriormente citados
los considero perfectamente vlidos para realizar una pequea interfaz que sirva para
comunicarse con el PIC. Si que es verdad que prefiero los IDE multiplataforma para
poder ejecutar la aplicacin en varios Sistemas Operativos concretamente en Windows
y Linux que son los que normalmente utilizo. Mas adelante har otros ejemplos en otros
IDES Multiplataforma como Boa (Python) y NetBeans (Java).
Microchip hasta ahora a discriminado a los usuarios que utilizan otros sistemas
operativos diferentes a Windows ya que todo su software y aplicaciones de escritorio
estaban hechas para windows, pero parece ser que est filosofa est cambiando, prueba
de ello es la versin de su software estrella el MPLAB, sus desarrolladores se han
puesto a trabajar en una versin Multiplataforma el MPLABX basado en Java, aunque
de momento est en la versin beta su desarrollo permitir que todo el software que
proporciona Microchip se vaya portando poco a poco a este entorno y el que quiera
utilizar los pics junto con las herramientas que proporciona Microchip lo pueda hacer en
el sistema operativo que quiera sin la imposicin de tener que usar Windows.
Pgina
17
Comunicacin USB con el PIC18F4550 2010
necesario si utilizamos otros IDES como Visual Studio.NET, Java o Python. Todos los
IDES modernos estn basados en la Programacin Orientada a Objetos, una vez que
dominas esta tcnica de programacin el pasarte de un IDE a otro es relativamente
sencillo.
Durante la instalacin del IDE del RealStudio se instala la carpeta de ejemplos donde
hay un par de ellos sobre como comunicarse con el puerto serie, una vez que se sabe
como funciona el componente COMM lo dems es aadir los botones, etiquetas y
cuadros de texto que necesitemos segn las necesidades del ejemplo que hagamos.
Aqu tenis una foto del circuito montado para esta demo:
Pgina
18
Comunicacin USB con el PIC18F4550 2010
Para Windows:
Ver vdeo.
Para Linux:
Ver vdeo.
Pgina
19
Comunicacin USB con el PIC18F4550 2010
http://electronica-pic.blogspot.com
Versin: 1.00
http://www.aquihayapuntes.com/indice-practicas-pic-en-c/comunicacion-usb-pic18f4550-
utilizando-la-clase-cdc.html
Web principal:
http://www.aquihayapuntes.com
Pgina
20