#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);
}
}
}
#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, contador = 0;
int1 newresponse = 0, newsecond = 0;
#define TX_485_ENABLE PIN_C0
// subrutina de interrupción del timer1
#int_TIMER1
void TIMER1_isr(){
set_timer1(3036);
contador++;
if(contador == 2){
newsecond = 1;
contador = 0;
}
}
//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){
output_low(TX_485_ENABLE);
}
/********* 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);
output_B(0b10000000);
//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();
strcpy(command, "$01RP033\r");
//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();
fprintf(SENSOR, "%s", command);
USART_activa_rx();
newsecond = 0;
//activo led en C2
output_bit(PIN_C2, 1);
delay_ms(100);
output_bit(PIN_C2, 0);
}
}
}
Estuve probando con una consola serial (Hércules). Si envío la cadena "$01RP033\r" el sensor no responde.
Si envío como hexadecimal (24 30 31 52 50 30 33 33 0D) el sensor responde correctamente.
Eso me dice que el sensor no está respondiendo pues no entiende el comando.
¿Alguna idea de por qué podría pasar esto último?
#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[13] = "", command[9];
int k = 0, contador = 0, i = 0;
int1 newresponse = 0, newsecond = 0;
#define TX_485_ENABLE PIN_C0
// subrutina de interrupción del timer1
#int_TIMER1
void TIMER1_isr(){
set_timer1(3036);
contador++;
if(contador == 10){
newsecond = 1;
contador = 0;
}
}
//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);
output_B(0b10000000);
//led
output_bit(PIN_C1, 1);
output_bit(PIN_C2, 1);
delay_ms(500);
output_bit(PIN_C1, 0);
output_bit(PIN_C2, 0);
while(TRUE)
{
if(newresponse){
newresponse = 0;
fprintf(SCREEN, "%s", response);
output_bit(PIN_C1, 1);
delay_ms(100);
output_bit(PIN_C1, 0);
}else if (newsecond){
//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;
USART_activa_tx();
for(i=0; i<9; i++)
putc(command[i]);
USART_activa_rx();
newsecond = 0;
output_bit(PIN_C2, 1);
delay_ms(100);
output_bit(PIN_C2, 0);
}
}
}