Está en la página 1de 27

PROGRAMACION DE SISTEMAS

PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

UNIDAD VIRTUAL 1
Aplicar Procedimiento para Programar microcontroladores PIC

Programación del microcontrolador PIC

1. Programación del microcontrolador PIC


En la actualidad podemos encontrar varios lenguajes de programación (C, C++, Assembler, Basic,
PIC Basic) el lenguaje que usaremos en este manual es Basic.

1.1 Lenguajes de programación


En la actualidad podemos encontrar varios lenguajes de programación (C, C++, Assembler, Basic,
PIC Basic) el lenguaje que usaremos en este manual es Basic.
El microcontrolador ejecuta el programa cargado en la memoria Flash. Esto se denomina el código
ejecutable y está compuesto por una serie de ceros y unos, aparentemente sin significado.
Dependiendo de la arquitectura del microcontrolador, el código binario está compuesto por
palabras de 12, 14 o 16 bits de anchura. Cada palabra se interpreta por la CPU como una
instrucción a ser ejecutada durante el funcionamiento del microcontrolador. Todas las
instrucciones que el microcontrolador puede reconocer y ejecutar se les denominan
colectivamente Conjunto de instrucciones. Como es más fácil trabajar con el sistema de
numeración hexadecimal, el código ejecutable se representa con frecuencia como una serie de los
números hexadecimales denominada código Hex. En los microcontroladores PIC con las palabras
de programa de 14 bits de anchura, el conjunto de instrucciones tiene 35 instrucciones diferentes.

1
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

1.1.1 Código de máquina (HEX)


En el mundo de la Programación, existen dos tipos de lenguajes que se emplean durante todo el
proceso.

Este código es un conjunto de instrucciones que únicamente es entendible directamente por el


ordenador, puesto que este lenguaje está compuesto por unos y ceros (1, 0). Generalmente este
está basado en el lenguaje natural que luego es traducido por un intérprete a código máquina
posteriormente.
Ejemplo: 0010, 0100, 1001, 1011, 1100.

1.1.2 Assembler
Este lenguaje de programación es el único lenguaje que entienden los microcontroladores, en
pocas palabras el lenguaje máquina de los microcontroladores.

Como el proceso de escribir un código ejecutable era considerablemente arduo, en consecuencia


fue creado el primer lenguaje de programación denominado ensamblador (ASM). Siguiendo la
sintaxis básica del ensamblador, era más fácil escribir y comprender el código. Las instrucciones en
ensamblador consisten en las abreviaturas con significado y a cada instrucción corresponde una
localidad de memoria. Un programa denominado ensamblador compila (traduce) las instrucciones
del lenguaje ensamblador a código máquina (código binario).

Este lenguaje trabaja con nemónicos, que son grupos de caracteres alfanuméricos que simbolizan
las ordenes o tareas a realizar. La traducción de los nemónicos a código máquina entendible por el
microcontrolador la lleva a cabo un programa ensamblador, el cual se denomina código fuente (*,
asm.). El programa ensamblador proporciona a partir de este fichero el correspondiente código
máquina, que suele tener la extensión *hex.

2
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Imagen 1

1.1.3 Basic
Es un lenguaje de Alto Nivel, mientras otros como Assembler son de bajo nivel ¿Qué significa Alto
y Bajo Nivel?.
Se define como alto nivel aquel lenguaje que está más cerca de ser comprendido por el usuario,
(Basic, C++, etc.) Al fin y al cabo, los dos llegaran al mismo propósito, con significativas diferencias
en cuanto a la eficiencia dada por las instrucciones fáciles de memoria, es un lenguaje intuitivo y
consta de palabras o instrucciones fáciles de entender.

Por otro lado un lenguaje de bajo nivel es aquel que esta más cerca del lenguaje de maquina
(binario). Este lenguaje es utilizado en cuestiones donde la velocidad de respuesta, tiempo y
demás cuestiones muy significativas entran en juego, es decir, donde la mínima variación de un bit
cuenta, no nos referimos a un bir en cuanto a entradas, sino a bit en cada instrucción o contador
del programa (CP) que puede variar en un salto de ciclo a otro en cuestión de micro segundos.

3
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

1.1.4 Pascal
Pascal es un lenguaje de alto nivel: se parece más al lenguaje natural hablado, o al matemático,
que al lenguaje de máquina. Este nivel se alcanza gracias a una pequeña colección de mecanismos
simples pero de una gran potencia: unos permiten estructurar acciones (secuencia, selección e
iteración), otros datos (arrays, registros, ficheros), y otros hacen posible extender el lenguaje,
dotándolo en general con conceptos (datos y operaciones) semejantes a los empleados en el
razonamiento humano sobre los problemas.

