Autor Tema: manejo del ADC 16f87X  (Leído 4145 veces)

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

Desconectado PICpegaso

  • PIC16
  • ***
  • Mensajes: 124
manejo del ADC 16f87X
« en: 15 de Mayo de 2007, 23:17:59 »
Hola compañeros me da gusto estar en este foro, la verdad tengo un problemita con el conversor A/D del PIC, resulta que he seguido las indicaciones de buenos tutoriales para manipular los registros ADRESH y ADRESL, pero luego de la conversion,  al pasar estos datos al hyperterminal de windows para comprobar  aparece dos veces el mismo caracter, es decir como si ambos registros fueran el mismo o tuvieran igual valor, la verdad no comprendo esto.

Coloco el codigo en ASM por si acaso encuentran algo que se me escapo, o estoy haciendo todo mal!!,
les agradezco mucho sus aportes.


Código: ASM
  1. include "p16f873A.inc"
  2.  
  3.  
  4. org 0x00
  5.  
  6.     nop
  7.  
  8.     nop
  9.  
  10.     bcf STATUS,RP0 ;Ir banco 0
  11.  
  12.     bcf STATUS,RP1
  13.  
  14.     movlw b'01000001' ;A/D conversion Fosc/16 para el tiempo necesario de conversion ADC
  15.  
  16.     movwf ADCON0
  17.  
  18.     bsf STATUS,RP0 ;Ir banco 1
  19.  
  20.     bcf STATUS,RP1
  21.  
  22.     clrf TRISA ;PORTA salida
  23.  
  24.     clrf TRISB ;PORTB salida
  25.  
  26.     clrf TRISC ;PORTC salida
  27.  
  28.  
  29.     movlw b'11001110' ;A/D Port AN0/RA0, justificado a la derecha
  30.  
  31.     movwf ADCON1
  32.  
  33.     bsf TRISA,0 ;Canal AN0 como entrada
  34.  
  35.     bcf TRISC,6 ;RC6/TX salida, pin de transmisión
  36.  
  37.     movlw D'6' ;9600 baud rate Xtal=4Mhz
  38.  
  39.     movwf SPBRG
  40.  
  41.     bcf TXSTA,BRGH ;Selección de baja velocidad
  42.  
  43.     bcf TXSTA,SYNC ;Modo asíncrono
  44.  
  45.     bcf STATUS,RP0 ;Ir banco 0
  46.  
  47.     bcf STATUS,RP1
  48.  
  49.     bsf RCSTA,SPEN ;habilita el puerto serie
  50.  
  51.     bsf STATUS,RP0 ;Ir banco 1
  52.  
  53.     bcf STATUS,RP1
  54.  
  55.     movlw b'00000001'
  56.  
  57.     movwf OPTION_REG ;TMR0 preescaler, 1:4
  58.  
  59.     bcf TXSTA,TX9 ;8 bits de datos a transmitir
  60.  
  61.     bsf TXSTA,TXEN ;Activa la transmisión serial, TXIF = 1
  62.  
  63.     bcf STATUS,RP0 ;Ir banco 0
  64.  
  65.     bcf STATUS,RP1
  66.  
  67.        
  68.  
  69. _bucle
  70.  
  71.     movlw D'20' ; Cuando llegue a 80uS, que es el tiempo necesario para carga del sample and hold, procede a iniciar ADC
  72.  
  73.     subwf TMR0,W ; Resta TMR0-W y lo guarda en W
  74.  
  75.     btfsc STATUS,C
  76.  
  77.     goto _bucle ;Esperar que el timer0 llegue a 2[color=green][/color]0
  78.  
  79.     bsf ADCON0,GO ;Start A/D conversion
  80.  
  81. _espera
  82.  
  83.     btfsc ADCON0,GO ;ADCON0 es 0? (la conversion esta completa?)
  84.  
  85.     goto _espera ;No, ir _espera
  86.  
  87.     movf ADRESL,W ;Si, W=ADRESL
  88.  
  89.         movwf TXREG
  90.                
  91. _esperatx
  92.  
  93.     btfss PIR1,TXIF ;Espera hasta que transmisión registro bajo culminó
  94.  
  95.     goto _esperatx
  96.  
  97.     movf ADRESH,W;W=ADRESH
  98.  
  99.         movwf TXREG
  100.                
  101. _esperatx2
  102.  
  103.     btfss PIR1,TXIF ;Espera hasta que transmisión registro alto culminó
  104.  
  105.     goto _esperatx2
  106.  
  107. _bucle44
  108.  
  109.     btfss INTCON,T0IF
  110.  
  111.     goto _bucle44 ;Esperar que el timer0 desborde para generar una rata de muestre de aprox 1KHz
  112.  
  113.     bcf INTCON,T0IF ;Limpiar el indicador de desborde
  114.  
  115.     goto _bucle ;Ir a bucle
  116.  
  117. end
