Aprende Electrónica
Primeros Pasos con CCS encender un LED
En la "entrada anterior" aprendimos a descargar e instalar el Compilador CCS, ademas crear nuestro primer código fuente (vacío), en esta entrada aprenderemos un poco mas sobre como empezar a programar, para esto vamos a hacer el hola mundo de la electrónica, encender y apagar un LED. Pero primero vamos a conocer un poco mas sobre este lenguaje de programación.
Los puertos son el punto de comunicación entre el microncontrolador y el mundo exterior , a través de ellos se pueden recibir y enviar señales al exterior para efectuar procesos de control electrónico sobre otros dispositivos.
En el lenguaje CCS se pueden gestionar los puertos de 2 formas:
1.- Declarando los registros TRISX y PORTX.
Se definen los registros PORTx y TRISx como bytes y se sitúan en la posición correspondiente de la memoria RAM. La directiva utilizada de C es #BYTE
2.- Utilizando las directivas especificas del compilador.
El Lenguaje C admite unas directivas de compilación que le dicen al compilador cómo debe tratar los TRIS del puerto, esta es la manera mas simple de hacerlo y es la que usaremos.
Estas directivas son: USE FAST_IO, USE FIXED_IO, USE_STANDARD_IO
Si declaramos un puerto cómo #USE FAST_IO(PUERTO)
Es el usuario quien debe asegurarse de que el sentido del pin es el correcto y para ello debe colocar antes de leer o escribir en el puerto correspondiente el SET_TRIS_X(0b00000000) para indicar el uso de entrada o salida de cada bit del puerto.
Si declaramos un puerto cómo #USE FIXED_IO(PUERTO_OUTPUTS=1,3,5,7)
El compilador genera e inserta en tu código los SET_TRIS_X(0b10101010) correspondientes a dicha declaración independiente del uso que tus instrucciones hagan después de dichos pines. Si has declarado con FIXED_IO de salida el pin 1 del puerto X y después lo lees el compilador no hará nada y estarás leyendo un puerto de salida.
Si por último declaramos el puerto cómo #USE STANDARD_IO(PUERTO)
El compilador generará automáticamente e insertará antes de cualquier operación de entrada o salida de cualquier pin del puerto X los SET_TRIS_X() correspondientes a la instrucción que le sigue. Esto hace que los TRIS siempre estén de acuerdo con la instrucción a ejecutar. Si colocamos en nuestro código un OUTPUT_HIGH(PIN_B0) y el puerto B está declarado como #USE STANDARD_IO(B) justo antes del output habrá un TRIS declarando el PIN_B0 como salida, si a continuación ponemos un INPUT_(PIN_B0) el compilador pondrá ahora un TRIS para declarar PIN_B0 como entrada.
Este #USE STANDARD_IO(X) es el modo POR DEFECTO de todos los puertos en CCS si no se declara lo contrario.
Gestión de los puertos a través de Directivas:
Las funciones para trabajar bit a bit son:
Las estructuras de control repetitivas o iterativas, también conocidas como bucles se pueden usar cuando se quiere repetir cierta parte del código n veces, otras permiten repetir un segmento de código cuando se cumplen ciertas condiciones.
Bucle WHILE
Este bucle ejecuta una instrucción o un conjunto de instrucciones mientras la condición se cumpla, generalmente a la condición se le coloca el valor true, para que siempre se repita.
Este bucle permite ejecutar una instrucción o un bloque de instrucciones una cantidad determinada de veces. se suele reemplazar por el ciclo while cuando se conoce o se desea un cierto numero de iteraciones.
La directiva FUSES establece los distintos bits de configuración del micro, los mismos que puedes seleccionar en tu software de grabación.
Cada micro tiene los suyos, y los podrás encontrar en el apartado "Configuration Word" del correspondiente datasheet, En CCS puedes encontrar los fuses correspondientes al microcontrolador que estamos usando en el menú VIEW > CONFIG BITS.
Nos aparecerá una lista con todos los fuses de microcontrolador que seleccionamos.
WDT (Watchdog Timer):
OSC (Oscilador):
XT: viene de XTAL (cristal). Este modo de funcionamiento implica que tendremos que disponer de un cristal de cuarzo externo al Pic y dos condensadores.
HS: Para cuando necesitemos aplicaciones de "alta velocidad", mas de 8Mhz. Se basa también en un cristal de cuarzo, como el XT.
PUT (Power Up Timer Reset):
Ahora ya tenemos los conocimientos básicos necesarios para realizar nuestro primero proyecto el hola mundo de la electrónica encender y apagar un LED, vamos allá.
PROYECTO: Encender y apagar un LED, ademas agregar un retardo para que el encendido y apagado del led pueda ser visualizado correctamente.
Código:
Gestión de los puertos de Entrada y Salida:
Los puertos son el punto de comunicación entre el microncontrolador y el mundo exterior , a través de ellos se pueden recibir y enviar señales al exterior para efectuar procesos de control electrónico sobre otros dispositivos.
En el lenguaje CCS se pueden gestionar los puertos de 2 formas:
1.- Declarando los registros TRISX y PORTX.
Se definen los registros PORTx y TRISx como bytes y se sitúan en la posición correspondiente de la memoria RAM. La directiva utilizada de C es #BYTE
#BYTE variable=constante;
#BYTE TRISA = 0x85 //dirección del registro TRISA en el banco de memoria #BYTE PORTA = 0x05 //dirección del registro PORTA en el banco de memoria #BYTE TRISB = 0x86 //dirección del registro TRISb en el banco de memoria #BYTE PORTB = 0x06 //dirección del registro PORTB en el banco de memoriaUna vez definidas estas variables se pueden configurar y controlar los puertos.
TRISA = 0xFF; // todos los pines de entrada TRISB = 0x00; // todos los pines de salida TRISC = 0x0F; // 4 terminales de salida, 4 terminales de entradaTambién podemos trabajar bit a bit con los registros o variables definidas previamente.
bit_clear(PIN_B0) ; //Pone a 0 el bit especifico de la variable bit_set(PIN_B0); //Pone a 1 el bit especifico de la variable bit_test(PIN_B0); //Muestra el bit especifico de la variableo podemos definir todos los bits del puerto de una vez con:
PORTC = 0xFF; //define todo el puertoA a 1
2.- Utilizando las directivas especificas del compilador.
El Lenguaje C admite unas directivas de compilación que le dicen al compilador cómo debe tratar los TRIS del puerto, esta es la manera mas simple de hacerlo y es la que usaremos.
Estas directivas son: USE FAST_IO, USE FIXED_IO, USE_STANDARD_IO
Si declaramos un puerto cómo #USE FAST_IO(PUERTO)
Es el usuario quien debe asegurarse de que el sentido del pin es el correcto y para ello debe colocar antes de leer o escribir en el puerto correspondiente el SET_TRIS_X(0b00000000) para indicar el uso de entrada o salida de cada bit del puerto.
Si declaramos un puerto cómo #USE FIXED_IO(PUERTO_OUTPUTS=1,3,5,7)
El compilador genera e inserta en tu código los SET_TRIS_X(0b10101010) correspondientes a dicha declaración independiente del uso que tus instrucciones hagan después de dichos pines. Si has declarado con FIXED_IO de salida el pin 1 del puerto X y después lo lees el compilador no hará nada y estarás leyendo un puerto de salida.
Si por último declaramos el puerto cómo #USE STANDARD_IO(PUERTO)
El compilador generará automáticamente e insertará antes de cualquier operación de entrada o salida de cualquier pin del puerto X los SET_TRIS_X() correspondientes a la instrucción que le sigue. Esto hace que los TRIS siempre estén de acuerdo con la instrucción a ejecutar. Si colocamos en nuestro código un OUTPUT_HIGH(PIN_B0) y el puerto B está declarado como #USE STANDARD_IO(B) justo antes del output habrá un TRIS declarando el PIN_B0 como salida, si a continuación ponemos un INPUT_(PIN_B0) el compilador pondrá ahora un TRIS para declarar PIN_B0 como entrada.
Este #USE STANDARD_IO(X) es el modo POR DEFECTO de todos los puertos en CCS si no se declara lo contrario.
Gestión de los puertos a través de Directivas:
output_X(valor); //Por el puerto correspondiente saca el valor (0-255). input_X(); //Se obtiene el valor en el puerto correspondiente. set_tris_X(valor); //Carga el registro TRISx con el valor (0-255) port_b_pullups(true); //Habilita las resistencias pul-up en el PORTB . get_trisX(); //Devuelve el valor del registro TRISx (x es A,B,C,D…)
Las funciones para trabajar bit a bit son:
output_low(pin*) //Pin a 0. output_high(pin*) //Pin a 1 output_bit(pin*,valor) //Pin al valor especificado input(pin*); //Lee el valor del pin.
Estructuras de Control Repetitivas
Bucle WHILE
Este bucle ejecuta una instrucción o un conjunto de instrucciones mientras la condición se cumpla, generalmente a la condición se le coloca el valor true, para que siempre se repita.
while(condición) { segmento de código a repetir }Bucle FOR
Este bucle permite ejecutar una instrucción o un bloque de instrucciones una cantidad determinada de veces. se suele reemplazar por el ciclo while cuando se conoce o se desea un cierto numero de iteraciones.
for(int i=0;i<10;i++) { bloque; }
Configuración de los FUSES
La directiva FUSES establece los distintos bits de configuración del micro, los mismos que puedes seleccionar en tu software de grabación.
Cada micro tiene los suyos, y los podrás encontrar en el apartado "Configuration Word" del correspondiente datasheet, En CCS puedes encontrar los fuses correspondientes al microcontrolador que estamos usando en el menú VIEW > CONFIG BITS.
Nos aparecerá una lista con todos los fuses de microcontrolador que seleccionamos.
De esta lista los mas importantes son:
WDT (Watchdog Timer):
#fuses WDT #fuses NOWDTEl famoso "perro guardian" del pic. Esta es una capacidad del pic de autoresetearse. Es muy útil, por ejemplo si un Pic, por un descuido de programación, se queda en un bucle infinito, esta "utilidad" lo sacará de él. Su funcionamiento es sumamente sencillo. Simplemente es un registro que debemos borrar cada cierto tiempo. Si transcurrido un cierto tiempo el registro no ha sido borrado el pic se resetea.
OSC (Oscilador):
#fuses HS #fuses XTEs el modo de oscilación que va a usar el Pic, los mas usados son:
XT: viene de XTAL (cristal). Este modo de funcionamiento implica que tendremos que disponer de un cristal de cuarzo externo al Pic y dos condensadores.
HS: Para cuando necesitemos aplicaciones de "alta velocidad", mas de 8Mhz. Se basa también en un cristal de cuarzo, como el XT.
PUT (Power Up Timer Reset):
#fuses PUT #fuses NOPUTSi activamos este FUSE, lo que conseguimos es que se genere un retardo en la inicialización del Pic. Esto se usa para que la tensión se estabilice, por lo que se recomienda su uso.
Ahora ya tenemos los conocimientos básicos necesarios para realizar nuestro primero proyecto el hola mundo de la electrónica encender y apagar un LED, vamos allá.
PROYECTO: Encender y apagar un LED, ademas agregar un retardo para que el encendido y apagado del led pueda ser visualizado correctamente.
Código:
#include <16f886.h> //definimos que microncontrolador usaremos #fuses nowdt //no usar el WDT (watchdog timer) #use delay(clock=20M) //definimos un cristal de 20Mhz. void main() //declaramos la función principal { while(true) //bucle infinito { output_high(pin_b0); //Pin B0 en alto delay_ms(200); //retardo de 200ms output_low(pin_b0); //Pin B0 en bajo delay_ms(200); //retardo de 200ms } }Esquema Proteus:
Como Incorporar una Pantalla LCD
En esta entrada aprenderemos a utilizar una pantalla LCD la mas común es la 2x16
PROYECTO: Enviar un mensaje a una pantalla LCD conectada al puertoC de microcontrolador.
CCS dispone de una librería para trabajar con pantallas LCD llamada lcd.h la cual llamamos con la
instrucción: #include <lcd.c>
La abrimos como muestra la imagen y dentro encontramos los comandos necesarios para controlarla:
El codigo queda como sigue:
Montaje en PROTEUS
Esta es la manera de conectar la LCD generalmente usaremos 4 lineas para los datos (D4-D7) los bits RS,RW , GND VDD y VEE pin al cual ira un potenciómetro para regular el contraste, ademas de los pines bk+ y bk- para el blackligth en las pantallas que traen iluminación LED de fondo.
PROYECTO: Enviar un mensaje a una pantalla LCD conectada al puertoC de microcontrolador.
CCS dispone de una librería para trabajar con pantallas LCD llamada lcd.h la cual llamamos con la
instrucción: #include <lcd.c>
La abrimos como muestra la imagen y dentro encontramos los comandos necesarios para controlarla:
lcd_init() Must be called before any other function. lcd_putc(c) Will display c on the next position of the LCD. \a Set cursor position to upper left \f Clear display, set cursor to upper left \n Go to start of second line \b Move back one position lcd_gotoxy(x,y) Set write position on LCD (upper left is 1,1) lcd_getc(x,y) Returns character at position x,y on LCD CONFIGURACION Nos dice que podemos controlarla de 2 maneras utilizando a.) acceso por puerto con este codigo le decimos que utilizaremos un completo. ejemplo: #define LCD_DATA_PORT getenv("SFR:PORTC") b.) acceso por pines aquí podemos usar los pines de la manera que queramos. ejemplo: #define LCD_ENABLE_PIN PIN_C0 #define LCD_RS_PIN PIN_C1 #define LCD_RW_PIN PIN_C2 #define LCD_DATA4 PIN_C4 #define LCD_DATA5 PIN_C5 #define LCD_DATA6 PIN_C6 #define LCD_DATA7 PIN_C7
El codigo queda como sigue:
#include <16F886.h> #FUSES NOWDT //No Watch Dog Timer #use delay(crystal=20000000) //reloj de 20Mhz #define LCD_DATA_PORT getenv("SFR:PORTC") //indicamos lcd conectada a PuertoC #include <lcd.c> //librería LCD viene con el compilador void main() { lcd_init(); //inilicializar LCD while(TRUE) { lcd_gotoxy(1,1); //ir a la linea 1 posicion 1 printf(lcd_putc,"LCD 16x2"); //mensaje en linea1 delay_ms(50); //retardo de 50ms lcd_gotoxy(1,2); //ir a la linea 2 posicion 1 printf(lcd_putc,"hacermirobot"); //mensaje linea 2 delay_ms(50); //retardo de 50ms } }
Montaje en PROTEUS
PIC C Compiler CCS
Descripción
PIC C Compiler es un inteligente y muy optimizado compilador C que contienen operadores estándar del lenguaje C y funciones incorporados en bibliotecas que son específicas a los registros de PIC, proporcionando a los desarrolladores una herramienta poderosa para el acceso al hardware las funciones del dispositivo desde el nivel de lenguaje C.
El compilador CCS contiene más de 307 funciones integradas que simplifiquen el acceso al hardware, mientras que la producción eficiente y altamente optimizado código. Se incluyen funciones de hardware del dispositivo de características tales como:
- Temporizadores y módulos PWM
- Convertidores A / D de datos on-chip
- EEPROM.
- Controladores LCD
- Memoria externa buses
- Entre otras...
Link de Descarga: Compilador C CCS 5.015 Full
https://mega.nz/#!d0x2QbKb!Wb6v1rCbWh5hSQX_fzcktgFg3vZw1UdiHh__fGDGVJc
Link de Descarga: Manual CCS C Ingles.pdf
http://www.mediafire.com/view/o2xvod4w97c41ox/Manual_CCS_C_Ingles.pdf
Link de Descarga: Manual CCS C Español.pdf
http://www.mediafire.com/view/bho4vtm67t419rr/Manual_CCS_C_espa%C3%B1ol.pdf
- Descomprimir el archivo descargado
- Ejecutar el archivo "ideutilsupd.exe", siga los pasos de instalacion
- Ejecutar el archivo "pcwhdupd.exe", siga los pasos de instalacion
- Para aplicar el crack primero abrimos la carpeta crack y copiamos los archivos: "pcb.crg", #pcd.crg", "pch.cgr", "pcm.crg" luego copiamos en la carpeta donde se instaló el programa: c:\program files (x86)\picc
- Reiniciamos nuestra pc y listo!!
para esto Vamos a FILE > NEW > Source File nos aparece una ventana donde intrudicimos el nombre y la ubicación del archivo fuente que crearemos.
Nos aparece una ventana en blanco como la siguiente, donde podemos empezar a escribir nuestro primer código CCS.
Simulador PROTEUS
Descripción
Proteus es un entorno integrado diseñado para la realización completa de proyectos de construcción de equipos electrónicos en todas sus etapas: diseño, simulación, depuración y construcción.
Con Proteus podrás realizar circuitos impresos con la mayor calidad. Si estás trabajando en el desarrollo de algún producto electrónico, esta aplicación te será de gran ayuda. Junto a ella diseñarás y simularás PCBs con las mejore herramientas y en un entorno completamente funcional.
Este software está conformado por dos dispositivos principales: ISIS y ARES. El primero de ellos será el encargado de la generación de circuitos reales. Una ventaja que te ofrecerá esta herramienta es la de evaluar el funcionamiento de tu trabajo en un PCB. De ese modo prevendrás errores y corregirás fallas.
En cuanto a ARES, su función consistirá en enrutar, situar y editar los diferentes componentes que hacen a la fabricación de placas PCB. En este sentido, convertirá tu diseño de modo que pueda ser aplicado en cada pieza de un circuito impreso. Además, dispondrás de un calificado espacio de simulación generado con la mejor tecnología.
Link de Descarga:
https://mega.nz/#!0lJy3D4S!Z3E-T7b4YsOLwDVlGYrbZJCGCknsXXqP0-YlNnhaU-8
Libro Compilador C CCS
Título: Compilador CCS y simulador Proteus para microcontroladores PIC.
Autor: Eduardo García Breijo.
Idioma: Español.
Tipo de archivo: pdf
Tamaño: 27,73 MB.
Autor: Eduardo García Breijo.
Idioma: Español.
Tipo de archivo: pdf
Tamaño: 27,73 MB.
Descripción
Es un libro orientado a la programación de microcontroladores PIC utilizando el compilador CCS y el lenguaje C. También incluye tutoriales para probar los ejemplos y simularlos en el Proteus, un excelente programa que permite la simulación y prueba de circuitos. Una característica muy interesante es que permite utilizar microcontroladores y simular la ejecución del programa.
Está enfocado a todos aquellos lectores movidos por el interés acerca de los microcontroladores PIC sin necesidad de tener conocimientos muy profundos en la materia. Los ejemplos desarrollados no tienen una excesiva complejidad, son breves y permiten ir afianzando los conocimientos capítulo a capítulo.
Contenido
En el capítulo 1 de este libro se hace una breve, pero intensa, descripción del ISIS de PROTEUS, de forma que el lector pueda afrontar la simulación de diseños sin ning·n problema. En el capítulo 2 tambien se realiza un repaso del compilador C para PIC de CCS; obviamente no puede explicarse este lenguaje en un solo capítulo,
pero tras su lectura cualquier lector podrá afrontar los pequeños programas de diseño que se exponen en los siguientes capítulos.
Del capítulo 3 al 7 se desarrollan los distintos módulos que integran un PIC (ADC, USART, CCP, etc.) a nivel hardware, enlazándolos con las correspondientes directivas y funciones del C. En cada capítulo se plantean y desarrollan sencillos ejemplos de aplicación que el lector podrá estudiar y, como no, modificar para completar sus conocimientos.
En el capítulo 8 se expone la gama alta (PIC18) y en el capítulo 9 una aplicación más compleja, el RTOS (Real Time Operating System). también en estos capítulos se incorporan distintos ejemplos de aplicación. Por ultimo, en el capítulo 10 se desarrolla el USB de reciente incorporación al ISIS.
Índice
1. ISIS de PROTEUS VSM
2. Compilador CCS C
3. La gestión de los puertos
4. Las interrupciones y los temporizadores
5.Convertidor Analógico Digital y Digital Analógico
6. Módulo CCP Comparador, Captura y PWM
7. Transmisión serie
8. Gama Alta PIC18
9. RTOS Real Time Operating System
11. ARES de PROTEUS VSM{
Link de Descarga:
http://www.mediafire.com/view/zz6bu4nhry36th4/Libro_Compilador_C.pdf
Que lenguaje usar para programar Microcontroladores PIC
Es la primera pregunta que debemos contestarnos al querer programar un microcontrolador, frente a esta pregunta eres tu el que debe decidir el lenguaje de programación, en esta entrada expongo el porque he elegido hacerlo en CCS.
ASSEMBLER
En mi opinión este es el mejor lenguaje para comenzar a programar, esto si queremos saber exactamente que estamos haciendo con el microcontrolador.Mi recomendación es comenzar con lenguaje ensamblador aprender a utilizar los puertos a configurar registros etc, todo lo básico. Y luego pasarse a un lenguaje de alto nivel como CCS o C18. Esto es opcional si quieres comenzar directamente con CCS puedes hacerlo.
Ventajas
- Precisión: Controla totalmente la operación del microcontrolador y permite al programador precisión en las operaciones.
- Herramienta educacional: permite conocer a detalle la arquitectura interna del microcontrolador, el set de instrucciones, los registros y su funcionamiento interno.
- Tamaño: los compiladores generan más código máquina del necesario; por ello, el programa ejecutable crece. Por lo tanto cuando es importante reducir el tamaño del ejecutable, optimizando el uso de la memoria y teniendo también beneficios en velocidad, puede convenir usar el lenguaje Ensamblador.
Al ser un lenguaje más primitivo, el Ensamblador tiene ciertas desventajas:
- Tiempo programando: Para aplicaciones complejas no recomendaría asembler ya que se debe invertir una cantidad de tiempo muchísimo mayor que con otros lenguajes.
- Falta de potabilidad: debido a que depende de la estructura interna del microcontrolador, el código de un microcontrolador no puede correr en otro de diferente arquitectura.
Ejemplo de código assembler
PROCESSOR 16f886 ;seleccionamos que microcontrolador usaremos #INCLUDE <16f886.inc> ;carga librería del microcontrolador ORG 0x00 ;origen de programa bsf STATUS,RP0 ;acceso al banco 1 de la memoria movlw b'0001111' movwf TRISA ;configura el puertoA como entrada clrf TRISB ;configura el puertoB como salida bcf STATUS,RP0 ;RP0 a 0 para acceder al banco 0 inicio movf PORTA,W ;mueve el contenido del PuertoA a W movwf PORTB ;mueve el dato de W al puertoB goto inicio ;salta a inicio y entra en un bucle END ;fin del código
EL LENGUAJE C
- Facilidad de uso: Los programas en C son más fáciles de mantener (revisar, modificar, ampliar).
Existen muchísimas librerías libremente disponibles para el uso de cualquier programador, lo cual facilita el desarrollo de una aplicación.
- Potabilidad: Generalmente un programa escrito para un tipo de microcontrolador puede correr con mínimas modificaciones en otro microcontrolador de diferente arquitectura.
- Eficiencia: Es más rápido y eficiente que otros lenguajes de alto nivel usados también para programar microcontroladores y su uso está altamente difundido en aplicaciones profesionales. Con compiladores modernos puede llegar a ser tan rápido como el ensamblador dependiendo de la habilidad y los recursos del programador.
Desventajas:
- El código escrito en C ocupa más memoria que el escrito en ensamblador.
Los programas al compilarlos pueden resultar un poco extensos y pesados por ello debe tenerse en cuenta la capacidad de memoria de programa del PIC a utilizar.
- Control:Con este lenguaje no se puede controlar del todo los tiempos y los registros bit a bit.
Compilador CCS PCW HD
Este es un compilador de punto flotante que puede integrarse al ambiente MPLAB IDE de Microchip.Un dato importante de este compilador, es que abstrae del hardware, y con ello sacas muy rápido tus proyectos, no tienes que conocer tan finamente al microcontrolador que programas y sus "modulos", ademas trae una cantidad de librerías y programas de ejemplos,esto acorta increíblemente los tiempos de aprendizaje y desarrollo de los proyectos.
A continuación veremos algunas características que presenta el compilador PCW CCS y que hacen de él una buena opción para elegirlo como compilador de C para programar Microcontroladores PIC
- Al compilar genera un código máquina muy compacto y eficiente.
- Se integra perfectamente con MPLAB y otros simuladores/emuladores como PROTEUS para el proceso de depuración.
- Incluye una biblioteca muy completa de funciones precompiladas para el acceso al hardware de los dispositivos (entrada/salida, temporizaciones, conversor A/D, transmisión RS-232,bus I2C….,etc.
- Tiene numerosas librerías ya integradas al compilador para dispositivos externos, tales como pantallas LCD, teclados numéricos, memorias EEPROM, conversores A/D, relojes en tiempo real, etc.
- Permite insertar partes de código directamente en Ensamblador, manteniendo otras partes del programa en C.
Suscribirse a:
Entradas (Atom)