La mayoría de los traductores del Pascal son compiladores el programa en Pascal se traduce de
una sola vez a lenguaje máquina antes de ser ejecutado, y en ese proceso se detectan gran
cantidad de errores de forma automática, permitiendo al programador enmendarlos antes de la
ejecución. Como ejemplo de las verificaciones que se efectúa durante la compilación, una de las
más importantes consiste en la compatibilidad de los tipos de los objetos
1.1.5 C+
El lenguaje C dispone de todas las ventajas de un lenguaje de programación de alto nivel
(anteriormente descritas) y le permite realizar algunas operaciones tanto sobre los bytes como
sobre los bits (operaciones lógicas, desplazamiento etc.). Las características de C pueden ser muy
útiles al programar los microcontroladores. Además, C está estandarizado (el estándar ANSI), es
muy portable, así que el mismo código se puede utilizar muchas veces en diferentes proyectos. Lo
que lo hace accesible para cualquiera que conozca este lenguaje sin reparar en el propósito de uso
del microcontrolador. C es un lenguaje compilado, lo que significa que los archivos fuentes que
contienen el código C se traducen a lenguaje máquina por el compilador. Todas estas
características hicieron al C uno de los lenguajes de programación más populares.

4
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Imagen 2

1.1.6 Programación Gráfica:


En un lenguaje de programación gráfica como NI LabVIEW, el mouse es la manera principal de
interactuar con el entorno de programación. Dicho esto, el cursor del mouse debe ser capaz de
completar diferentes tareas, como seleccionar, cablear, resaltar texto y demás. Este módulo
examina las diferentes funciones que el mouse puede realizar en LabVIEW.

Imagen 3

1.1.7 Compiladores

Un compilador es un pequeño programa informático, que se encarga de traducir (compilar) el


código fuente de cualquier aplicación que se esté desarrollando. En pocas palabras, es un software
que se encarga de traducir el programa hecho en lenguaje de programación, a un lenguaje de
máquina que pueda ser comprendido por el equipo y pueda ser procesado o ejecutado por este.

5
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Un concepto un poco más elaborado es el siguiente: Un compilador es un programa que convierte


o traduce el código fuente de un programa hecho en lenguaje de alto nivel, a un lenguaje de bajo
nivel (lenguaje de máquina). (Noguera, 2012)

Imagen 4

1.2 Software de programación

Podemos clasificar los diferentes tipos de software en tres categorías diferentes:

Software de sistema: Permite gestionar y administrar los recursos relativos a la memoria, discos,
puertos, dispositivos de comunicaciones, periféricos (impresoras, pantallas, teclados). Estos
proporcionan al usuario interfaces de alto nivel, controladores, servidores, herramientas y
utilidades para el mantenimiento del sistema.

Software de programación: Se trata de un conjunto de herramientas y utilidades que permiten a


los programadores desarrollar programas informáticos utilizando diferentes lenguajes de
programación o bases de datos. Incluye de manera general: editores de texto, compiladores,
intérpretes, enlazadores y depuradores. También Entornos de Desarrollo Integrados (IDE): que
agrupan en un mismo entorno, habitualmente visual (GUI), todas las herramientas necesarias,

6
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

anteriormente mencionadas, para cubrir el ciclo completo de desarrollo de un programa. Es en


esta categoría en la que nos vamos a centrar en este artículo.

Software de aplicación: Es el que permite a los usuarios realizar tareas específicas, en muchos
casos a través de una interfaz visual de alto nivel (GUI). En otras palabras, son los programas que
se crean con los softwares de programación, para realizar numerosas tareas tanto laborales, como
administrativas, de gestión o con el objetivo simplemente de ocio, como videojuegos. En esta
categoría podríamos englobar a todo el software de gestión empresarial, de telecomunicaciones,
todas las aplicaciones ofimáticas y de control, programas específicos de cualquier área, así como
bases de datos o videojuegos.

Para este curso utilizaremos el simulador PIC Simulator IDE, en este entorno de programación
podremos realizar cada uno de los ejercicios planteados a lo largo de esta capacitación.

1.2.1 Instalación

Los microcontroladores PIC manejan un conjunto de instrucciones reducido (RISC) en lenguaje

ensamblador. En total suman 35 instrucciones que se dividen en tres grupos principales:

