Autor Tema: Problemas con comunicacion sr232 RF pic a pic  (Leído 1964 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Problemas con comunicacion sr232 RF pic a pic
« en: 04 de Octubre de 2011, 17:34:23 »
Hola amigos!!!

Tengo u pequeño problema ,,, estoy tratando de mandar y recibir a traves de modulos RF 6 diferentes mensajes:

Código: [Seleccionar]
1: arriba
2: abajo
3: izquierda
4: derecha
5: enfrente
6: atras

estos mensajes dependen de la poscion de un acelerometro analogico de tres ejes.

Estoy usando los modulos RF HM-T  HM_R a 915Mhz, un 18f14k50 y un 18f4550, compilador CCS 4.120

Cual seria la forma correcta de mandar y recibir los datos a traves de los modulos RF con rs232??? Eh leeido por el foro y encontre que a traves de #int_RDA se puede lograr una comunicacion estable para poder descartar toda la basura en el aire

si alguien conose algun manual que me ayude muchas gracias.

Cualquier ayuda se los agradeceria mucho..

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Problemas con comunicacion sr232 RF pic a pic
« Respuesta #1 en: 05 de Octubre de 2011, 06:50:39 »
Hola,
Lo que tienes que hacer es mandar la información del acelerómetro por la USART cada vez que sea necesario (me imagino que cuando alcance cualquiera de las tensiones que indiquen una orden).
En el pic que recibe esa información, tienes que utilizar la rutina de la interrupción RDA, en ella recoges el dato que te llega por el puerto serie de manera asincrona y ya lo tratas tu como tu programa necesite.
Lo único que tienes que tener cuidado es con el ruido en los transceptores, yo esos modelos no los he utilizado, no se como irán. Las frecuencias de trabajo son grandes pero aún así te puede interferir algo, anda cerca de la banda de gsm por ej. no se si el teléfono móvil te puede molestar por ahí, de todas formas con hacer tu un poco el protocolo para recibir lo arreglas. Quiero decir, que antes del dato que envíes, envíes una palabra clave para que  pueda comenzar la recepción y otra para finalizarla, así en el receptor sabrás que el dato que te ha llegado es correcto si va precedido y terminado por tus palabras clave.

Desconectado churrinfunflais

  • PIC12
  • **
  • Mensajes: 68
Re: Problemas con comunicacion sr232 RF pic a pic
« Respuesta #2 en: 06 de Octubre de 2011, 12:28:54 »
Hola,
Lo que tienes que hacer es mandar la información del acelerómetro por la USART cada vez que sea necesario (me imagino que cuando alcance cualquiera de las tensiones que indiquen una orden).
En el pic que recibe esa información, tienes que utilizar la rutina de la interrupción RDA, en ella recoges el dato que te llega por el puerto serie de manera asincrona y ya lo tratas tu como tu programa necesite.
Lo único que tienes que tener cuidado es con el ruido en los transceptores, yo esos modelos no los he utilizado, no se como irán. Las frecuencias de trabajo son grandes pero aún así te puede interferir algo, anda cerca de la banda de gsm por ej. no se si el teléfono móvil te puede molestar por ahí, de todas formas con hacer tu un poco el protocolo para recibir lo arreglas. Quiero decir, que antes del dato que envíes, envíes una palabra clave para que  pueda comenzar la recepción y otra para finalizarla, así en el receptor sabrás que el dato que te ha llegado es correcto si va precedido y terminado por tus palabras clave.

Si eh seguido tu consejo y eh creado una rutina de envio de la siguiente manera:

[Bandera de entrada = 170 (10101010)] -> ["Valor"] -> [Bandera Salida = 255 (11111111)]

el "Valor" es infinito hasta que exista algun cambio y adquiere cualquiera de estos valores:

1: arriba
2: abajo
3: izquierda
4: derecha
5: enfrente
6: atras

aqui esta el codigo del transmisor:
Código: [Seleccionar]
// TX---------------------------------------------------------

#include <18F14K50.h>
#device adc=8
#fuses INTRC_IO,NOWDT
#use delay(clock=8000000)
#use rs232(baud=9600, xmit=pin_b7, bits=8, stream=cubo)

int acelerometro() {
    int valor, x, y, z;

    set_adc_channel(11);
    delay_us(100);
    x = read_adc();

    set_adc_channel(10);
    delay_us(100);
    y = read_adc();

    set_adc_channel(9);
    delay_us(100);
    z = read_adc();

    if (z < x && z < y && z < 65) {
        valor = 1;
    } else if (z > x && z > y && z > 150) {
        valor = 2;
    } else if (x < y && x < z && x < 65) {
        valor = 3;
    } else if (x > y && x > z && x > 150) {
        valor = 4;
    } else if (y < x && y < z && y < 65) {
        valor = 5;
    } else if (y > x && y > z && y > 150) {
        valor = 6;
    } else {
        valor = 0;
    }
    return (valor);
}

void main(void) {

    setup_adc(ADC_CLOCK_INTERNAL);
    setup_adc_ports(ALL_ANALOG);
    
    int valor = 1;
    int flag = 0;

    while (TRUE) {
        while (valor != 0) {
            if (flag != 0) {
                putc(170);
                delay_ms(10);

                while (TRUE) {
                    valor = acelerometro();

                    if (valor == 0)
                        break;

                    putc(valor);
                    delay_ms(10);
                }

                putc(255);
                delay_ms(10);
            } else {
                flag = 1;
                valor = acelerometro();
            }
        }
        valor = acelerometro();
    }
        putc(valor);
}

Pero tengo muchos problemas en la recepcion de los datos y se me cuela mucho ruido, aqui dejo el codigo que tengo del receptor:
Código: [Seleccionar]
//RX----------------------------------------------

#include <18F4550.h>
#fuses INTEC_IO ,NOWDT, NOLVP
#use delay(clock=8M)
#use rs232(BAUD=9.6k, rcv=pin_c7, bits=8)
#include <flex_lcd.c>

#BYTE TRISA=0X85
#BYTE PORTA=0X05

int valor;
#int_RDA

void RDA_isr() {
    valor = getc();
}

int flag() {

    int flag;

    if (valor == 170) {
        flag = 1;
    } else if (valor == 255) {
        flag = 2;
    } else {
        flag = 0;
    }
    return flag;
}

void main() {

    int flg = flag();

    bit_clear(TRISA, 0);
    lcd_init();

    enable_interrupts(INT_RDA);
    enable_interrupts(GLOBAL);

    while (TRUE) {
        while (flg == 1) {
            while (valor == 1) {
                flg = flag();
                if (flg == 2 || flg == 0)
                    break;

                lcd_gotoxy(5, 1);
                printf(lcd_putc, "Arriba %3D", valor);
                delay_ms(100);
            }
            while (valor == 2) {
                flg = flag();
                if (flg == 2 || flg == 0)
                    break;

                lcd_gotoxy(5, 1);
                printf(lcd_putc, "Abajo %3D", valor);
                delay_ms(100);
            }
            while (valor == 3) {
                flg = flag();
                if (flg == 2 || flg == 0)
                    break;

                lcd_gotoxy(5, 1);
                printf(lcd_putc, "Izquierda %3D", valor);
                delay_ms(100);
            }
            while (valor == 4) {
                flg = flag();
                if (flg == 2 || flg == 0)
                    break;

                lcd_gotoxy(5, 1);
                printf(lcd_putc, "Derecha %3D", valor);
                delay_ms(100);
            }
            while (valor == 5) {
                flg = flag();
                if (flg == 2 || flg == 0)
                    break;

                lcd_gotoxy(5, 1);
                printf(lcd_putc, "Enfrente %3D", valor);
                delay_ms(100);
            }
            while (valor == 6) {
                flg = flag();
                if (flg == 2 || flg == 0)
                    break;

                lcd_gotoxy(5, 1);
                printf(lcd_putc, "Atras %3D", valor);
                delay_ms(100);
            }
            flg = flag();
            if (flg == 0)
                break;
        }
        flg = flag();
    }
}
« Última modificación: 06 de Octubre de 2011, 12:33:57 por churrinfunflais »

Desconectado NoSepComo

  • PIC18
  • ****
  • Mensajes: 305
Re: Problemas con comunicacion sr232 RF pic a pic
« Respuesta #3 en: 13 de Octubre de 2011, 04:30:27 »
Hola, pero el ruido que entra te confunde a la rutina del receptor?
Esque lo que puedes si no es utilizar las palabras para encapsular cada transacción. Lo único que se incrementa mucho el tráfico pero es más robusto.
Sin embargo los problemas del ruido los vas a tener siempre con este tipo de tranceptores y como el hardware no lo puedes arerglar mucho, pues te toca a ti apañartelas en el código.
De todas formas el ruido que recibas no debería tener más potencia que los valores que envíes.
Siento no serte de mucha más ayuda.
Si algo nuevo, coméntalo y lo pensamos.
Un saludo.


 

anything