TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ramirez en 03 de Octubre de 2011, 11:32:39

Título: Escribir y leer sumultánemente por RS232
Publicado por: ramirez en 03 de Octubre de 2011, 11:32:39
Hola de nuevo, intento escribir y leer simultáneamente por RS232, pero al compilar me sale el siguiente error:

a numeric expression must appear here.

Le estoy dando vueltas pero no veo nada, os dejo el código por si alguien ve algo extraño.

Gracias de nuevo.

Código: [Seleccionar]
#include <16F877A.H>
#include <stdlib.H>
#use delay(clock = 4000000)
#fuses XT,NOWDT,NOPROTECT
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)




int sig;
int32 del, sal;
int32 dato;
void main(){

setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
 
 
#int_RDA
void  RDA_isr(void)
         {
           
            dato=getc();
             
             if (dato='0'){  //si el dato es 0 apaga el led
                    output_bit(PIN_D1,1);     
             }
             if (dato='1'){//si el dato es 1 enciende el led
             
                     output_bit(PIN_D2,1);
             }
                 delay_ms(3000);
                 output_bit(PIN_D1,0);
                 output_bit(PIN_D2,0);
               
         
             }



while(true){

set_adc_channel(0);
sig = read_adc();
printf("%03u\r",sig);


set_adc_channel(1);
del=read_adc();
printf("%03u\r",del);

delay_ms(1000);
}

}

Título: Re: Escribir y leer sumultánemente por RS232
Publicado por: pablomanieri en 03 de Octubre de 2011, 11:52:42
La rutina correspondiente a #int_RDA, va fuera del main. Por eso te da el error.
Otra cosa, cuando usas los if (....)..
el operador de comparación es  ==, por ejemplo
if (dato=='0'){...

un solo = significa asignación.

Título: Re: Escribir y leer sumultánemente por RS232
Publicado por: MLO__ en 03 de Octubre de 2011, 11:56:18
Hola.

Como aporte adicional: No uses delay's tan largos en la rutina de interrupción, puede generar problemas ... si quieres una espera, mejor hazla en el programa principal.

Saludos
Título: Re: Escribir y leer sumultánemente por RS232
Publicado por: ramirez en 03 de Octubre de 2011, 13:04:44
Gracias por vuestras respuestas, he hecho lo que me habéis dicho y funciona correctamente. Pero ahora me surge otra duda, si en lugar de mandar un o ó un 1 por el puerto serie quiero mandar una cadena de caracteres ¿cómo lo hago?, he cambiado la variable a tipo char, pero solo puedo mandar una letra, también he probado con unos ejemplos del foro haciendo char dato[8], pero tampoco obtengo buenos resultados.

Gracias de nuevo por vuestros consejos.
Título: Re: Escribir y leer sumultánemente por RS232
Publicado por: jeremylf en 04 de Octubre de 2011, 03:56:33
Para eso usas printf. Ejem:

printf("\r\nMi variable sig tiene el valor: %u", sig);
Título: Re: Escribir y leer sumultánemente por RS232
Publicado por: ramirez en 04 de Octubre de 2011, 13:05:00
Lo que intento y no consigo es escribir a través por ejemplo de virtual terminal (en realidad lo deseo hacer con labview) escribir una palabra por ejemplo "perro" y que al escribir esta palabra por ejemplo se encienda un salida. Lo único que he conseguido hasta el momento es hacerlo pero sólo con un carácter y no con una cadena de caracteres.
Título: Re: Escribir y leer sumultánemente por RS232
Publicado por: KALLITOS en 04 de Octubre de 2011, 13:13:12
Dale una revisada a ESTE HILO (http://www.todopic.com.ar/foros/index.php?topic=4530.0), por alli que encuentras lo que necesitas y alguito mas  ;-).

saludos
Título: Re: Escribir y leer sumultánemente por RS232
Publicado por: ramirez en 05 de Octubre de 2011, 07:14:54
Gracias por tu respuesta, ya conocía este hilo y le he dado otro repaso, pero sigo sin conseguir resultados óptimos, lo único que he conseguido  es un carácter y no una cadena de caracteres.

Agradecería cualquier orientación mas cercana.

De nuevo gracias a todos por el interés
Título: Re: Escribir y leer sumultánemente por RS232
Publicado por: AngelGris en 05 de Octubre de 2011, 09:48:27
  No que tan actualizado tengas tu código y también aclaro que no uso CCS. Pero creo que la idea básicamente sería lo mismo.

  Dentro de la rutina de interrupción de recepción, vas almacenando lo que llega en una array de caracteres y así tienes toda la palabra.

  Una manera de indicar que se terminó de recibir la palabra podría ser evaluando si el caracter recibido fue el #13 (creo que es el que corresponde al "Enter"). Dicho caracter no habría que almacenarlo en el array, así no forma parte de lo recibido.

  Luego hay que evaluar el texto allí almacenado y si se corresponde con lo que queremos se actua en consecuencia. En HitechC suelo utilizar la función strcmp() que es quien compara dos string.