Autor Tema: Problema con modulos rf  (Leído 8511 veces)

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

Desconectado yipi

  • PIC12
  • **
  • Mensajes: 79
Problema con modulos rf
« en: 07 de Mayo de 2013, 09:37:13 »
Hola estoy intentando utilizar unos modulos rf a 434 MHz, con un pic 16f88 como emisor y un 16f628a como receptor utilizando el puerto serie de ambos micros. Deciros que utilizando cables y uniendo directamente los pics funciona perfectamente, el 16f88 mide la temperatura cada segundo a traves de un lm35 y la envia al 16f628 que la visualiza en formato binario en unos leds. Para ver el funcionamiento cada pic enciende un led cuando envia y el otro cuando recibe pero al utilizar los modulos rf el 16f628 enciende el led  muchisimas veces como si estuviera recibiendo muchos mas datos de los que en realidad se envian. Si desconecto el emisor, el receptor no recibe nada por lo que no parece que sean interferencias. Alguien sabe porque puede ser que el 16f628 haga saltar su interrupcion de la usart tantas veces cuando en teoria deberia saltar 1 vez por segundo. Y os recuerdo que con cables funciona correctamente.

Gracias.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Problema con modulos rf
« Respuesta #1 en: 07 de Mayo de 2013, 09:56:43 »
Que tal yipi,

Bueno el uso de modulos RF no es tan simple como conectarlos y listo. No se que tipo de modulos estes usando pero por los sintomas puedo decirte que no estas usando modulos de transmision-recepcion transparente, los cuales se usan directamente con un puerto serial.
Para usar los modulos que tienes, hay que desarrollar un protocolo con al menos codificacion manchester para poder transmitir los datos sin tener conflictos.
El problema de que tu modulo pareciera que recibe muchos datos, es porque el transmisor siempre esta transmtiendo, porque? La respuesta es simple, mencionas que estas usando un puerto serie lo que significa que el estado idle es un nivel alto, eso hace que el transmisor continuamente este transmitiendo es por eso que ves ese problema. Esso modulos debes usarlos con transmision invertida y no de forma normal como lo estas haciendo.

Saludos,

Elreypic.

Desconectado yipi

  • PIC12
  • **
  • Mensajes: 79
Re: Problema con modulos rf
« Respuesta #2 en: 07 de Mayo de 2013, 16:26:25 »
Hola elreypic, te pongo los enlaces del RX y el TX que tengo:
http://www.bricogeek.com/shop/modulos-radiofrecuencia/47-emisor-rf-434mhz.html
http://www.bricogeek.com/shop/modulos-radiofrecuencia/46-receptor-rf-434mhz-4800bps.html

No sabia que no se pudiera usar directamente el puerto serie pero despues de lo que me explicas tiene su logica que el transmisor siga transmitiendo porque la salida de tx del pic esta a ''1''.

Mi duda ahora es si desactivando la usart y poniendo la salida tx del pic a ''0'' entre cada envio se consigue que el transmisor de rf deje de enviar. Para hacer esto justo al final de cada envio bastaria con activar la interrupcion asociada a la transmision serie del pic, y en este momento desactivar la usart y poner tx a ''0''. Por supuesto antes del siguiente envio habria que activar de nuevo la usart.

Saludos.

 

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Problema con modulos rf
« Respuesta #3 en: 10 de Mayo de 2013, 12:18:22 »
Que tal yipi,

En realidad si puedes usar un puerto serie, pero tiene que ser en configuracion de transmision de forma invertida y no TRUE.
Explico la diferencia:

Modo TRUE
_____         ____                _________
         |____|      |______....|

Idle    Start   "1"   "0"            Stop bit

Modo Invertido

         ____         ______...
_____|      |____|             |________
Idle     Start  "1"    "0"         stop bit

Como puedes darte cuenta en forma invertida cuando quieres enviar un "1" colocas el pin en un nivel bajo, y cuando quieres enviar un "0" colocas el pin en un nivel alto.

Desafortunadamente el USART los micros que estas usando no puede configurarse de forma invertida, asi que tienes dos opciones:
1) Colocar un transistor a la salida del pin de TX para invertir los datos
2) Crear un USART por software (mediante codigo)