- Instrucciones de operación entre registros de tipo Byte o (Byte - Oriented File Register
Operations)

- Instrucciones de operación entre registros de tipo Bit o (Bit - Oriented File Register Operations)

PIC Simulator IDE es un programa creado por Vladimir Soso de la empresa Oshonsoft; esta
aplicación es considerada como uno de los programas más didácticos, amigables y fácil de usar
para el aficionado y estudiante que está incursionando en la programación y desarrollo de
proyectos con microcontroladores PIC; la placa de microcontroladores PIC propuesta para

este documento ha sido elaborada para poder realizar nuestras pruebas sobre este simulador; la
distribución de los puertos por defecto están de acuerdo con este programa, asimismo la
distribución de los pines en el puerto B para controlar la pantalla LCD también han sido adecuados
para este fin.

7
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Pantalla principal del programa:

En la figura siguiente se visualiza la ventana inicial de PIC Simulator IDE; en ella se ven las
aplicaciones principales para la programación
Barra
del PIC, contando con una barra de menú,
selector de microcontrolador y de frecuencia
de reloj, visualización de las instrucciones del
programa, compilado de lenguaje
hexadecimal paso a paso, de donde se está
ejecutando el programa.

Barra de Menú:
Sub
Secciones
En esta sección del programa contiene los
menús para poder manipular archivos de
programa, herramientas de simulación para
dar inicio, parar o finalizar simulación, así
Imagen 5
como simuladores de actuadores o entradas
de señales analógicas o digitales del programa, opciones para editar las propiedades del programa
y del microcontrolador como lo son los puertos, los osciladores.

Sub Secciones de la pantalla principal:

En el espacio “Program location” se puede visualizar la ubicación actual del programa que esta
cargado en el simulador. Cualquier cambio quedará registrado en esa dirección, también en la
casilla “Microcontroller” se tiene el modelo del pic o el código con el cual lo podemos encontrar
ejemplo; si es de la familia, 14XX, 12XX, 16XX, 18XX, etc. En la casilla “Clock frecuency” se puede
observar la frecuencia del oscilador configurado, este se puede cambiar dando doble click en el
mismo.

8
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

1.2.2 Creación de proyectos

Vamos a mostrar la forma en que se crea un programa para un microcontrolador utilizando


lenguaje basic y el software PIC IDE Simulator, de este ultimo se puede descargar una versión de
prueba de la pagina http://www.oshonsoft.com.

1. Activamos el programa PIC Simulator IDE, dirígete a la pestaña Tools, luego selecciona la
herramienta BASIC Compiler

Imagen 6

2. Se abrirá una pantalla emergente parecida a la siguiente donde podemos encontrar más
herramientas y la parte para realizar el código de nuestro programa.

9
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Imagen 7

3. Para guardar el programa seleccionamos la pestaña archivos y seleccionamos Save As, le


colocamos el nombre que consideremos sea el correcto, recordemos que el nombre de
nuestros proyectos deben de ser a fin.

Imagen 8

4. Colocar un nombre significativo al ejercicio, ejemplo si es un encendido de led, seria un Hola


Mundo, recordar seleccionar la carpeta en la que se va a guardar el programa. El programa se

Imagen 9

10
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

guardará en tipo Bas, esto quiere decir que es la programación que nosotros podemos ver en
lenguaje humano.

5. Al guardar puede seguir trabajando, cuando necesite realizar las pruebas dele click en Tools
Compile & Assemble & Load F9 para guardar la programación en .Bas (la programación en
lenguaje hombre), .hex (programación lenguaje máquina, esta también se envía al PIC o
Microcontrolador) y .asm (programación en Assembler).

Imagen 10

1.2.3 Compilación de un proyecto

11
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Imagen 11

Las herramientas que se encuentran a en este menú son para la compilación del programa,
Guardar, cargar y compilar el programa, en estas opciones se realiza la revisión del proyecto de las
líneas de programación y de su sintaxis.

1.2.4 Sintaxis y correlación de errores


Cuando existe un error, regularmente aparece una ventana emergente, indicando la línea en la
que se encuentra el error, únicamente indica que hay un error de sintaxis por ejemplo, como
programadores queda ir a revisar si es un problema de una palabra reservada o un mal teclaso.

12
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Imagen 12

La otra opción es que la línea donde se encuentra con el código erróneo se coloca en color rojo,
indicando donde está el error y así hacer más fácil la corrección del mismo.

13
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Imagen 13

1.3 Representación Gráfica


