Estimados:
Tengo un sensor RS485 el cual recibe un comando en hexadecimal y responde un dato de profundidad en ASCII. El comando a enviar es: 24 30 31 52 50 30 33 33 0D
Una respuesta sería: *01+5.0000 (viene con \r al final)
Problema:
No recibo respuesta desde el sensor en una protoboard. Si tengo respuesta en una simulación con proteus (en el terminal del sensor escribo algo y presiono enter).
Datos:
PIC: 16F82550
Compilador: CCS 4
A continuación pego el código C usado:
#include <18F2550.h>
#include <stdlib.h>
#fuses INTRC,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, STREAM=SENSOR, parity=N, bits=8)
#use rs232(baud=9600, xmit=PIN_B6, rcv=PIN_B7, STREAM=SCREEN, parity=N, bits=8)
char p, response[20] = "", command[9];
int k = 0, i = 0, contador = 0;
int1 newresponse = 0, newsecond = 0;
#define TX_485_ENABLE PIN_C0
// subrutina de interrupción del timer1
#int_TIMER1
void TIMER1_isr(){
contador++;
if(contador == 2){
newsecond = 1;
contador = 0;
}
set_timer1(3036);
}
//interrupcion por usart del pic
#INT_RDA
void usart_modem(void)
{
p = fgetc(SENSOR);
if(p == '\r') {
response[k] = '\0';
newresponse = 1;
k = 0;
}else if(p){
response[k] = p;
k++;
}
}
//funciones 485
void USART_activa_tx(void){
output_high(TX_485_ENABLE);
delay_ms(5);
}
void USART_activa_rx(void){
delay_ms(5);
output_low(TX_485_ENABLE);
delay_ms(1);
}
/********* Programa Principal *********/
void main(void)
{
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
enable_interrupts(INT_TIMER1);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
set_timer1(3036);
//activo PIN_B7 como entrada
set_tris_b(0b10000000);
//pines B0 a B5 apagados, B6 y B7 no se tocan
output_bit(PIN_B0, 0);
output_bit(PIN_B1, 0);
output_bit(PIN_B2, 0);
output_bit(PIN_B3, 0);
output_bit(PIN_B4, 0);
output_bit(PIN_B5, 0);
//activo PIN_C7 como entrada
set_tris_c(0b10000000);
//pines C0 a C5 apagados, C6 y C7 no se tocan
output_bit(PIN_C0, 0);
output_bit(PIN_C1, 0);
output_bit(PIN_C2, 0);
output_bit(PIN_C3, 0);
output_bit(PIN_C4, 0);
output_bit(PIN_C5, 0);
//mensajes sólo para saber que terminal es de cada dispositivo
fprintf(SCREEN, "SCREEN\r");
USART_activa_tx();
fprintf(SENSOR, "SENSOR\r");
USART_activa_rx();
//defino comando a enviar
command[0] = 36;
command[1] = 48;
command[2] = 49;
command[3] = 82;
command[4] = 80;
command[5] = 48;
command[6] = 51;
command[7] = 51;
command[8] = 13;
//compruebo que se enciende led en C1
output_bit(PIN_C1, 1);
delay_ms(500);
output_bit(PIN_C1, 0);
while(TRUE)
{
if(newresponse){
//si se recibe una respuesta la escribo en SCREEN
newresponse = 0;
fprintf(SCREEN, "%s", response);
//prendo led en C1
output_bit(PIN_C1, 1);
delay_ms(100);
output_bit(PIN_C1, 0);
}else if (newsecond){
//si ha pasado un segundo envio comando
USART_activa_tx();
for(i=0; i<9; i++)
putc(command[i]);
USART_activa_rx();
newsecond = 0;
//activo led en C2
output_bit(PIN_C2, 1);
delay_ms(100);
output_bit(PIN_C2, 0);
}
}
}
Adjunto también imagen png del esquema en proteus.
De antemano gracias por cualquier ayuda.