En el caso del receptor es lo mismo hay que colocar un transistor para invertir la señal o realizar el USART por software.

Una vez resuelto el problema anterior. Pasemos a lo importante, la comunicacion como tal.

1) Envias un pulso de 50 ms de duracion por el pin de transmision (nivel alto)
2) Bajas el nivel del pin por 5 ms
3) Envia dos datos en los que alterandamente se intercambian los niveles altos y bajos como puede ser $A5 y $5A o $AA y $55. Esto te servira como encabezado
4) Aqui es que se envian tus datos. Pero usa algun tipo de codificacion, como puede ser Manchester, PWM, NEC, etc. Yo te recomiendo manchester ya que es mas sencillo de usar.

Saludos y espero que esto te sirva para resolver tu problema.

Elreypic.

Desconectado yipi

  • PIC12
  • **
  • Mensajes: 79
Re: Problema con modulos rf
« Respuesta #4 en: 12 de Mayo de 2013, 14:02:16 »
Hola elreypic.

Voy a intentar empezar de cero y primero saber como funcionan estos modulos rf porque he hecho lo que me comentaste de colocar dos transistores invirtiendo y un protocolo de comunicacion elaborado por mi y no consigo que el receptor identifique las cadenas de datos. Se que los datos llegan al pic receptor pero no consigue identificar la trama correcta, por eso primero quiero saber como funcionan estos modulos.

He realizado una prueba  solo con los modulos rf, y le he conectado un reloj de 1 Hz al emisor y la salida del receptor a un led, y funciona perfecto, el problema es cuando le pones un '1' o un '0' fijo en la entrada del emisor, el led conectado al receptor hace unas cosas muy extrañas, se ve un parpadeo rapido como si estuviera recibiendo algo, creo que por eso no me funciona ni poniendo los transistores que invierten, porque siempre le esta metiendo datos al pic receptor aunque en la entrada del emisor rf tenga un '0'.

Sabes si esto es normal, o sabes como es el funcionamiento de estos modulos, se que el receptor tiene una patilla donde se podria ver la modulacion ask pero con un osciloscopio normal no se puede ver tanta frecuencia.

Saludos.


Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Problema con modulos rf
« Respuesta #5 en: 13 de Mayo de 2013, 00:19:36 »
Que tal yipi,

Conozco muy bien tales módulos y es por eso que te comento lo que tienes que hacer de lo contrario no podran funcionar como lo esperas.

con respecto a las pruebas que has realizado, es de esperarse que funcionen correctamente y como bien dices al colocar el transmisor en "1" o "0" fijos es que aparece el problema. Claro que sí, y eso es porque simple y sencillamente dejas al receptor a merced de todas las frecuencias que existen en el aire, ¿cuales? TV, radio, celular, entre otras. Teóricamente el receptor debe estar en un nivel bajo todo el tiempo que no esta recibiendo datos, pero eso se cumple si pudieras ahislarlo del mundo real, lo que es imposible. Tu receptor esta expuesto a todo tipo de seniales y eso hace que la salida del receptor nunca se quede fija.

Como solucionar el problema, pues haciendo lo que ya te comente, primero tienes que poner en alerta al receptor, y eso se hace aplicando un pulso de 50 ms en el transmisor y luego apagando el transmisor por unos 5 ms. Después de eso manda un encabezado en el que hay cambios de nivel de 1 a 0 (tal como lo hiciste en tus pruebas en el que usaste una senial de reloj, eso es cambio de niveles de 1 a 0, lo ves?) este encabezado puede ser un $AA y un $55, o bien un $A5 y un $5A. (Todo esto con un baud rate definido, regularmente estos modulos trabajan muy bien a 2400bps).
Despues de este encabezado es que puedesn enviar tus datos, pero esos datos tienen que estar codificados y una forma sencilla es usar manchester. Ya que esta codificacion hace eso enviar los datos de tal forma que siempre hay cambios de nivel. Dale una mirada a esta codificacion y veras que practico es.

Yo he implementado rutinas asi y siempre con muy buenos resultados. Así que te puedo garantizar que funcionan si los aplicas correctamente.

