Autor Tema: Modo Sleep  (Leído 6637 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Modo Sleep
« en: 06 de Junio de 2008, 15:46:08 »
Hola muchachos... tengo un problemita! estoy probando el modo sleep, del 4550, vi en la ayuda del ccs que solo s ejecuta con la instrucción sleep();, o.k, bueno mi programa trata de tomar una muestra de uno de los canales de ADC del pic, luego la muestro y mando a dormir al micro, y luego con el desborde del perro pues que me lo despierte! el problema es que cuando simulo, me da un poco de advertencias diciendome que el micro siempre está dormido, y pos no me hace nada!!! :( Hay que hacer otra configuración aparte para trabajar en este modo?

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado PalitroqueZ

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: Modo Sleep
« Respuesta #1 en: 06 de Junio de 2008, 16:33:37 »
el ADC puedes hacerlo trabajar en modo sleep, pero cambiando al reloj interno (modo RC) pero será mas lento la conversión.

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Modo Sleep
« Respuesta #2 en: 06 de Junio de 2008, 16:51:05 »
Aja, si eso lo se... Pero el problema es que cuando mando a dormir al micro, pues todo el tiempo duerme!..

Es decir, mi idea es: Toma el dato, que lo muestre, luego que se vaya a dormir hasta que el perro lo despierte y luego tome otro dato, lo vuelve a mostrar, vuelva a dormir... y así sucesivamente! pero resulta que todo el tiempo está dormido!!!

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Modo Sleep
« Respuesta #3 en: 06 de Junio de 2008, 23:21:59 »
Hola Enigma, puedes postear el código? Así es mucho más facil detectar el error, pues puede ser un problema de configuración como de programación, a mi me suena más a lo primero. Lo que tu quieres hacer se puede implementar tranquilamente y yo lo he hecho con un PIC 18F2550.

Para detectar donde se encuentra el error haste las siguientes preguntas:

¿El micro toma al menos una medición y luego entra en modo sleep para no despertar o nunca toma ninguna medición?
¿Esta correctamente configurado el WDT? Recuerda que en el 18F4550 el control del WDT se realiza tanto por software como por hardware, lo cual a veces confunde y trae inconvenientes.

No puedo ayudarte más sin tener el código que estas utilizando. Saludos.



"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Modo Sleep
« Respuesta #4 en: 07 de Junio de 2008, 18:01:06 »
Hola Gonzalo_BlackHawk, gracias por el interes, pues con respecto a:

Cita de: Gonzalo_BlackHawk
¿El micro toma al menos una medición y luego entra en modo sleep para no despertar o nunca toma ninguna medición?

La respuesta es si, el toma una medición muestra en pantalla y se va a dormir....

Cita de: Gonzalo_BlackHawk
¿Esta correctamente configurado el WDT? Recuerda que en el 18F4550 el control del WDT se realiza tanto por software como por hardware, lo cual a veces confunde y trae inconvenientes.

Bueno, utilice la misma configuración del perro que use en un programa anterior, y me funcionaba al peluche!!!

Aquí dejo el codigo...

#include <18f4550.h>
#DEVICE ADC=8
#fuses NOPROTECT,NOCPD,NOLVP,WDT32,XT,MCLR
#use fast_io (A)
#use fast_io (B)
#use fast_io (C)
#use fast_io (D)
#use fast_io (E)
#use delay(clock=4000000)
#include <LCD16.c>                                      // Libreria que controla los comandos de la LCD
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)          // Habilita las funciones RS232, velocidad a 9600 baudios
#byte RCON=0xFD0                                        // Registro que controla el reset por POR (POWER ON RESET)
#bit POR=RCON.1                                         // Bit de la bandera del Power On Reset
#bit IPEN=RCON.7                                        // Habilita la prioridad de las interrupciones
#byte PIR2=0xFA1                                        // Registro de control de las interrupciones
#bit USBIF= PIR2.5                                      // Bit de control de interrupción por USB
#byte INTCON1=0xFF2                                     // Registro de control de las interrupciones
#bit RBIF=INTCON1.0                                     // Bit de Interrupción por cambio en el puerto B (RB4-RB7).
#byte INTCON3=0xFF2                                     // Registro de control de interrupciones
#byte PIE1=0xF9D                                        // Registro de habilitación de interrupciones perifericas
#byte PIE2=0xFA0                                        // Registro de habilitación de interrupciones perifericas

//::::::::::::::::::::::::::Declaración de variables:::::::::::::::::::::::::::::::::::::
float value,dato,value_antiguo;
int caracter;

//::::::::::::::::::::::::::Declaración de Funciones:::::::::::::::::::::::::::::::::::::
void menu(void);                                        // Función que me muestra el menú de opciones
void ajustar_trans(void);                               // Función que calibra al transmisor
void  enviar_rs485(void);                               // Función que envia los datos vía RS485

//::::::::::::::::::::::Interrupción por RB0:::::::::::::::::::::::::::::::::::::::::::::::::::

#INT_EXT
EXT_isr()
{
   menu();
}

//:::::::::::::::::::::::::::Programa Principal:::::::::::::::::::::::::::::::::::::::::::
void main(void)
{
         set_tris_a(0x01);                            // Puerto A, como b'00000001
         set_tris_c(0x00);                            // Puerto C, como b'00000000
         set_tris_b (0xFF);                           // Configura puerto b como entrada
         set_tris_d(0x00);                            // Puerto D, como b'00000000
         set_tris_e(0x08);                            // Puerto E, como b'00001000
         output_a(0);                                 // Limpio el puerto A
         output_b(0);                                 // Limpio el puerto B
         output_c(0);                                 // Limpio el puerto C
         output_d(0);                                 // Limpio el puerto D
         output_e(0);                                 // Limpio el puerto E
         output_high(PIN_E0);                         // Enciendo un Led (Indicador de circuito funcionando)
         port_b_pullups(TRUE);                        // Activo las pullups
         enable_interrupts(global);                   // Habilito todas las interrupciones
         enable_interrupts(int_ext);                  // Activa máscara INTE (Activo interrupción po RB0)
         setup_port_a(AN0_ANALOG );                   // RA0 son analógicos y los demás son digitales
         setup_adc(ADC_CLOCK_INTERNAL );              // Tomará el dato contando el tiempo con el reloj interno
         ext_int_edge (H_TO_L);                       // Flag INTF si flanco de bajada.
         USBIF=0;                                     // El USB no provoco ninguna interrupción
         IPEN=1;                                      // Deshabilito la prioridad de las interrupciones
         RBIF=0;                                      // RB4-RB7 no provocó una interrupción externa por cambio
         PIE1=0x00;                                   // Deshabilito interrupciones por otros perifericos (CCP,USART, etc)
         PIE2=0x00;                                   // Deshabilito interrupciones por otros perifericos (USB, Oscilador, colisión, memoria, etc)
         if(POR==0)                                   // Reset por POR
         {
            output_high(PIN_C1);                      // Enciendo un led de prueba
            delay_ms(1000);                           // Una demora para que se estabilicen los voltajes
            POR=1;                                    // Limpio la bandera del POR
            output_low(PIN_C1);                       // Apago un led de prueba
         }
         lcd_init();                                  // Para inicializar el LCD

//*************************************************************
//*                     CICLO PRINCIPAL                       *
//*************************************************************


   lcd_enviar(LCD_COMANDO,LCD_CLEAR);       // Borro pantalla LCD
   delay_ms(5);                             // Retardo para el comando de la LCD
   printf("\f");                            // Borro pantalla del hiperterminal
   printf("*      Transmisor de Presion Diferencial        *\n\r ");
   lcd_gotoxy(1,1);                         // Posiciona el cursor
   printf(lcd_putc,"  Transmisor");         // Visualiza mensaje
   lcd_gotoxy(1,2);                         // Posiciona el cursor
   printf(lcd_putc,"  de Presion ");        // Visualiza mensaje
   lcd_gotoxy(1,3);                         // Posiciona el cursor
   printf(lcd_putc,"  Diferencial");        // Visualiza mensaje
   delay_ms(3000);                          // Visualizo la información por 3 segundos
   printf("*       Realizado por Marlin Vargas             *\n\r ");
   lcd_enviar(LCD_COMANDO,LCD_CLEAR);       // Borro pantalla LCD
   delay_ms(5);                             // Retardo para el comando de la LCD
   lcd_gotoxy(1,1);                         // Posiciona el cursor
   printf(lcd_putc,"Realizado por:");       // Visualiza mensaje
   lcd_gotoxy(1,2);                         // Posiciona el cursor
   printf(lcd_putc,"Vargas Marlin");        // Visualiza mensaje
   delay_ms(50);                            // Retardo para el comando de la LCD
   delay_ms(3000);                          // Visualizo la información por 3 segundos

ADC:
   lcd_enviar(LCD_COMANDO,LCD_CLEAR);       // Borro pantalla LCD
   delay_ms(5);                             // Retardo para el comando de la LCD
   value_antiguo=0;
         while(true)
         {
            set_adc_channel(0);                             // El canal de adquisición del dato es el RA0
            delay_us(10);                                   // Un retardo para capturar bien el dato
            value=read_adc();                               // Leo el dato
            dato=(value*5)/255;                             // Convierto el valor a decimal y lo guardo

            if(value!=value_antiguo)
            {
//               printf(lcd_putc,"\f");                     // Borro pantalla
               lcd_enviar(LCD_COMANDO,LCD_CLEAR);           // Borro pantalla LCD
               printf("\f");                                // Borro pantalla del hiperterminal
               delay_ms(10);                                // Retardo para el comando de la LCD
               lcd_gotoxy(1,1);                             // Posiciona el cursor
               printf(lcd_putc,"Voltaje= %2.2g",dato);      // Mando a mostrar el valor del conversor en la LCD
               printf("****************************************\n\r ");
               printf("                                        \n\r ");
               printf("                                        \n\r ");
               printf("         Voltaje= %2.2g V",dato);    // Mando a mostrar el valor del conversor en el hiperterminal
               printf("                                        \n\r ");
               printf("                                        \n\r ");
               printf("****************************************\n\r ");
               value_antiguo=value;
               delay_ms(250);
            }

            if(input(PIN_B1)==0)                         // ¿Ajustar el transmisor?
               {
                  ajustar_trans();                       // Si, voy a la función ajustar
               }

            if(input(PIN_B3)==0)                         // ¿Enviar via RS485?
               {
                  enviar_rs485();                        // Si,  voy a la función que envia a través del RS485
               }
            SLEEP();                                     // Mando a dormir al micro

           }

}
//::::::::::::::::::::::::::::Función que permite ver el memú de opciones::::::::::::::::::::::::::::::
     void menu(void)
      {
         lcd_enviar(LCD_COMANDO, LCD_CLEAR);               // Envía comando al LCD
         delay_ms(5);                                      // Retardo para el comando de la LCD
         lcd_gotoxy(1,1);                                  // Posiciona el cursor
         printf(lcd_putc,"   Menu");                       // Visualiza mensaje
         lcd_gotoxy(1,2);                                  // Posiciona el cursor
         printf(lcd_putc,"(A)Ajuste");                     // Visualiza mensaje
         lcd_gotoxy(1,3);                                  // Posiciona el cursor
         printf(lcd_putc,"(B)Envio RS232");                // Visualiza mensaje
         lcd_gotoxy(1,4);                                  // Posiciona el cursor
         printf(lcd_putc,"(C)Envio RS485");                // Visualiza mensaje
         delay_ms(50);                                     // Retardo para el comando de la LCD
         delay_ms(4000);                                   // Visualizo la información por 4 segundos
      }

//::::::::::::::::::::::::::::Función que permite calibrar el transmisor::::::::::::::::::::::::::::::
void ajustar_trans(void)
{
   lcd_enviar(LCD_COMANDO,LCD_CLEAR);       // Borro pantalla LCD
   delay_ms(5);                             // Retardo para el comando de la LCD
   printf("\f");                            // Borro pantalla del hiperterminal
   printf(lcd_putc,"Ajuste transmisor");    // Visualiza mensaje
   printf("                                        \n\r ");
   printf("         Ajuste del Transmisor          \n\r ");
   printf("                                        \n\r ");
   output_high(PIN_C2);                     // Enciendo un led
   delay_ms(1000);                          // Tiempo de encendido del Led
   output_low (PIN_C2);                     // Apago el Led
}

//::::::::::::::::::::::::::::Función que permite enviar los datos via RS485::::::::::::::::::::::::::::::
void  enviar_rs485(void)
{
   lcd_enviar(LCD_COMANDO,LCD_CLEAR);       // Borro pantalla LCD
   delay_ms(5);                             // Retardo para el comando de la LCD
   printf(lcd_putc,"RS 485");               // Visualiza mensaje
   output_high(PIN_E1);                     // Enciendo un led
   delay_ms(1000);                          // Tiempo de encendido del Led
   output_low (PIN_E1);                     // Apago el Led
}


Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Modo Sleep
« Respuesta #5 en: 07 de Junio de 2008, 20:37:22 »
Hola enigma, He detectado algunas cosillas en tu código:

Código: [Seleccionar]
 
}
SLEEP();                                     // Mando a dormir al micro
}