« Última modificación: 16 de Mayo de 2007, 04:17:34 por PICpegaso »
Fabiancho

Cuando se tiene un buen POR QUÉ, siempre se encuentra el CÓMO

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: manejo del ADC 16f87X
« Respuesta #1 en: 16 de Mayo de 2007, 10:14:28 »
hola picpegaso, tengo algunas observaciones:

no es necesario hacer esto:
Código: ASM
  1. bcf TXSTA,BRGH ;Selección de baja velocidad
  2.    bcf TXSTA,SYNC ;Modo asíncrono
  3.  
  4.    bcf TXSTA,TX9 ;8 bits de datos a transmitir
  5.    bsf TXSTA,TXEN ;Activa la transmisión serial, TXIF = 1
podrias agruparlo todo en una sola constante asi como cargastes el registro ASCON0 y ADCON1. no refiero que este mal simplemente es una cuestion de orden y te ahorra un poquito de lineas de código  :-), pero no es un error.

aca puede estar el error:
Código: ASM
  1. _espera
  2.    btfsc ADCON0,GO ;ADCON0 es 0? (la conversion esta completa?)
  3.    goto _espera ;No, ir _espera
  4.    movf ADRESL,W ;Si, W=ADRESL
  5.    movwf TXREG
  6.  
  7. _esperatx
  8.    btfss PIR1,TXIF ;Espera hasta que transmisión registro bajo culminó
  9.    goto _esperatx
  10.    movf ADRESH,W;W=ADRESH
  11.    movwf TXREG
  12.  
  13. _esperatx2
  14.    btfss PIR1,TXIF ;Espera hasta que transmisión registro alto culminó
  15.    goto _esperatx2

recuerda que ADRESL esta en el banco 1 y que ADRESH esta en el banco 0, en tu codigo a ambos registros los estas tratando dentro del banco 0, lo cual te produce el error de que el adresl tiene el mismo valor que el adresh pues ambos tiene la misma dirección en sus primeros 7 bits de direccionamiento, cuando seleccionas el banco estas escribiendo en el ultimo bit de mayor peso (en el octavo) y asi haces la diferencia para el compilador entre bancos y registros

ADRESH = 1E = 0001 1110 en el banco 0
ADRESL = 9E = 1001 1110  en el banco 1

ahora te dejo a ti el tiro de gracia  :mrgreen: y que funcione tu programa, exitos!!!  :-/ :-/ :-/ :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado PICpegaso

  • PIC16
  • ***
  • Mensajes: 124
Re: manejo del ADC 16f87X
« Respuesta #2 en: 16 de Mayo de 2007, 12:38:52 »
Hola compañero micro_cadaver, he seguido tus consejos pero aun tengo una inquietud con respecto al envio de los registros ADRES, pues para mandar el registro ADRESH lo hago directamente pero no estoy seguro si estoy accediendo bien al banco 1 para enviar el registro ADRESL, aqui coloco la modificacion que utilice para ver que puede ser lo que este mal