Saludos.

Elreypic.

Desconectado yipi

  • PIC12
  • **
  • Mensajes: 79
Re: Problema con modulos rf
« Respuesta #6 en: 13 de Mayo de 2013, 16:18:27 »
Que tal elreypic.

Entonces voy a intentar aplicar el protocolo que me dices, pero me surgen un par de preguntas:

- Sigo utilizando los transistores para invertir o ya no serian necesarios.

- He mirado la codificacion manchester  (creo que el protocolo rc-5 de philips la utiliza para los mandos a distancia), pero la cuestion es que para enviar un dato que consta de 8 bits en realidad necesitaria enviar 16, porque al fin y al cabo cada bit va a estar formado por 2 bits que cambian de '0' a '1' o bien de '1' a '0'.

- De la manera que tu me aconsejas primero tendria que deshabilitar la salida de la usart para enviar los pulsos de 50 y 5 mseg, y despues habilitarla para enviar todos los datos, porque como hablas de un baudrate de 2400 bps me imagino que utlizas la usart.

Saludos.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Problema con modulos rf
« Respuesta #7 en: 14 de Mayo de 2013, 09:55:21 »
Que tal Yipi:
Procedo a responder,

- Sigo utilizando los transistores para invertir o ya no serian necesarios.

   Si vas a utilizar el USART del micro, entonces si necesitas los transistores para realizar la inversion de los datos, pero no lo necesitas si no usas el USART del micro, es decir si emulas la comunicacion serial con tu codigo.

- He mirado la codificacion manchester  (creo que el protocolo rc-5 de philips la utiliza para los mandos a distancia), pero la cuestion es que para enviar un dato que consta de 8 bits en realidad necesitaria enviar 16, porque al fin y al cabo cada bit va a estar formado por 2 bits que cambian de '0' a '1' o bien de '1' a '0'.

   Es corrrecto, cuando lo codificas ahora se hacen 16 bits.

- De la manera que tu me aconsejas primero tendria que deshabilitar la salida de la usart para enviar los pulsos de 50 y 5 mseg, y despues habilitarla para enviar todos los datos, porque como hablas de un baudrate de 2400 bps me imagino que utlizas la usart.

   Así es, si utilizas el USART entonces tienes que deshabilitarlo y usar el pin como salida para poder generar los pulsos y despues habilitarla para enviar los datos. Yo no utilizo el USART del micro cuando uso estos modulos, todo lo hago por firmware (o sea por codigo)

Saludos,

elreypic


Desconectado yipi

  • PIC12
  • **
  • Mensajes: 79
Re: Problema con modulos rf
« Respuesta #8 en: 01 de Junio de 2013, 14:59:52 »
Hola elreypic

Despues de tener apartado el tema durante algun tiempo esta semana he vuelto a experimentar y he conseguido que funcione.

Finalmente he optado por seguir tus consejos y pasar de la usart, me he creado una especie de protocolo con un pulso de sincronizacion de 50ms seguido de otro de 5 ms y despues un 0xAA y un 0x55, y despues el dato en dos bytes codificados en formato manchester y funciona perfecto. Pero como siempre hay pegas.

Alimento el emisor con 9 Voltios (todavia puedo aumentar hasta 12 V, ya que al parecer cuanto mas te acerques al maximo de su alimentacion mas distancia consigues), utilizo de antenas dos cachos de hilo de 13 cm como dice en el manual pero es que al alejarme unos 2 metros el receptor deja de recibir. Todo esto en un habitacion cerrada. Ya me imagino que dos cachos de hilo no es ni mucho menos una buena antena pero es que 2 metros me parece muy poco.

¿Cuanta distancia consigues tu?

Saludos

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Problema con modulos rf
« Respuesta #9 en: 22 de Junio de 2013, 09:19:54 »
Que tal yipi,

Podrias colocar tu circuitos y tu codigo para ver lo que estas haciendo. Poruqe yo logro conseguir una distancia bastante considerable, alrededor de unos 60 a 70 mts con 5V en el transmisor.

Saludos.

Elreypic.

