Hola a todos,
llevo muchos años leyéndoos pero creo que nunca he llegado a escribir algo en el foro. Bueno, creo que si pero con un nick parecido al que tengo del que perdí la clave en alguno de los cambios de foro que se han llevado a cabo a lo largo de los años. Si he podido llegar a hacer alguna "chapucilla" ha sido sobre todo a los códigos que RedPic ha compartido con todos.
Veréis, estoy haciendo una simulación en Proteus donde uso un puerto COM real del PC (a través de COMPIN) para adquirir datos de un instrumento. EL problema está en que puedo enviarle datos al instrumento pero no recibo ningún dato del mismo. Si puedo ver como se pone en rojo el pin RX del COMPIN como si estuviera recibiendo datos. El instrumento envía varios bytes (unos 154) cada 5 segundos más o menos.
He intentado recibirlos mediante interrupción pero parece que no se llega a ejecutar. He probado a que cuando entre en la interrupción RDA encienda un LED pero nunca ocure esto.
El código lo he hecho en CCS. Si le mando el carácter "S" ASCII al instrumento se pone en standby y si le mando el carácter "R" arranca. Simplemente hago esto para ver si le llegan los comandos al instrumento. Una vez veo que si, espero recibir datos del mismo para procesarlos. Simplemente quiero ver si recibo "algo" pero parece que no. No se cual puede ser el problema. En el esquema de proteus hay un dac y alguna cosa más que forma parte del proyecto pero en esta parte está inoperativa.
Adjunto el código y la simulación de proteus.
#include <16f876.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,NOPUT,BROWNOUT
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C6, rcv=PIN_C7)
#use standard_io(b)
#use standard_io(c)
#use i2c(master,sda=PIN_C4, scl=PIN_C3)
int const lenbuff=94;
int addcbuff(char c);
void echos (char c);
char rcvchar=0x00;
int xbuff=0x00;
char cbuff[lenbuff];
// INTERRUPCIONES /////////////////////////////////////////////////////////////
///////////////////////////////////////////////
#int_rda
void serial_isr()
{
rcvchar=0x00;
if (kbhit())
{
rcvchar=getc();
addcbuff(rcvchar);
putc (rcvchar);
}
}
int addcbuff (char c)
{
cbuff[xbuff++]=c;
if (xbuff>lenbuff)
xbuff=lenbuff;
}
void main() {
int valor;
INT flag=0;
enable_interrupts(global);
enable_interrupts(int_rda);
printf("\r\n\Listen on RS232 (Int)\r\n");
printf("R");
do{
Delay_ms(10000);
if (flag==0) printf("S");
Delay_ms(20000);
if (flag==0) printf("R");;flag=1;
}while(true);
}
¿Alguien puede echarme una mano con esto? Muchas gracias.