Autor Tema: Problema en transmision RF  (Leído 3450 veces)

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

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Problema en transmision RF
« en: 11 de Junio de 2018, 16:37:01 »
Hola estoy queriendo hacer una cominicacion por rf entre un pic 12f675 y un pic 16f628a, el 12f es el emisor que al cambiar el estado de RA4 tendria que mandar la letra B por serial pero lo que pasa es que la interrupcion por cambio de estado en el pic 12f cuando presiono el boton RA4 no me la detecta, este es el programa emisor, agradeceria una mano con esto#include <12F675.h>
Código: [Seleccionar]
#FUSES WDT                   
#FUSES INTRC                   
#FUSES NOMCLR                 
#FUSES NOBROWNOUT                           
#FUSES PROTECT                  //Code protected from reads
int8 cont=0;
#use delay(int=4000000)
#use rs232(baud=4800,parity=N,xmit=PIN_A1,rcv=PIN_A0,bits=8,stream=PORT1)
#INT_RA              //interrupcion por cambio de estado en pines
    Transmision(){                    //Interrupcion por cambio de estado en pines
       if(!input(PIN_A3)){          // RA3 es 0 ?? esto solo por confirmar pregunto por 0 por eso el sigo " ! "
         //Se envía cuatro veces la "A" con un intervalo de 100 ms.
         for(cont=0; cont<4; cont++)
            {
            printf("A");//envia llamada cama 1
            delay_ms(100);
            restart_wdt();
            }                          // if
       if(!input(PIN_A4)){          // RA4 es 0 ?? esto solo por confirmar pregunto por 0 por eso el sigo " ! "
         //Se envía cuatro veces la "B" con un intervalo de 100 ms.
         for(cont=0; cont<4; cont++)
            {
            printf("B");//cancela llamada cama 1
            delay_ms(100);
            restart_wdt();
            }                          // if
    }
  }
}

void main()
{  setup_wdt(WDT_1152MS);
   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 ); //Para poder generar 200ms
   setup_comparator(NC_NC);   // Todo digital
   set_tris_a(0xFF);   //
   enable_interrupts(GLOBAL);          //Interrupciones Habilitadas
   enable_interrupts(INT_RA3); 
   enable_interrupts(INT_RA4); 
   //Bucle infinito.
   while(TRUE)
   {
   SLEEP();
   }
}

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Problema en transmision RF
« Respuesta #1 en: 11 de Junio de 2018, 23:19:45 »
Hola estoy queriendo hacer una cominicacion por rf entre un pic 12f675 y un pic 16f628a, el 12f es el emisor que al cambiar el estado de RA4 tendria que mandar la letra B por serial pero lo que pasa es que la interrupcion por cambio de estado en el pic 12f cuando presiono el boton RA4 no me la detecta, este es el programa emisor, agradeceria una mano con esto#include <12F675.h>
Código: [Seleccionar]
#FUSES WDT                   
#FUSES INTRC                   
#FUSES NOMCLR                 
#FUSES NOBROWNOUT                           
#FUSES PROTECT                  //Code protected from reads
int8 cont=0;
#use delay(int=4000000)
#use rs232(baud=4800,parity=N,xmit=PIN_A1,rcv=PIN_A0,bits=8,stream=PORT1)
#INT_RA              //interrupcion por cambio de estado en pines
    Transmision(){                    //Interrupcion por cambio de estado en pines
       if(!input(PIN_A3)){          // RA3 es 0 ?? esto solo por confirmar pregunto por 0 por eso el sigo " ! "
         //Se envía cuatro veces la "A" con un intervalo de 100 ms.
         for(cont=0; cont<4; cont++)
            {
            printf("A");//envia llamada cama 1
            delay_ms(100);
            restart_wdt();
            }                          // if
       if(!input(PIN_A4)){          // RA4 es 0 ?? esto solo por confirmar pregunto por 0 por eso el sigo " ! "
         //Se envía cuatro veces la "B" con un intervalo de 100 ms.
         for(cont=0; cont<4; cont++)
            {
            printf("B");//cancela llamada cama 1
            delay_ms(100);
            restart_wdt();
            }                          // if
    }
  }
}

void main()
{  setup_wdt(WDT_1152MS);
   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 ); //Para poder generar 200ms
   setup_comparator(NC_NC);   // Todo digital
   set_tris_a(0xFF);   //
   enable_interrupts(GLOBAL);          //Interrupciones Habilitadas
   enable_interrupts(INT_RA3); 
   enable_interrupts(INT_RA4); 
   //Bucle infinito.
   while(TRUE)
   {
   SLEEP();
   }
}

Creo que el problema radica en que necesitas apagar el ADC:
setup_adc(ADC_OFF);
setup_adc_ports(NO_ANALOGS);

O bien  lo puedes hacer mediante el registro ANSEL:

#BYTE    ANSEL=0x9F;

y luego dentro del main:

ANSEL = 0;

elreypic.

Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 577
Re:Problema en transmision RF
« Respuesta #2 en: 12 de Junio de 2018, 07:21:15 »
Hola, el 12F675, no posee módulo UART, me parece raro que el compilador reconozca la directiva #use rs232.
Tendrás que recurrir al modo por software.
Aunque tampoco hay mucho espacio en la flash del PIC,  cómo para hacer un gran programa. Quizás tengas que migrar a otro modelo con UART y más memoria flash.
« Última modificación: 12 de Junio de 2018, 07:25:29 por Robert76 »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Problema en transmision RF
« Respuesta #3 en: 12 de Junio de 2018, 10:35:28 »
Hola, el 12F675, no posee módulo UART, me parece raro que el compilador reconozca la directiva #use rs232.

