RS232 y labview con 18f4550

Tengo un problema de comunicación. Utilizo para la conexion serial un modulo de radiofrecuencia.

Cuando transmito cualquier caracter como un 0, labview lo ve como otro caracter distinto, en el caso de 0 un "ö".

El modulo de RF utiliza el flujo de control por Hardware. Por lo que utilizo el pin 8 del puerto serie (Clear to send) en una entrada para enviar una cadena y consigo el mismo resultado que sin utilizarlo.


#include <18F4550.h>

#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN //NOMCLR, PIN UTILIZADO PARA SABER SI ESTA CONECTADO POR USB
#use delay(clock=48000000)

#use rs232(baud=9600,parity=N,xmit=PIN_A0,rcv=PIN_A1,bits=8)

//Variables globales
int8 i;
int8 valor;

#int_rda
void rda_isr(){
i++;
valor=getc();
}

////////////////////////////////////////////////////
void main(void) {


int8 j; //bucles

set_tris_d(0x00);
set_tris_a(0xff);
set_tris_b(0b01111111);


setup_adc_ports(AN0_to_AN11); // Asigna el conversor A/D
setup_adc(ADC_CLOCK_DIV_64); // Asigna la velocidad

output_d(0xff); //limpia registros de salida
output_high(pin_c0);

disable_interrupts(int_ext);
disable_interrupts(GLOBAL);

enable_interrupts(int_ext);
enable_interrupts(int_rda);
enable_interrupts(global);

while(1){
delay_ms(50);
output_high(pin_d0);
delay_ms(50);
if(input(PIN_B5)==0){
printf ("0000000");
output_low(pin_d0);
}
}
}
 

Adjuntos

  • rs232.rar
    16.4 KB · Visitas: 61
Ahora funciona la transmisión. No habia puesto el max232 en el circuito...

Ahora el problema esta en utilizar la interrupcion #int_rda. cuando utilizo otros pines de transmision si funciona pero con los pines del usart para la interrupcion int_rda no, no entra en la interrupcion y tampoco transmite si pongo: xmit=PIN_C6,rcv=PIN_C7 . Dejo el codigo


#include <18F4550.h>

#fuses HSPLL,NOMCLR,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN //NOMCLR, PIN UTILIZADO PARA SABER SI ESTA CONECTADO POR USB
#use delay(clock=48000000)

#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

//Variables globales
int8 i;
unsigned int8 valor;
char d;

#int_rda
void serial_isr(){
i=50;
d=i;
printf ("%c",d);
valor=getc();
}

////////////////////////////////////////////////////
void main(void) {


int8 j; //bucles

set_tris_d(0x00);
set_tris_a(0xff);
set_tris_b(0b01111111);


setup_adc_ports(AN0_to_AN11); // Asigna el conversor A/D
setup_adc(ADC_CLOCK_DIV_64); // Asigna la velocidad

output_d(0xff); //limpia registros de salida
output_high(pin_c0);

disable_interrupts(int_ext);
disable_interrupts(GLOBAL);
disable_interrupts(INT_RDA);

enable_interrupts(int_ext);
enable_interrupts(int_rda);
enable_interrupts(global);

while(1){
delay_ms(50);
if(valor=="0")
output_d(false);
delay_ms(50);
if(i==255)
i=0;
d=i;
printf ("%c0",d);
if(valor=="1")
output_d(true);
}
}

Vaaaaaaaaaaaaaaaya pues todo funciona (un hilo mal puesto, escondido en el rx) jejejeje. Pues teneis un pequeño aporte entonces.
 
Última edición:
Atrás
Arriba