Desconectado yipi

  • PIC12
  • **
  • Mensajes: 79
Re: Problema con modulos rf
« Respuesta #10 en: 22 de Junio de 2013, 11:03:06 »
Hola rey pic adjunto unas fotos de los circuitos.

El emisor puedes ver que esta montado en una protoboard alimentado por una pila de 9V. Justo debajo de la pila esta el emisor Rf, en el centro de la foto hay un regulador 7805 para alimentar el pic que como puedes ver esta en una placa independiente, y en la parte inferior esta el sensor de temperatura lm35. La temperatura se envia una vez por segundo

El receptor esta montado en un entrenador de circuitos, el led verde se enciende o apaga cada vez que recibe un dato correctamente, en la parte inferior esta el receptor de RF que aunque en ese momento no tenia antena le coloco un hilo de 13 cm mas o menos tal y como dice en el manual, y arriba el pic con su oscilador. Mas arriba tengo unos leds en los que visualizo la temperatura recibida en binario.

Ahora que lo pienso el receptor esta montado en un entrenador de circuitos, que proporciona alimentaciones fijas y variables, asi como señales de reloj... No estara interfiriendo el trafo del entrenador o algun circuito que tenga dentro.

Si necesitas el codigo te lo subo aunque como te dije funciona bien puesto que a poca distancia la temperatura visualizada en los leds mas o menos es correcta y varia si calientas o enfrias el lm35 del emisor.

Saludos.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Problema con modulos rf
« Respuesta #11 en: 22 de Junio de 2013, 23:28:53 »
Que tal yipi,

De pronto lo que puedo ver es que la longitud de cable que usas como antena no es el correcto. Ya que si estas usando modulos de 315MHz la longitud debe ser de 23 cm y no de 13cm como mencionas que estas usando. O bien de 17cm si estas usando modulos de 434MHz. Esto lo puedes corroborar con la siguiente formula:

Longitud de la Antena (en metros) = 72/Frec (en MHz).

Por lo tanto si los modulos son de 315 MHz, entonces:

L = 72/315 = .2285 m = 22.85 cm (aprox 23 cm)

Ahora que si son de 434MHz que en realidad son de 433.92 MHz, tenemos que:

L = 72/433.92 = .1659 m = 16.59 cm (aprox, 17 cm)

Algo que no alcanzo a distinguir es si estas usando el pin de salida digital en el receptor, ya que si estas usando el analogico no te funcionara correctamente.

Mira el datasheet de tu modulo:

https://www.sparkfun.com/products/10532

Por favor sube tus codigos para analizarlos.

Saludos,

Elreypic.

Desconectado yipi

  • PIC12
  • **
  • Mensajes: 79
Re: Problema con modulos rf
« Respuesta #12 en: 23 de Junio de 2013, 09:49:34 »
Hola elreypic.

No sabia que la longitud de las antenas fuera tan critica, en cuanto pueda las pongo de 17 cm las dos ya que los modulos son de 434 Mhz, por cierto los hilos deben estar desnudos o sirven con la funda plastica.

Utilizo el pin digital de salida del receptor, el analogico lo dejo al aire no se si esta bien asi o es mejor fijarlo a un potencial ya sea '0' o '1'.

Codigo del emisor:
Código: [Seleccionar]
#pragma config=0X2f61
#pragma config reg2=0X0000
#pragma chip PIC16f88
#pragma interruptSaveCheck n
#pragma codepage 0
#pragma sharedAllocation

#pragma origin 4


static uns8 CUENTA; //variable para contar 0,5 seg
static uns8 BUCLE; //variable para controlar el flujo del programa
static uns8 CABECERA_1; //variables para guardar las cabeceras
static uns8 CABECERA_2;
static uns8 RESULTADO_1; //variables para guardar el resultado
static uns8 RESULTADO_2;


static uns16 INTER; //variable temporal donde guardo la parte alta del valor obtenido por el CAD
static uns16 RESUL;
static uns8 RESUL_1; //variable donde se guarda el valor del la temperatura
static uns8 COPIARESUL; //variable donde guardo una copia en binario de la temperatura obtenida por el CAD