Yo recomiendo este código

Código: [Seleccionar]
Sleep();
delay_cycles(1);
}

Cuando se ejecuta la instrucción Sleep(); Microchip advierte que puede llegar a haber ejecución parcial o total de la siguiente instrucción al SLEEP, por lo tanto recomienda el agregado de una instrucción NOP luego de esta (Representada en CCS por delay_cycles(1)). Aunque no creo la falta de ella en tu código pueda provocarte problemas, no es tampoco la mejor forma de entrar a dormir el micro.

Creo que el FCM está deshabilitado en forma predeterminada, pero por las dudas desactivalo con el fuse NOFCMEN, este de lo contrario puede reiniciarte el WDT y generar problemas al despertar.

Te falta activar el Watchdog, o bien por software o por hardware, aunque has definido el postescalador del WDT, te falta incluir #fuses WDT, que activa el perro por hardware.

Prueba con eso y luego nos dices.

Un saludo.




"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Modo Sleep
« Respuesta #6 en: 08 de Junio de 2008, 00:59:37 »
Ummm Crei que al colocar el posescaler con el wdt ya estaba activado... Lo digo porque en un programa anterior lo hice así y funcionó.... en fin... Ya hice todo lo que me recomendaste y pues nada :cry:, no corre y en las advertencias me sale que el perro guardian se está ejecutando.... :?




Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Modo Sleep
« Respuesta #7 en: 08 de Junio de 2008, 14:39:31 »
Hola enigma.

