Autor Tema: pregunta de zonzo nomás... pin con dos funciones al mismo tiempo?  (Leído 4242 veces)

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

Desconectado osposto

  • PIC10
  • *
  • Mensajes: 31
pregunta de zonzo nomás... pin con dos funciones al mismo tiempo?
« en: 02 de Febrero de 2015, 22:37:29 »
Estimados listeros: Se me ha presentado el siguiente dilema. Estoy armando un control remoto RF con un pic12F1840, que es un micro que tiene MUCHAS aplicaciones, y sólo 6 pines I/O. El caso es que como no tenía mucha experiencia con las USART (nada de nada), lo hice funcionar a pelo... es decir, con el remoto que es un 12F508, un modulo TX rf, uno RX rf, y el 1840, anduvo de 10. Pero claro, por qué he de quedarme tranquilo, si el 1840 tiene una EUSART que es un cañonazo... entonces, siguiendo con el criterio del que ya fucnionaba, puse en el mismo pin (RA1) que funciona como RX/DT para la EUSART, una interrupción IOC, de modo que cuando la señal se ponía en 1, se generaba la interrupción por el cambio de estado, y luego de un determinado tiempo, digamos, 250us (por ejemplo), desactiva las interrupciones, activaba la EUSART para que lea los datos que envía el control, luego de leer las 7 palabras de 8 bit que es el código del control, volvia a dejar como estaba todo y salía a la rutina pincipal......................
Obviamente, no funcionó... Por ende, aquí viene la novateada:
Es posible poner 2 funciones activas al mismo tiempo sobre el mismo pin?
Gracias por su tiempo.
« Última modificación: 02 de Febrero de 2015, 22:49:12 por osposto »
No sé lo que quiero, pero lo quiero ya. - Sumo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: pregunta de zonzo nomás... pin con dos funciones al mismo tiempo?
« Respuesta #1 en: 03 de Febrero de 2015, 00:36:41 »
Citar
Es posible poner 2 funciones activas al mismo tiempo sobre el mismo pin?

Al mismo mismo tiempo en ese micro puede ser, no veo el por que no. ya que no hay entradas remapeables ni nada por el estilo.

Citar
use en el mismo pin (RA1) que funciona como RX/DT para la EUSART, una interrupción IOC, de modo que cuando la señal se ponía en 1, se generaba la interrupción por el cambio de estado, y luego de un determinado tiempo, digamos, 250us (por ejemplo), desactiva las interrupciones, activaba la EUSART para que lea los datos que envía el control, luego de leer las 7 palabras de 8 bit que es el código del control, volvia a dejar como estaba todo y salía a la rutina pincipal......................

Por que no directamente usas la interrupcion del USART, asi cuando recibe algo salta a la interrupcion. No entiendo por que necesitarias ese interrupt-on-change, pero si tenes algo trasmitiendo y hubiera otra salida que lo pone a 5v por ej estaria llegando cualquier cosa.

Desconectado osposto

  • PIC10
  • *
  • Mensajes: 31
Re: pregunta de zonzo nomás... pin con dos funciones al mismo tiempo?
« Respuesta #2 en: 04 de Febrero de 2015, 17:17:17 »
Muchas gracias por tu respuesta KILLERJC. El tema es el siguiente: al inyectar la señal en el par TX/RX en rf, la lectura del osciloscopio me daba (incluive alimentando con baterías) una serie de pulsos espùreos que me disparaban la interrupción cada nada, entonces complicaba la recepción del puerto USART (o por lo menos me dió esa impresión, porque cuando utilicé exclusivamente el protocolo RS232, obtuve nada). Entonces, para disparar la recepciòn, lo que hacía era un IOC sobre el mismo pin de RX, le doy un perìodo de tiempo de control (mayor que cualquier pulso espùreo que pudiese aparecer), y si se cumple que en ese período de tiempo, el puerto se mantiene en 1, ahí habilito la UART, y espera al flanco descendente del bit de start. El tema es que haciendo una simulación (con STIMULUS del MPLABX), el flag RCIF se dispara antes de completar el primer caracter siquiera, y luego queda encerrado en el bucle de recepción de caracteres... nunca más sale (al no recibir más nada) del bucle de recepciòn, pero en ese RCIF único, tampoco muestra nada.

Citar

void interrupt data_read(void) {
    int i=0;
    di();
    IOCAF=0;
    INTCONbits.IOCIE=0;
    __delay_us(13);
    for(i=0; i<5; i++)
    {
        __delay_us(4);  
        if(segnal!=1)       // debido a #define segnal RA1, en el encabezado del programa
        {
            ei();
            return;
         };
    };
    i=0;
    RCSTAbits.SPEN=1;   //activación de la USART. Antes la realizaba sobre CREN, pero en los dos casos, en principio, funciona.... CREN está ya activado en main.
    while (RCSTAbits.SPEN)
        {
            if(RCIF==1)
                {
                    entra=RCREG;
                    i++;
                 };
            if (i==7)
                 {
                     RCSTAbits.SPEN=0;
                     led3=1;
                     for (i=0;i<=7;i++)
                        {
                         if (p==entra)  //p es una constante ya predefinida. por una cuestión de criterio, es siempre z
                            {
                             led2=1;
                             __delay_ms(200);
                             led2=0;
                             __delay_ms(200);
                             led2=1;
                             __delay_ms(200);
                             led2=0;
                             __delay_ms(200);
                             led2=1;
                             __delay_ms(200);
                             led2=0;
                             __delay_ms(200);
                            }
                         else
                            {
                             led2=1;
                             __delay_ms(1000);
                             led2=0;
                             __delay_ms(200);
                             };
                      };
                      led3=0;
                      entra[7]='\0';
                 };
         };
    i=0;
    ei();
 }


