Pulsador on off con modulo RF

Muy buenos dias compañeros del foro,
acabo de comprarme esos modulos rf 4 canales
para ser exacto el XD-YK04

10462987_1604569379760123_9153842183983509049_n.jpg


Lo que estoy tratando de hacer en el CCS es hacer un on off
con cada pulsador del modulo a travez del pic 16f877a,
pero no logro hacerlo andar :(
mi programa va asi

Código:
#include <16f877A.h>
#FUSES XT,NOWDT
#USE delay (clock=4M) 
#USE STANDARD_IO(a)
#USE STANDARD_IO(b)

VOID MAIN()
{

output_b(0b00000000);

WHILE(1)
{
IF(INPUT(PIN_A0)==0)
{
DELAY_MS(15);//1111111111111111111111111111111
IF(INPUT(PIN_A0)==1)
{
OUTPUT_TOGGLE(PIN_B0);
}
}
IF(INPUT(PIN_A1)==0)
{
DELAY_MS(15);//1111111111111111111111111111111
IF(INPUT(PIN_A1)==1)
{
OUTPUT_TOGGLE(PIN_B1);//
}
}
IF(INPUT(PIN_A2)==0)
{
DELAY_MS(15);//1111111111111111111111111111111
IF(INPUT(PIN_A2)==1)
{
OUTPUT_TOGGLE(PIN_B2);//
}
}
IF(INPUT(PIN_A3)==0)
{
DELAY_MS(15);//1111111111111111111111111111111
IF(INPUT(PIN_A3)==1)
{
OUTPUT_TOGGLE(PIN_B3);
}
}
}
}

la conexiones son directas del modulo receptor directo a las entradas del pic ...
 
Yo veo muy raro como esta hecho esto. Para cada entrada solo tienes 15 ms para pulsar el botón tras la comparación de que este en bajo. Pienso que eso es prácticamente imposible "acertar". Me explico: pruebas si Ax está bajo entonces en 15 ms pruebas si esta alto y en ese caso cambias la salida correspondiente. Si no estaba bajo pasas a otro. De este modo tienes que pulsar en los 15 ms siguientes a la prueba de bajo. No lo veo, debes cambiar eso, supongo que te problema va por ahí.
 
Yo veo que el código para verificar los 4 canales sería muy sencillo según lo que muestra este vídeo.
Al parecer el módulo pone un 1 el canal correspondiente cuando se activa, (Es lo que noto por la posición del LED en el protoboard y lo que comenta el autor.) y se mantiene en 1 mientras siga presionada la tecla del canal.

Entonces, un código sencillo para realizar la verificación de los canales, podría quedar así:
PHP:
#include <16f877a.h>
#use     delay(crystal = 4MHz)
#use     fast_io(b)


void main (void)
{
   set_tris_b(0xF0);          
   output_b (0xF0);
   
   while (true)
   {
      if(input(pin_a0))          // Si RA0 = 1 entonces...
      {
         output_toggle(pin_b0);  // Cambiar de estado RB0
         while(input(pin_a0))    // Mientras que RA0 sea 1...
         {
            delay_ms(50);        // Retardo de 50 ms. Para antirrebote.
         }
      }
      
      if(input(pin_a1))          // Igual que arriba pero con RA1 y RB1
      {
         output_toggle(pin_b1);
         while(input(pin_a1))
         {
            delay_ms(50);
         }
      }
      
      if(input(pin_a2))          // Igual que arriba pero con RA2 y RB2
      {
         output_toggle(pin_b2);
         while(input(pin_a2))
         {
            delay_ms(50);
         }
      }
      
      if(input(pin_a3))          // Igual que arriba pero con RA3 y RB3
      {
         output_toggle(pin_b3);
         while(input(pin_a3))
         {
            delay_ms(50);
         }
      }
   }
}
No sé si las salidas del módulo mantengan un estado definido cuando están inactivas.
De lo contrario se necesitará colocar resistencias Pull-Down en cada pin de entrada del PIC.

Y si el pin del canal activo es un 0, entonces sólo basta con cambiar...
if(input(pin_a0)) por if(!input(pin_a0))
En este caso se necesita colocar resistencias Pull-Up en cada pin de entrada o usar el puerto B como entradas, porque éste tiene resistencias Pull-Up internas.

Prueba el código, y si es así como trabaja ese módulo, este programa debe funcionar.

Suerte.
 
Última edición:
Hola, el detalle que veo en tu código de programa por ej. en donde aplicas un TOGGLE, que se encuentra bajo una condición de estado de PIN, pues mientras la condición se dé, dicha función TOGGLE, cambiará de estado al pin que hace referencia, quizás cientos de veces por seg. mientras esté ejecutándose. Lo que debes realizar es, una condición adicional a la sentencia if, para que cuando se ingrese por primera vez, no lo haga otra vez hasta que el pin haya vuelto hasta su estado inicial.
 
En el código que expuse eso queda resuelto al usar un bucle while comparativo que hace que la instrucción output_toggle() no se repita.
 
Atrás
Arriba