Código: ASM
  1. _espera
  2.  
  3.     btfsc ADCON0,GO ;ADCON0 es 0? (la conversion esta completa?)
  4.  
  5.     goto _espera ;No, ir _espera
  6.  
  7.     movf ADRESH,W ;Si, W=ADRESH
  8.  
  9.     movwf TXREG
  10.                
  11. _esperatx
  12.  
  13.     btfss PIR1,TXIF ;Espera hasta que transmisión registro alto culminó
  14.  
  15.     goto _esperatx
  16.  
  17.     bsf STATUS,RP0 ;Ir banco 1
  18.  
  19.     bcf STATUS,RP1     
  20.  
  21.     movf ADRESL,W;W=ADRESL
  22.  
  23.     bcf STATUS,RP0 ;Ir banco 0
  24.  
  25.     bcf STATUS,RP1
  26.  
  27.     movwf TXREG
  28.                
  29. _esperatx2
  30.  
  31.     btfss PIR1,TXIF ;Espera hasta que transmisión registro bajo culminó
  32.  
  33.     goto _esperatx2

no se si tengas por ahi un ejemplito de como enviar ambos registros
gracias  :shock:
Fabiancho

Cuando se tiene un buen POR QUÉ, siempre se encuentra el CÓMO

Desconectado micro_cadaver

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2102
    • blog microembebidos
Re: manejo del ADC 16f87X
« Respuesta #3 en: 16 de Mayo de 2007, 17:51:44 »
sigue fallando? m... q extraño---- tal vez sea algo del puerto de comunicaciones, a ver si alguien mas puede apoyar  :-/ no hay que tirar la toalla amigo!!!  :-/ :-/ :-/ :-/ :-/
a cosechar!!!... :P
pic32... ahi voy....
aguante el micro 16f84  !!!!

visita mi pagina: http://www.microembebidos.wordpress.com

Desconectado microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: manejo del ADC 16f87X
« Respuesta #4 en: 16 de Mayo de 2007, 18:03:28 »
no sera la codificacion del valor del adresl adresh,
verifica los registros de transmicion de datos, velocidad,etc,
configuracion.

saludos
« Última modificación: 16 de Mayo de 2007, 18:23:58 por microcom »

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: manejo del ADC 16f87X
« Respuesta #5 en: 17 de Mayo de 2007, 08:41:27 »
PICpegaso te sugiero que pruebes las cosas por separado

1) Prueba transmitir 'A' 'B' 'C' por la usart del PIC hacia la pc en el hyperterminal.  De esa forma se prueba la configuración de la USART.

2) Ten en cuenta que los caracteres "especiales" los verás como un "dibujito" y eso depende del font que esté seleccionado en el hyperterminal.  Los caracteres que podrás ver claramente son del ascii 32 al Ascii 127, el resto lo podrás ver como algo 'raro'.  Si el valor del registro que transmites es mayor a 127 o menor a 32, verás un cuadrado.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado PICpegaso

  • PIC16
  • ***
  • Mensajes: 124
Re: manejo del ADC 16f87X
« Respuesta #6 en: 18 de Mayo de 2007, 09:04:55 »
Compañeros que tal !,
He realizado ciertas modificaciones al programa hasta encontrar una posible fuente de error. La modificacion me sirvio bien pero tengo un problema con el que no contaba, primero que todo les cuento que para que sirviera bien el envio, fue necesario enviar primero el registro ADRESL que esta en el banco 1, esperar y luego si mandar el registro ADRESH que esta en banco 0. De esta forma funcionó bien pero el problema que tengo es con la rata de muestreo que necesito ya que para que funcionara bien, fue necesario colocar tiempos muy grandes entre cada envio de los regristros ADRESL y ADRESH.

Yo estoy utilizando como se habran dado cuenta un cristal de 4 MHz, con lo cual tengo que el TIMER0 se incrementa con cuatro ciclos de reloj, cada 1uS, siempre que no tenga pre:escaler, para obtener la rata de 1KHz es necesario que todo el proceso de muestreo, conversion y envio de datos se demore a lo sumo 1000uS. Para que esto sea posible utilice un pre:escaler de 1:4 y asi poder contar hasta 1024 con los 8 bits del TIMER0, pues bien, no se porque al disminuir los tiempos para que me cumpla estas restricciones no envia ningun dato al hyperterminal, !¿ que me hace falta??,
 de todas forma seguire compañeros, siempre adelante!, ni un paso atras!!..