La parte de led2 y led3 es sólo a los fines de verificar si los caracteres son iguales a los recibidos. Va a desaparecer cuando todo funcione correctamente (si algún día sucede), y directamente active los puertos adecuados.

Saludos.
« Última modificación: 04 de Febrero de 2015, 17:20:10 por osposto »
No sé lo que quiero, pero lo quiero ya. - Sumo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: pregunta de zonzo nomás... pin con dos funciones al mismo tiempo?
« Respuesta #3 en: 04 de Febrero de 2015, 17:24:41 »
vas a tener que solucionar lo de RF parece :P

Desconectado osposto

  • PIC10
  • *
  • Mensajes: 31
Re: pregunta de zonzo nomás... pin con dos funciones al mismo tiempo?
« Respuesta #4 en: 04 de Febrero de 2015, 17:34:32 »
El tema es que en particular, los pulsos espùreos desaparecen al momento de iniciar el tren de datos, dando unos y ceros plenos... es decir, por el perìodo de tiempo que duran cada uno, no aparece nada raro. los espùreos aparecen cuando el sistema está en escucha solamente, cuando no hay un emisor emitiendo.
De hecho, la lectura (tanto del tren de emisión como del de recepciòn, es muy clara en el osciloscopio.
Lo más gracioso es que logré la interpretación del tren de datos sin usar la EUSART... sincronicé a pelo el sistema, con OSCCON, y anduvo...
En fin... voy a seguir intentando.
Saludos.
No sé lo que quiero, pero lo quiero ya. - Sumo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: pregunta de zonzo nomás... pin con dos funciones al mismo tiempo?
« Respuesta #5 en: 04 de Febrero de 2015, 17:54:31 »
Mirando el codigo rapidamente ( asi que no entre en detalles) que pasaste... que es la variable entra?

Te explico el por que de mi pregunta..

Veo que usas "entra[7]" y por ahi  "entra=RCREG"
Si entra es un array, si queres acceder a los elementos o guardar cada uno de los elementos lo haces con entra[numero] , pero si es "entra" solo sin el [] , entonces es la direccion que apunta al array, es decir el puntero que apunta a la direccion del primer elemento del array o &entra[0].

Con lo cual aca imagino que debe ser:

Código: [Seleccionar]
           if(RCIF==1)
                {
                    entra[i]=RCREG;
                    i++;
                 };

Ahi tmb
 if (p==entra)  
« Última modificación: 04 de Febrero de 2015, 18:22:26 por KILLERJC »

Desconectado osposto

  • PIC10
  • *
  • Mensajes: 31
Re: pregunta de zonzo nomás... pin con dos funciones al mismo tiempo?
« Respuesta #6 en: 04 de Febrero de 2015, 19:13:37 »
Efectivamente, en el código figura como indicaras,
Código: [Seleccionar]
    if(RCIF==1)
                {
                    entra[i]=RCREG;
                    i++;
                 };

Y el segundo caso es
Código: [Seleccionar]
p[i]==entra[i]
No sé por qué no se copió bien en el copy and paste. No es un error de codificación en C. Esa asignación (entra = RCREG) generaría por lo menos una advertencia en el compilador, ya que entra es efectivamente una matriz de 8 caracteres. Por eso le asigno al último el valor NULL(\\0).
Pero igual gracias por leer el código. Has notado algo raro extra (aparte de estas asignaciones mal copiadas)?
No sé lo que quiero, pero lo quiero ya. - Sumo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: pregunta de zonzo nomás... pin con dos funciones al mismo tiempo?
« Respuesta #7 en: 07 de Febrero de 2015, 12:06:48 »

Pero igual gracias por leer el código. Has notado algo raro extra (aparte de estas asignaciones mal copiadas)?


Perdon por la demora... No es que se copio mal sino que el tag de BBCODE para el estilo de letra italy o cursiva, es la i entre parentesis, como vos usas una Cita y no un tag de codigo no aparecio.

Hay un par de cosas que molestan en tu codigo. Nunca poner delays dentro de una interrupcion y voy a explicar por que.

Recibis un dato, y usas el delay.... en ese momento no podes sacar mas datos de dentro de la UART por lo tanto si llegan mas datos puede que sobreescribas completamente lo que tenias en el buffer. Mejor tu interrupcion que realize la carga de los datos y active una flag, y luego en tu programa principal realizas las demoras que vos quieras.