Diagrama de Flujo: es un diagrama que describe un proceso, sistema o algoritmo informático. Se
usan ampliamente en numerosos campos para documentar, estudiar, planificar, mejorar y
comunicar procesos que suelen ser complejos en diagramas claros y fáciles de comprender.
(LUCIDCHART, 2020)

1.3.1 Simbología

A continuación, te enseñaremos algunos de los símbolos de diagramas de flujo más comunes. Para
obtener una lista más exhaustiva, accede a nuestra completa página de símbolos de diagramas de
flujo.

14
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Definición Simbología

Terminal/Terminador

Proceso

Documento

Decisión

Datos o entrada/salida

Datos almacenados

Flecha de flujo

15
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Comentario o anotación

Proceso predefinido

Referencia/conector dentro
de la página

Referencia/conector fuera de
la página

Tabla 1

1.3.2 Diagramas de circuitos


Para realizar cualquier actividad de programación debemos tomar en cuenta los diagramas de
flujo ya que estos nos ayudan con la lógica antes de la programación.
Ejemplo: Encendido de un diodo led.

16
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Imagen 14

Ejemplo 2: Encendido de un diodo led con 1 segundo de retardo en encendido.

17
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Imagen 15

1.4 Estructura de Programación


A continuación, encontrará la forma correcta de estructurar su programación en el entorno de
desarrollo que utilizaremos, recuerde que cada uno de estos es importante para el cuerpo y la
lectura correcta del programa.
1.4.1 1.4.1 Encabezado
Los encabezados es el conjunto de definición de variables, constantes, puertos de entrada y salida,
encendido o apagado de los puertos o pines, definición de los puertos analógicos o digitales.

18
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Imagen 16

En el siguiente ejemplo tenemos el encabezado que debería de tener todo programa.


AllDigital: esta palabra reservada nos declara que todo el programa trabajará con señales digitales
en todos los pines.
TRISB: Esta palabra reservada sirve para declarar un puerto como entrada o salida. En el caso de
esta instrucción es el puerto bit B0, B1, B2, B3 son entradas y el puerto B4, B5, B6 y B7 son salidas.
1.4.2 Etiquetas
Las siguientes etiquetas validad para nuestra programación son las siguientes:
Nombre de las rutinas: regularmente se colocan etiquetas con nombres significativos ejemplo,
parpadeo_de led: es importante recordar que las etiquetas no debe tener espacios, y al finalizar
debe llevar “ : “.

Imagen 17

19
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Tipos de variables:
Bit – esta conformado por 0 y 1
Byte – tiene 8 bits y está en un rango de 0 a 255
Word – tiene 2 Byte y esta en un rango de 0 a 65,535
Long – tiene 4 byte y esta en un rando de 0 a 4,294,967,295
Single – tiene 4 byte y tiene 7 digitos de precisión.
Definición de variables:
Dim: esta palabra reservada se coloca antes de definir una variable global o local.
Ejemplo:

1.4.3 Código de programa

Imagen 18

20
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Para este programa básico tendremos los siguientes pasos:


a) Colocamos el puerto que definimos como salida encendido o apagado
b) Colocamos un tiempo determinado, en este caso se declaro una variable llamada tiempo con
un valor constante de 20 y la palabra Wait significa esperar, Ms en este caso es una espera en
milisegundos luego se coloca el tiempo o la constante de tiempo.
1.4.4 Comentarios
Para colocar comentarios en nuestro entorno de trabajo utilizaremos el apostrofe “ ‘ “, este
símbolo colocará el texto en verde lo cual no dará ningún error al momento de la compilación del
programa.

Imagen 19

1.4.5 Subrutinas, funciones


Goto: esta instrucción es útil para transportar el flujo del mensaje a otro punto del código donde
esta la equiqueta seguida de “ : “
Las subrutinas también pueden ir después del final del programa, ejemplo:

21
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Imagen 20

1.4.6 Procedimientos
Soporte de lenguaje estructurado (procedimientos y funciones) Los procedimientos se pueden
declarar con la declaración PROC. Pueden contener hasta 5 argumentos (lista separada por comas)
y todos los tipos de datos disponibles se pueden usar para variables de argumento. Las variables
de argumento se declaran localmente, por lo que no necesitan tener nombres únicos en relación
con el resto del programa básico del usuario, lo que hace que sea muy fácil reutilizar los
procedimientos una vez escritos en otros programas básicos. Los procedimientos se pueden salir
con la instrucción EXIT.