Extraños los problemas que tienes ¿Estas segura que el micro se pone a dormir y no despierta? El hecho que solo tome una medición puede ser problema de código y no necesariamente de que el micro se este durmiendo y no despertando.

¿Haz probado de aumentar el tiempo del WDT? Puede que el Perro este desbordando antes de que alcanze el sleep.

Te propongo lo siguiente, como veo que estas trabajando con el ISIS, configuremos el programa para que indique en la ventana de mensajes cuando el PIC entra en modo sleep y cuando despierta, ahi podremos ver que sucede realmente. Haz lo siguiente:

1) Ve a la barra de menues en la parte superior y elige el menu "Debug".
2) Luego ve al submenú que dice "Configure Diagnostics". Haz click en él.
3) Vas a ver un menú como el explorador de Windows pero con los objetos que tienes en tu circuito, ve al PIC  y presiona en el cuadrado con el + para expandir los eventos del PIC.
4) Te aparecerán muchas opciones, tienes que ir a la que dice "Sleep/Wake events". haz click en ella.
5) Una vez seleccionada en la parte inferior de esta ventana tienes un recuadro que dice "Trace Information level" que contiene cuatro opciones. Elige la que dice "Debug".
6) Sal de la ventana y vuelve a la simulación. Si el PIC entra a dormir o bien se despierta te lo advertira con un mensaje en el log de simulación.