y gracias a todos los foreros por su importante info..


PICpegaso
Fabiancho

Cuando se tiene un buen POR QUÉ, siempre se encuentra el CÓMO

Desconectado PICpegaso

  • PIC16
  • ***
  • Mensajes: 124
Re: manejo del ADC 16f87X
« Respuesta #7 en: 18 de Mayo de 2007, 10:31:25 »
Compañeros aqui coloco el ultimo programa hecho, lamentablemente no envia los registros, segun la captura que hice en el hiperterminal, esta enviando el registro bajo ADRESL y el alto ¿?, sin embargo parece que esta dando la rata de muestreo cerca a 1KHz. Utilice un pre:escaler de 1:2.

Código: ASM
  1. list p=16f873A
  2. include "p16f873A.inc"
  3.  
  4.  
  5. org 0x00
  6.  
  7.     nop
  8.  
  9.     nop
  10.  
  11.     bcf STATUS,RP0 ;Ir banco 0
  12.  
  13.     bcf STATUS,RP1
  14.  
  15.     movlw b'01000001' ;A/D conversion Fosc/16 para el tiempo necesario de conversion ADC
  16.  
  17.     movwf ADCON0
  18.  
  19.     bsf STATUS,RP0 ;Ir banco 1
  20.  
  21.      movlw b'00000001'
  22.  
  23.      movwf TRISA ;PORTA salida y AN0 entrada
  24.  
  25.     clrf TRISB ;PORTB salida
  26.  
  27.     clrf TRISC ;PORTC salida
  28.  
  29.     movlw b'11001110' ;A/D Port AN0/RA0, justificado a la derecha
  30.  
  31.     movwf ADCON1
  32.  
  33.     movlw D'6' ;9600 baud rate Xtal=4Mhz
  34.  
  35.     movwf SPBRG
  36.  
  37.     bcf TXSTA,BRGH ;Selección de baja velocidad
  38.  
  39.     bcf TXSTA,SYNC ;Modo asíncrono
  40.  
  41.     clrf OPTION_REG ;TMR0 preescaler, 1:2
  42.  
  43.     bcf TXSTA,TX9 ;8 bits de datos a transmitir
  44.  
  45.     bsf TXSTA,TXEN ;Activa la transmisión serial, TXIF = 1
  46.  
  47.     bcf STATUS,RP0 ;Ir banco 0
  48.  
  49.     bsf RCSTA,SPEN ;habilita el puerto serie
  50.        
  51.  
  52. _bucle
  53.  
  54.     movlw D'40' ; Cuando llegue a 80uS, que es el tiempo necesario para carga del sample and hold, procede a iniciar ADC
  55.  
  56.     subwf TMR0,W ; Resta TMR0-W y lo guarda en W
  57.  
  58.     btfsc STATUS,C
  59.  
  60.     goto _bucle ;Esperar que el timer0 llegue a 40
  61.  
  62.     bsf ADCON0,GO ;Start A/D conversion
  63.  
  64. _espera
  65.  
  66.     btfsc ADCON0,GO ;ADCON0 es 0? (la conversion esta completa?)
  67.  
  68.     goto _espera ;No, ir _espera
  69.  
  70.     bsf STATUS,RP0 ; ir a banco 1
  71.  
  72.     movf ADRESL,W ;Si, W=ADRESL
  73.  
  74.     bcf STATUS,RP0 ; vuelve a banco 0
  75.  
  76.     movwf TXREG
  77.                
  78. _esperatx
  79.  
  80.     btfss PIR1,TXIF ;Espera hasta que transmisión registro bajo culminó
  81.  
  82.     goto _esperatx
  83.  
  84.     nop
  85.  
  86. _bucle33
  87.  
  88.     btfss INTCON,T0IF
  89.  
  90.     goto _bucle33 ;
  91.  
  92.     bcf INTCON,T0IF ;Limpiar el indicador de desborde  
  93.  
  94.     movf ADRESH,W ;Si, W=ADRESH
  95.  
  96.     movwf TXREG
  97.                
  98. _esperatx2
  99.  
  100.     btfss PIR1,TXIF ;Espera hasta que transmisión registro alto culminó
  101.  
  102.     goto _esperatx2    
  103.  
  104. _bucle44
  105.  
  106.     btfss INTCON,T0IF
  107.  
  108.     goto _bucle44 ;Esperar que el timer0 desborde
  109.  
  110.     bcf INTCON,T0IF ;Limpiar el indicador de desborde
  111.  
  112.     goto _bucle ;Ir a bucle
  113.  
  114.     end