//declaraciones de funciones
void retardo_10u(unsigned char i); //funciones de los retardos
void retardo_m(unsigned char i);
void envia_cadena (uns8 X,uns8 Y, uns8 A,uns8 B); //funcion que envia la cadena con las 2 cabeceras y el dato codificado en manchester
void envia_dato (uns8 DATO_1); //funcion que envia un dato en particular
uns8 manchester(uns8 DATO); //funcion que codifica un dato en manchester



interrupt inter (void) //rutina de atencion a la interrupcion

{
if (T0IF==1) //si se produce la interrupcion del timer 0
{ T0IF=0; //borro el flag
if(CUENTA==0){ //si la variable CUENTA llega a '0'
CUENTA=133; //pongo CUENTA a 133
switch(BUCLE){

case 0x00:{ //si la variable que controla el programa es '0'
T0IE=0; //deshabilito la inter del timer
ANSEL=0X10; //configuro el CAD en el orden que manda el datasheet, primero selecciono la entrada analogica
ADCON1=0X80; //justificado resultado del CAD a la derecha
ADCON0=0X20; //selecciono el canal de entrada analogico 4
ADCON0=0XE0; //selecciono el reloj de conversion interno
ADCON0=0XE1; //enciendo el CAD
ADIF=0; //borro el flag del CAD
ADIE=1; //habilito la interrupcion del CAD
PEIE=1; //habilito interrupciones generales
GIE=1;
retardo_10u(1); //retardo para respetar el tiempo de adquisicion necesario
GO=1; //arranco el CAD
T0IF=0; //borro el flag de interrupcion del timer 0
PORTB.5=!PORTB.5;
break;
}

case 0x01:{ //si la variable que controla el programa es '1'
//T0IE=0;
PORTB.0=0; //pongo la patila b.0 a '0'
PORTB.6=!PORTB.6;
BUCLE=0X02; //actualizo la variable de control del programa
break;
}

case 0x02:{ //si la variable que controla el programa es '2'
T0IE=0; //deshabilitamos la inter del timer 0
envia_cadena(CABECERA_1,CABECERA_2,RESULTADO_1,RESULTADO_2); //funcion que envia una cadena
BUCLE=0X00; //se pone la variable que controla el programa a '0'
TMR0=0; //se pone el timer 0 a '0'
T0IE=1; //deshabilito la inter del timer 0
break;
}
}
}
else{
CUENTA--; //decremento CUENTA

}
}

else {
ADIF=0; //borro el flag
ADIE=0; //deshabilito la inter del CAD
ADON=0; //apago el CAD
RESUL=ADRESL;
INTER=ADRESH*256;
RESUL=RESUL+INTER; //convierto valor del CAD a decimal
RESUL=RESUL*100;
RESUL=RESUL/205; //convierto el valor a grados
RESUL_1=RESUL; //hago dos copias del resultado
COPIARESUL=RESUL;
PORTB.0=1; //pongo la salida b.0 a '1'
RESULTADO_1=manchester(RESUL_1); //codifico la mitad del resultado en manchester y lo guardo en RESULTADO_1
COPIARESUL=COPIARESUL>>4; //desplazo el resultado 4 bits a la derecha
RESULTADO_2=manchester(COPIARESUL); //codifico la otra mitad del resultado en manchester y lo guardo en RESULTADO_2
TMR0=0; //pongo el timer 0 a '0'
T0IE=1; //deshabilito la ineterrupcion del timer 0
BUCLE=0X01; //pongo a '1' la variable de control del programa





}
}







#include "retardos.inc" //libreria que incorpora los retardos



void main (void)

{

TRISB=0X00; //configuro el puerto b como salida
TRISA=0X10; //configuro la entrada a4 como entrada
ANSEL=0X10; //selecciono la entrada a4 como entrada del CAD
OPTION_REG=0X03;
CUENTA=133; //inicializamos la variable cuenta para que cuente 0.5 seg
PORTB=0X00; //ponemos el puerto b a '0'
TMR0=0; //inicializa el temporizador
INTCON=0XE0; //configuramos y habilitamos las interrupciones
BUCLE=0X00; //inicializamos la variable de control del programa
CABECERA_1=0XAA; //inicializamos las variables que sirven de cabecera
CABECERA_2=0X55; //para el envio de un dato
RESULTADO_1=0X00;
RESULTADO_2=0X00; //inicializamos las variables

while(1);

}

