TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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.
#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);
}
}
-
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.
-
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
-
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.
-
Para eso usas printf. Ejem:
printf("\r\nMi variable sig tiene el valor: %u", sig);
-
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.
-
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
-
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
-
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.