espero sus comentarios, gracias!!  :shock:
Fabiancho

Cuando se tiene un buen POR QUÉ, siempre se encuentra el CÓMO

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: manejo del ADC 16f87X
« Respuesta #8 en: 18 de Mayo de 2007, 10:40:30 »
PICpegaso, realmente me has mareado  :shock:

No entiendo tu problema, tampoco se si hiciste los pasos que te he sugerido.

Un micro a 4Mhz anda muy bien para lo que pretendes hacer, lo más seguro es que el cuello de botella lo tengas en la USART y no en otro lado.  Si usas la usart a 9600 bps, enviarás 1 byte cada 1mseg. Como tus muestras son de 2 bytes (ya que usas modo 10 bits) te demorará 2mseg por dato.  Eso te da una cadena MAXIMA de 500 datos por segundo.   

Como ves, es ahí tu mayor problema y no en lo demás.  La solución -> aumentar el baudeaje.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado PICpegaso

  • PIC16
  • ***
  • Mensajes: 124
Re: manejo del ADC 16f87X
« Respuesta #9 en: 19 de Mayo de 2007, 02:14:32 »
JEEEEEE!!!!!
HOLA COMPAÑEROS, ME ALEGRA SALUDARLOS Y DECIRLES CON AGRADO QUE GRACIAS A SUS CONSEJOS HE SOLUCIONADO EL PROBLEMITA DEL ENVIO SERIAL DE LOS REGISTROS ADRES DEL ADC,  POR MEDIO DEL USART DEL MICRO,

GRACIAS MAUNIX, MICRO_CADAVER Y MICROCOM..

COLOCO EL PROGRAMA FINAL COMO EJEMPLO PARA AQUELLOS QUE NECESITEN RESOLVER UN PROBLEMITA DE ESTE TIPO

SALUDOS!!, :-/ :-/ :-/    PICpegaso   :-/ :-/ :-/
« Última modificación: 19 de Mayo de 2007, 02:37:59 por PICpegaso »
Fabiancho

Cuando se tiene un buen POR QUÉ, siempre se encuentra el CÓMO

Desconectado PICpegaso

  • PIC16
  • ***
  • Mensajes: 124
Re: manejo del ADC 16f87X
« Respuesta #10 en: 19 de Mayo de 2007, 02:22:40 »
EJEMPLO DE ADQUISICION DE SEÑAL ANALOGA A DIGITAL CON ADC DE PIC 16F87X, Y ENVIO POR PUERTO SERIAL AL PC (yo utilice hyperterminal para captura como texto)

* VELOCIDAD DE ENVIO=19200 baudios
* 10 BITS DE DATOS
* JUSTIFICADOS A LA DERECHA EN DOS BYTES
* ENVIO PRIMERO BYTE MENOS SIGNIFICATIVO Y LUEGO BYTE MAS SIGNIFICATIVO
* RATA DE MUESTREO= APROX 1KHz (la verdad un poco mas ~ 1.6KHz)