uns8 manchester(uns8 DATO) //funcion que codifica un dato en manchester
{
uns8 i;
uns8 RESULTADO=0; //variable donde se guarda el resultado de la codificacion
for(i=0;i<4;i++){
RESULTADO=RESULTADO>>2; //desplazamos la variable RESULTADO dos bits para dar entrada a los bits nuevos
if(DATO.0==1){
RESULTADO.6=1; //guardamos los bits conforme a la conversion
RESULTADO.7=0;
}
else{
RESULTADO.6=0;
RESULTADO.7=1;}
DATO=DATO>>1; //desplazamos la variable DATO un bit para evaluar el siguiente bit a codificar
}
return RESULTADO; //devolvemos el dato codificado
}

void envia_cadena (uns8 X,uns8 Y,uns8 A,uns8 B) //funcion que envia la cadena formada por las cabeceras y el dato
{
PORTB.0=1; //iniciamos la transmision con un '1' de duracion de 50 mseg
retardo_m(50);
PORTB.0=0; //ponemos un '0' durante 5 mseg
retardo_m(5);
envia_dato(X); //se envian los cuatro datos que forman la cadena
envia_dato(Y);
envia_dato(A);
envia_dato(B);
PORTB.0=1; //una vez enviados los datos ponemos la salida a '1' lo que queda de medio segundo mas o menos 240 mseg
retardo_m(240);
PORTB.0=0; //ponemos la b.0 a '0'
}

void envia_dato (uns8 DATO_1) //funcion que envia un dato de los que forman la cadena
{
uns8 i;
PORTB.7=!PORTB.7;
PORTB.0=1; //bit de inicio durante 5 mseg
retardo_m(5);
for(i=0;i<8;i++){
if(DATO_1.0==1){ //van saliendo por la patillab.0 los bits correspondientes al dato
PORTB.0=1;}
else{
PORTB.0=0;}
DATO_1=DATO_1>>1; //desplazo la variable DATO_1 un bit para ir sacando el bit que corresponda
retardo_m(5);} //cadencia con la que salen los datos
PORTB.0=0; //bit de fin durante 5 mseg
retardo_m(5);
}

Te comento un poco como funciona. La salida que es la patilla portb.0 nunca esta fija a '0' o a '1' mas de 0.5 segundos, (no se si recuerdas que ya comentamos que al quedarse un '0' o un '1' fijo empezaba a enviar cosas sin sentido y asi de esta manera me aseguro que no envia nada que yo no quiera) y aprovecho los momentos en que esta a '1' para hacer la conversion del CAD y el envio de datos alternativamente. En el dibujo adjunto lo puedes ver mejor.

Codigo del receptor:
Código: [Seleccionar]
#pragma config=0X2161
#pragma chip PIC16f628a
#pragma interruptSaveCheck n
#pragma sharedAllocation

#pragma origin 4


uns8 BUCLE; //variable donde se trata el valor de salida
uns8 DATO[4]; //matriz donde se guardan las dos cabeceras y el dato dividido en 2 partes

//declaraciones de funciones
void retardo_m(unsigned char i); //funcion retardo milisengundos
uns8 recibir_bits(); //funcion para recibir individualmente los bits que forman un dato
uns8 recibir_dato(); //funcion para recibir los cuatro datos que forman la cadena
uns8 unir_manchester (uns8 X,uns8 Y); //funcion para obtener el dato a partir de los dos valores codificados en manchester
uns8 u_manchester (uns8 Z); //funcion para decodificar el valor codificado en manchester