Hazlo y nos cuentas que tal te fue. Saludos.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Modo Sleep
« Respuesta #8 en: 08 de Junio de 2008, 22:56:48 »
Rayos... Nunca duerme!!! :? El perro no lo deja dormir!!! ummm :|

Mira lo que aparece:



Luego le quito el perro, y pues si duerme... miren........




Ese perro está  :z)   :D Pero sin el perrito este, como hago para despertar al micro??............. :?

PD: Está bueno lo que me dijiste para ver en los mensajes cuando entra a dormir o actua el perro, no lo sabía!!!  :wink:

Atte; Enigma... La llanerita de Guayana :-)
« Última modificación: 08 de Junio de 2008, 22:59:00 por Enigma »
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Modo Sleep
« Respuesta #9 en: 10 de Junio de 2008, 23:50:19 »
Una pregunta... alguien sabe que quiere decir la advertencia que me sale despues del sleep aquí: :?



Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Modo Sleep
« Respuesta #10 en: 11 de Junio de 2008, 03:19:04 »
Hola enigma.

Ese mensaje indica que se ha detenido la visualización de mensajes en la ventana de log de la simulación (esa ventana de la figura) y se dejarán de mostrar los mensajes aunque la simulación siga. En forma predetermina el ISIS "loguea"  :mrgreen: hasta transcurrido 1 minuto de simulación. Si quieres cambiar esto haz lo siguiente:

1) Ve a la barra de menues en la parte superior y elige el menu "Debug".
2) Luego ve al submenú que dice "Configure Diagnostics". Haz click en él.
3) En la parte inferior de la ventana dice "Log from 0 to 60 seconds" donde los valores numerícos son editables. Cambia este ultimo numero para que la simulación pueda registrarse en el log por mas tiempo.

Esperamos tus respuestas. Saludos.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado Enigma

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 609
    • www.toroscoleados.com
Re: Modo Sleep
« Respuesta #11 en: 11 de Junio de 2008, 21:05:22 »
jejeje o.k... ya lo resolvi.. jejeje gracias!!! pero nada que el perro guardian me hace caso, que ladilla!!!....

Una pregunta, las interrupciones por los puertos analógicos se dan solitas verdad, es decir, solo tengo que habilitar las interrupciones globales, y cuando el micro se duerma, si detecta un cambio en los conversores deberia despertarse, cierto? o me equivoco??? :?

Atte: Enigma... La llanerita de Guayana :-)
No hay nada como cabalgar en la sabana y sentir la brisa con olor a mastranto, bosta y ganado. ¡¡O Fortuna, velut luna, status variabilis, semper crescis, aut decrescis, vita detestabili!! Que viva el coleo, la musica LLanera y la gótica!

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Modo Sleep
« Respuesta #12 en: 09 de Abril de 2009, 18:51:01 »
Una pregunta, las interrupciones por los puertos analógicos se dan solitas verdad, es decir, solo tengo que habilitar las interrupciones globales, y cuando el micro se duerma, si detecta un cambio en los conversores deberia despertarse, cierto? o me equivoco??? :?

Buena pregunta llanerita! Lastima que no hayas tenido respuesta, porque a mi tambien me interesa  :mrgreen:
Algun valiente que se anime a responder?  ;-)
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Modo Sleep
« Respuesta #13 en: 10 de Abril de 2009, 09:54:49 »
Una pregunta, las interrupciones por los puertos analógicos se dan solitas verdad, es decir, solo tengo que habilitar las interrupciones globales, y cuando el micro se duerma, si detecta un cambio en los conversores deberia despertarse, cierto? o me equivoco??? :?

Si tienes el bit de habilitacion de la interrupción por conversión del ADC en 1 entonces el PIC de despertará cuando se produzca la interrupción. Ahora bien, no es necesario setear al bit GIE de interrupciones globales, pues el micro se despierta de todas formas. Importantisimo es seleccionar como fuente de reloj del ADC al oscilador RC antes de mandar el micro a dormir, caso contrario se aborta la conversión actual.

Espero haber sido claro. Saludos.
"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado Marttyn

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1835
    • IDEAA
Re: Modo Sleep
« Respuesta #14 en: 10 de Abril de 2009, 12:57:43 »
Pero la interrupcion sera de la conversion en curso (antes de irse a dormir), no? Lo que yo queria conseguir es que el pic despertara cuando detecta un cambio de voltaje en el pin analogico. Pero no creo que sea posible.
Gracias Gonzalo por aclarar esto!
Salu2
La gente ve las cosas que existen y se pregunta por qué.
Yo prefiero imaginar lo que no existe y preguntarme por qué no.


 

anything