Hola a todos, estoy trabajando con CCS C en un PIC16F886 tengo que enviarle comandos RS232 al pic mediante el hyperterminal mismo, mi problema es que una vez le envio el comando al PIC y hace lo que tenga que hacer, activar a nivel alto el PIN_B7 por ejmplo, cuando le vuelvo a enviar otro comando sea cual sea, aunke ese comando no este predefino en el programa, pues cuando se lo envio se ponen ese bit que estaba a estado alto canvia a estado bajo. Me imagino que habre puesta mal la interrupcion, ya que no soy muy diestro con esto, os cuelgo el programa en C por si veis mi error. Basicamente lo que queria que hiciera este programa es:
-Recibir un dato por el puerto RS232 guardar ese dato en la variable (S2).
-Comparar ese dato guardado con los comandos predefinos mediante la funcion [if(strcmp(s2,opcion5)==0)] , para que cuando ese valor sea 0 sigunifica que son iguales realize la llamada.
-Luego en el SUBprograma active lo que tenga que activar.
Gracias.
//////////////ENCABEZADO/////////////////////////////
#include <16F886.h>
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES NOPUT //No Power Up Timer
#FUSES MCLR //Master Clear pin enabled
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPD //No EE protection
#FUSES BROWNOUT //Reset when brownout detected
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES LVP //Low Voltage Programming on B3(PIC16) or B5(PIC18)
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BORV40 //Brownout reset at 4.0V
#include <string.h>
#include <stdlib.h>
#use delay(clock=2000000) //Osc Interno a 2 Mhz
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232
#use i2c(Master,sda=PIN_C4,scl=PIN_C3,fast=450000) //Configuracion I2c
#use fast_io(b)
////////////////////////////////LLAMADAS A SUBPROGRAMAS Y CREACION DE VARIABLES/////////////////////
void char mode_standby();
void char mode_carga();
void char mode_laser();
char *opcion2="mode_carga";
char *opcion3="mode_standby";
char *opcion5="mode_laser";
int check=0;
char s2[10]; //Creamos una varible de intercambio para las Opciones
char s1[3];
int16 xdac;
int c;
////////////////////////INTERRUPCION RS232///////////////////////////////
#int_RDA
void RDA_isr()
{
do {
fgets(s2);
c=0;
} while (c!=0);
}
///////////////////PROGRAMA PRINCIPAL////////////////////////
void main()
{
printf("\f \n\r");
OUTPUT_B(0x0);
set_tris_b(0x0D); //puerto B como salida
enable_interrupts(INT_SSP);
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);
setup_adc_ports(sAN0);
setup_adc(ADC_CLOCK_DIV_32);
if(strncmp(s2,opcion2,9)==0)
mode_carga();
if(strncmp(s2,opcion3,9)==0)
mode_standby();
if(strcmp(s2,opcion5)==0)
mode_laser();
c=0;
while (c!=0);
}
////////////////////////////SUBPROGRAMAS///////////////////////////////////////
void char mode_standby()
{
output_bit( PIN_B5, 1);
output_bit( PIN_B6, 0);
}
void int mode_carga()
{
check=0;
output_bit( PIN_B5, 0);
output_bit( PIN_B6, 0);
}
void char mode_laser()
{
check=1;
output_bit( PIN_B5, 1);
delay_ms(2);
output_bit( PIN_B6, 1);
}