Esa directiva cuando se selecciona un pin que no es de hardware, inicia una UART por software.

Código: [Seleccionar]
    Transmision(){                    //Interrupcion por cambio de estado en pines
No entiendo como es que puede validar el compilador esa linea como funcion. Ya que deberia exigir como minimo que se especifique el valor de retorno. Es decir:

Código: C
  1. void Transmision(void) {

El identado esta mal, los comentarios estan mal ( hay dos // if que no corresponde), y a simple vista parece otra cosa.. Parece esto:

Código: [Seleccionar]
void funcion() {
      if(PINA3) {
      }
     
      if(PINA4){
      }
}

Pero en realidad es, y seguramente ahi radique su error:

Código: [Seleccionar]
void funcion() {
      if(PINA3) {
           if(PINA4){
           }
      }
}


Dejo el codigo correctamente identado:

Código: C
  1. void  Transmision(void)
  2. {                    
  3.         if(!input(PIN_A3))
  4.         {          
  5.                 for(cont=0; cont<4; cont++)
  6.                 {
  7.                         printf("A");//envia llamada cama 1
  8.                         delay_ms(100);
  9.                         restart_wdt();
  10.                 }
  11.                 if(!input(PIN_A4))
  12.                 {
  13.                         for(cont=0; cont<4; cont++)
  14.                         {
  15.                             printf("B");//cancela llamada cama 1
  16.                             delay_ms(100);
  17.                             restart_wdt();
  18.                         }
  19.                 }
  20.         }
  21. }

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:Problema en transmision RF
« Respuesta #4 en: 12 de Junio de 2018, 17:45:56 »
Hice los cambios que me sugeriste pero no funciona, gracias por la correccion, aqui el codigo modificado:
Código: [Seleccionar]
#include <12F675.h>

#FUSES WDT                   
#FUSES INTRC                   
#FUSES NOMCLR                 
#FUSES NOBROWNOUT                           
#FUSES PROTECT                  //Code protected from reads
int8 cont=0;
#use delay(int=4000000)
#use rs232(baud=4800,parity=N,xmit=PIN_A1,rcv=PIN_A0,bits=8,stream=PORT1)
#INT_RA   
        void  Transmision(void)
    {                   
            if(!input(PIN_A3))
            {         
                    for(cont=0; cont<4; cont++)
                    {
                            printf("A");//envia llamada cama 1
                            delay_ms(100);
                            restart_wdt();
                    }
                    if(!input(PIN_A4))
                    {
                            for(cont=0; cont<4; cont++)
                            {
                                printf("B");//cancela llamada cama 1
                                delay_ms(100);
                                restart_wdt();
                            }
                    }
            }
    }

void main()
{  setup_wdt(WDT_1152MS);
   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 ); //Para poder generar 200ms
   setup_comparator(NC_NC);   // Todo digital
   set_tris_a(0xFF);   //
   enable_interrupts(INT_RA3); 
   enable_interrupts(INT_RA4); 
   enable_interrupts(GLOBAL);          //Interrupciones Habilitadas
   //Bucle infinito.
   while(TRUE)
   {
   SLEEP();
   }
}

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:Problema en transmision RF
« Respuesta #5 en: 12 de Junio de 2018, 18:11:59 »
Gracias a todos  ya lo solucione

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Problema en transmision RF
« Respuesta #6 en: 12 de Junio de 2018, 18:20:23 »
Gracias a todos  ya lo solucione

Era clara la solución una vez que KILLERJC dio esa excelente explicación.
Podrías colocar el código?

elreypic.

Desconectado soymoe

  • PIC18
  • ****
  • Mensajes: 456
    • El blog de Moe
Re:Problema en transmision RF
« Respuesta #7 en: 13 de Junio de 2018, 09:48:10 »
Código: [Seleccionar]
#include <12F675.h>

#FUSES WDT                   
#FUSES INTRC                   
#FUSES NOMCLR                 
#FUSES NOBROWNOUT                           
#FUSES PROTECT                  //Code protected from reads
int8 cont=0;
#use delay(int=4000000)
#use rs232(baud=4800,parity=N,xmit=PIN_A1,rcv=PIN_A0,bits=8,stream=PORT1)
#INT_RA   
        void  Transmision(void)
    {                   
            if(!input(PIN_A3))
            {       
            output_high(PIN_A2);
                    for(cont=0; cont<8; cont++)
                            {
                            printf("A");//envia llamada cama 1
                            delay_ms(50);
                            output_Low(PIN_A2);
                            restart_wdt();
                            }
            }
                    if(!input(PIN_A4))
                    {
                    output_high(PIN_A2);
                            for(cont=0; cont<20; cont++)
                            {
                             printf("B");//cancela llamada cama 1
                             delay_ms(200);///estabilizo mas la senial
                             output_Low(PIN_A2);
                             restart_wdt();
                            }
                    }
           
    }

void main()
{  setup_wdt(WDT_1152MS);
   setup_timer_1 ( T1_INTERNAL | T1_DIV_BY_8 ); //Para poder generar 200ms
   setup_comparator(NC_NC);   // Todo digital
   set_tris_a(0xFC);   // ra2 como salida
   enable_interrupts(INT_RA3); 
   enable_interrupts(INT_RA4); 
   enable_interrupts(GLOBAL);          //Interrupciones Habilitadas
   //Bucle infinito.
   while(TRUE)
   {
   SLEEP();
   }
}