Deben terminarse con la declaración END PROC y deben colocarse después de la instrucción END
en el programa. Las llamadas a los procedimientos se implementan con la instrucción CALL. La lista
de argumentos pasados puede contener tanto variables como constantes numéricas.
Por ejemplo:

22
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Imagen 21

Los procedimientos son válidos para las funciones, también. Las funciones se pueden declarar con
la instrucción FUNCTION. Pueden contener hasta 5 argumentos y las variables de argumento se
declaran localmente. Las funciones se pueden salir con la instrucción EXIT y deben finalizarse con
END FUNCTION.

El nombre de la función se declara como una variable global, por lo que si se llama a la función con
la instrucción CALL, después de su ejecución la variable de función contendrá el resultado.
También se puede utilizar la forma estándar de llamadas a funciones en las instrucciones de
asignación.
Un ejemplo sencillo:

23
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Imagen 22

El código fuente básico de un archivo externo se puede incluir en el programa actual mediante la
directiva INCLUDE. Su único argumento es una cadena que contiene la ruta a la fuente externa.
Archivo BAS.
Esta puede ser la ruta completa o solo el nombre del archivo, si el archivo externo se encuentra en
la misma carpeta que el archivo de programa básico actual. Durante el proceso de compilación, la
fuente básica externa se anexará al programa actual. Se pueden incluir varios archivos con
directivas INCLUDE independientes.
Para mantener la estructura general del código básico, se recomienda encarecidamente que el
archivo externo contenga únicamente declaraciones globales, subrutinas, procedimientos y
funciones. Aquí hay un ejemplo muy simple para la demostración:

24
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

1.4.7 Rutinas de servicio de interrupción

El soporte de lenguaje estructurado es un módulo adicional opcional para el compilador básico. El


circuito encargado de detectar la ocurrencia del evento se activa, y como consecuencia, activa la
entrada interrupción del proceso.

Imagen 23

La unidad de control detecta que se ha producido una interrupción y “levanta” una bandera para
registrar esta situación; de esta forma si las condiciones que provocaron el evento desaparecen y
el circuito encargado de detectarlo desactiva la entrada de interrupción del procesador como éste
se producirá de cualquier modo coma porque ha sido registrada.

la unidad de ejecución termina con la instrucción en curso y justo antes de comenzar a ejecutar la
siguiente comprueba que se ha registrado una interrupción.

Se desencadenó un proceso que permite guardar el estado el cual el programa de locución que sea
esta una dirección especial en la memoria programada dónde está la primera instrucción de las
subrutinas de atención de interrupción cómo se ejecutan los códigos de atención de interrupción a
esta parte se le llama “consciente” de todo el proceso porque es donde se realizan las acciones
propias de la tensión a la interrupción y el programador juega su papel.

cuando la subrutina de atención de interrupción se ejecuta la instrucción de retorno se


desencadena el proceso de restauración del proceso al estado que estaba antes de la interrupción,
el proceso de la interrupción podría ser bastante complicado sin embargo tiene 2 ventajas obliga a
su implementación la velocidad es la capacidad de ser asíncronos y éstos permiten aprovechar al
máximo la capacidad de trabajo de nuestro microprocesador, los mecanismos de interrupción no

25
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

no sólo se utilizan para procesos que requieren inmediata atención sino para procesos asíncronos
siendo eficaces para permitir procesar y actuar de varias formas a la vez en base a la situación en
la realidad. (Lehmann, 2010)

Imagen 24

26
PROGRAMACION DE SISTEMAS
PROGRAMACION DE SISTEMAS
MECATRONICOS
MECATRONICOS

Bibliografía
Lehmann, G. (2010). Microcontroladores PIC 16F628A. Informa de trabajo. Guatemala, Guatemala.
Obtenido de https://intecapedu-
my.sharepoint.com/personal/sindy_delacruz_intecap_edu_gt/_layouts/15/onedrive.aspx?id=%2F
personal%2Fsindy%5Fdelacruz%5Fintecap%5Fedu%5Fgt%2FDocuments%2FInformaci%C3%B3n%2
0Personal%2FSindy%2010102018%2FMiercoles%2FMicroPICbASIC%2Epdf&par

Noguera, B. (6 de Septiembre de 2012). Culturación. Obtenido de Que es un Compilador?:


https://culturacion.com/politica-de-privacidad/

Palacios, J. D. (Septiembre de 2013). Diseño de placa entrenadora de microcontroladores


programables pic . Trabajo de Graduación. Guatemala, Guatemala.

27

También podría gustarte