interrupt inter (void)
{
if (INTF==1){ //si se detecta interrupcion externa
INTF=0; //borro el flag de la inter externa
retardo_m(52); //espero 52 mseg para estar dentro del '0' de sincronizacion
if(PORTB.0==0){ //si detecto el '0'
GIE=0; //deshabilito las interrupciones mientras recibo los datos
if(recibir_dato()){ //si la recepcion se completo bien
if(DATO[0]==0XAA&&DATO[1]==0X55){ //si las cabeceras son correctas
PORTB.7=!PORTB.7; //niego la salida b.7 para saber que se recibio un dato valido
BUCLE=unir_manchester(DATO[2],DATO[3]); //guardo en una variable temporal el valor de la temperatura recibido en dos variables codificadas en manchester
BUCLE=BUCLE-10; //resto 10 para poder visualizarlo en 5 leds
PORTA=BUCLE;} //saco el valor por el puerto a
else{
PORTB.6=!PORTB.6;} //si hubo un error en la recepcion de alguna de las cabeceras lo muestro en la salida b.6
}
else{
PORTB.5=!PORTB.5;} //si hubo un error durante la recepcion de uno de los datos lo muestro en la salida b.5
}
else{
PORTB.4=!PORTB.4;} //si no detecto el '0' de sincronizacion lo muestro en la salida b.4
INTF=0; //borro el flag de la inter externa
GIE=1;} //si todo funciono bien vuelvo a habilitar las interrupciones
}



#include "retardos.inc" //libreria que incorpora los retardos




void main (void)
{
TRISB=0X01; //configuro el puerto B, la pata b.1 como entrada
TRISA=0X00; //configuro el puerto A
INTEDG=1; //habilito la interrupcion externa por flanco de subida
INTCON=0XD0; //configuro y habilito las interrupciones
BUCLE=0X00;
DATO[0]=0x00;
DATO[1]=0x00;
DATO[2]=0x00;
DATO[3]=0x00; //inicializo las variables
PORTB=0X00; //pongo el puerto b a '0'

while(1);

}





uns8 recibir_dato() //funcion para recibir los 4 datos que hay dentro de una cadena
{
uns8 TEMP; //variable temporal para guardar el dato recibido
uns8 i; //variable para el bucle
for(i=0;i<4;i++){
retardo_m(5); //espero 5 mseg para colocarme en el bit de inicio de cada dato a recibir
if(PORTB.0==1){ //si es un '1'
TEMP=recibir_bits(); //guardo en TEMP los bits recibidos
DATO[i]=TEMP; //guardo en una posicion de la matriz el dato recibido
retardo_m(5); //espero 5 mseg para colocarme en el bit de final
if(PORTB.0==0){ //si es un '0' se leyo el dato bien
}
else{
return 0x00;}} //si el bit de fin no se corresponde con un '0' la funcion devuelve un '0'

else{
return 0x00;} //si el bit de inicio no se corresponde con un '1' la funcion devuelve un '1'
}
retardo_m(5); //espero 5 mseg para salir de la cadena
return 0x01; //devuelve un '1' si se recibieron los cuatro datos que van dentro de la cadena
}

uns8 recibir_bits() //funcion para recibir los 8 bits que forman un dato
{
uns8 i;
uns8 OCTETO; //variable para guardar los 8 bits recibidos
for(i=0;i<8;i++){
retardo_m(5); //espero 5 mseg para colocarme en el primer bit
OCTETO=OCTETO>>1; //desplazo los bits hacia la derecha para dejar paso al siguiente
if(PORTB.0==1){
OCTETO.7=1;} //si en la entrada b.0 hay un '1' lo guardo en el bit 7 de la variable
else{
OCTETO.7=0;} //si en la entrada b.0 hay un '0' lo guardo en el bir 7 de la variable
}
return OCTETO; //devuelvo el valor recibido
}

uns8 unir_manchester (uns8 X,uns8 Y) //funcion para unir los dos valores recibidos en manchester en uno solo de 8 bits
{
uns8 TEMP_1; //variables temporales para hacer la union
uns8 TEMP_2;
uns8 TEMP_3;
uns8 TEMP_4;
TEMP_1=u_manchester(X); //decodifico el primer valor manchester
TEMP_2=u_manchester(Y); //decodifico el segundo valor manchester
TEMP_3=TEMP_2<<4; //uno los dos valores
TEMP_4=TEMP_1|TEMP_3;
return TEMP_4; //devuelvo el valor obtenido
}