Código: ASM
  1. list p=16f873A
  2. include "p16f873A.inc"
  3.  
  4.  
  5. org 0x00
  6.  
  7.     nop
  8.  
  9.     nop
  10.  
  11.     bcf STATUS,RP0 ;Ir banco 0
  12.  
  13.     bcf STATUS,RP1
  14.  
  15.     movlw b'01000001' ;A/D conversion Fosc/16 para el tiempo necesario de conversion ADC
  16.  
  17.     movwf ADCON0
  18.  
  19.     bsf STATUS,RP0 ;Ir banco 1
  20.  
  21.     movlw b'00000001'
  22.  
  23.     movwf TRISA ;PORTA salida y AN0 entrada
  24.  
  25.     clrf TRISB ;PORTB salida
  26.  
  27.     clrf TRISC ;PORTC salida
  28.  
  29.     movlw b'11001110' ;A/D Port AN0/RA0, justificado a la derecha
  30.  
  31.     movwf ADCON1
  32.  
  33.     movlw D'12' ; 19200 baud rate Xtal=4Mhz, es decir 19.2 bits por mS
  34.  
  35.     movwf SPBRG
  36.  
  37.     bsf TXSTA,BRGH ;Selección de alta velocidad
  38.  
  39.     bcf TXSTA,SYNC ;Modo asíncrono
  40.  
  41.     clrf OPTION_REG ;TMR0 preescaler, 1:2
  42.  
  43.     bcf TXSTA,TX9 ;8 bits de datos a transmitir
  44.  
  45.     bsf TXSTA,TXEN ;Activa la transmisión serial, TXIF = 1
  46.  
  47.     bcf STATUS,RP0 ;Ir banco 0
  48.  
  49.     bsf RCSTA,SPEN ;habilita el puerto serie
  50.        
  51.  
  52. _bucle
  53.  
  54.     movlw D'40' ; Cuando llegue a 80uS, que es el tiempo necesario para carga del sample and hold, procede a iniciar ADC
  55.  
  56.     subwf TMR0,W ; Resta TMR0-W y lo guarda en W
  57.  
  58.     btfsc STATUS,C
  59.  
  60.     goto _bucle ;Esperar que el timer0 llegue a 40
  61.  
  62.     bsf ADCON0,GO ;Start A/D conversion
  63.  
  64. _espera
  65.  
  66.     btfsc ADCON0,GO ;ADCON0 es 0? (la conversion esta completa?)
  67.  
  68.     goto _espera ;No, ir _espera
  69.  
  70.     bsf STATUS,RP0 ; ir a banco 1
  71.  
  72.     movf ADRESL,W ;Si, W=ADRESL
  73.  
  74.     bcf STATUS,RP0 ; vuelve a banco 0
  75.  
  76.     movwf TXREG
  77.                
  78. _esperatx
  79.  
  80.     btfss PIR1,TXIF ;Espera hasta que transmisión registro bajo culminó
  81.  
  82.     goto _esperatx
  83.  
  84.     nop
  85.  
  86. _bucle33
  87.  
  88.     btfss INTCON,T0IF
  89.  
  90.     goto _bucle33 ;
  91.  
  92.     bcf INTCON,T0IF ;Limpiar el indicador de desborde  
  93.  
  94.     movf ADRESH,W ;Si, W=ADRESH
  95.  
  96.     movwf TXREG
  97.                
  98. _esperatx2
  99.  
  100.     btfss PIR1,TXIF ;Espera hasta que transmisión registro alto culminó
  101.  
  102.     goto _esperatx2    
  103.  
  104. _bucle44
  105.  
  106.     btfss INTCON,T0IF
  107.  
  108.     goto _bucle44 ;Esperar que el timer0 desborde
  109.  
  110.     bcf INTCON,T0IF ;Limpiar el indicador de desborde
  111.  
  112.     goto _bucle ;Ir a bucle
  113.  
  114.     end

SALUDOS !
« Última modificación: 19 de Mayo de 2007, 02:49:24 por PICpegaso »
Fabiancho

Cuando se tiene un buen POR QUÉ, siempre se encuentra el CÓMO