uns8 u_manchester (uns8 Z) //funcion para decodificar el valor en manchester
{
uns8 i;
switch(Z){
case 0xAA:
i=0x00;
break;

case 0xA9:
i=0x01;
break;

case 0xA6:
i=0x02;
break;

case 0xA5:
i=0x03;
break;

case 0x9A:
i=0x04;
break;

case 0x99:
i=0x05;
break;

case 0x96:
i=0x06;
break;

case 0x95:
i=0x07;
break;

case 0x6A:
i=0x08;
break;

case 0x69:
i=0x09;
break;

case 0x66:
i=0x0A;
break;

case 0x65:
i=0x0B;
break;

case 0x5A:
i=0x0C;
break;

case 0x59:
i=0x0D;
break;

case 0x56:
i=0x0E;
break;

case 0x55:
i=0x0F;
break;
}
return i; //devuelvo el valor decodificado
}



El receptor funciona de la siguiente manera. Aprovecho la interrupcion externa del pic receptor para detectar los flancos de subida de la señal enviada como te indico en el dibujo adjunto, o bien se trata del pulso en el que el emisor utiliza el cad (pulso A en el dibujo) y por lo tanto el pic receptor no detectara nada posterior al flaco en la patilla b.0, o bien se trata del pulso en el que el emisor envia los datos (pulso B en el dibujo) y por lo tanto tras un retardo de 50 mseg el pic receptor detecta los valores correctos para la sincronizacion y recibira primero las cabeceras y despues el dato.

Mejor echale un vistazo y te aclaro lo que no entiendas porque me esta saliendo un post muy pesado jajajaj.

Saludos.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re: Problema con modulos rf
« Respuesta #13 en: 25 de Junio de 2013, 18:56:28 »
Que tal yipi,

Los cables de las antenas no tienen que estar desnudos.

Veo que el baudrate que estas generando en la transmision de datos es de 200bps, lo que significa que cada byte o dato se envia en 50ms por lo tanto el tiempo de transmision de la cadena es de 200ms (header1 + header2 + 2 data manchester coded) a esto le sumamos el pulso de sincronia de 50ms + 5 ms del tiempo de estabilizacion, nos da un total de 255ms. Esto quiere decir los los 245ms el transmisor esta habilitado, es decir ese tiempo el transmisor está enviando su portadora (carrier). Eso es cuando transmiste dato, pero cuando solo haces la conversion, practicamente el transmisor esta enviando su carrier por 0.5 segundos, y ahi esta el detalle. Lo que esta pasando es que tu transmisor-receptor se esta saturando. Ete fenomeno se manifiesta porque durante mucho tiempo estas intentando transmitir un nivel alto y eso genera la saturacion del receptor. Este protocolo funciona bien cuando el transmisor no esta enviando nada y de vez en cuando necesitas transmitir tu cadena.
Obviamente lo que quieres es que el receptor no genere esas señales indeseables y que el pin de salida este "estable" y eso lo lograste cuando transmites ese reloj de 1 segundo, pero eso satura al receptor y es por eso que no logras que la distancia sea mayor. Tienes que dejar de transmitir esa señal de reloj de 1 segundo, no importa que el receptor vea esos disparos aleatorios ya que nunca generaran la cabecera y por lo tanto esos datos puedes ignorarlos, solo cuando la cabecera se cumple, los datos son correctos de los contrario se ignoran.

Saludos

Elreypic.

Desconectado yipi

  • PIC12
  • **
  • Mensajes: 79
Re: Problema con modulos rf
« Respuesta #14 en: 26 de Junio de 2013, 16:39:54 »
Hola elreypic.

Entonces lo que voy a hacer es lo siguiente: mantener la salida siempre a '0' (patilla B.0 del micro), y aprovechando la interrupcion que me genera el CAD cuando termina la conversion envio el dato con sus cabeceras (la conversion del CAD la arranco por ejemplo cada 0.5 segundos) y al terminar de enviar el dato volver a poner la salida a '0' hasta una nueva conversion.

Asi deberia funcionar y alcanzar mas distancia no?

Saludos.



 

anything