Autor Tema: Se resetea el PIC  (Leído 2304 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Se resetea el PIC
« en: 04 de Julio de 2011, 20:32:09 »
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);

}

Desconectado RALF2

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2060
Re: Se resetea el PIC
« Respuesta #1 en: 04 de Julio de 2011, 22:01:09 »
Epale amigo!
Viendo tu codigo me parece que tienes un error aqui:
Citar
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);
el tamaño de la opcion2 y 5 es de 10 caracteres, opcion3 es de 12 caracteres hay que corregir eso, ya que no cuadra con los valores que colocastes de 9 y 5, si es que quieres comparar esas cadenas de caracteres con lo que recibes por el puerto serial.
Lo otro es que la rutina de los if de arriba solo se ejecutara una vez  :mrgreen:
el problema esta en el while que colocas al final.
por lo que deberias colocar un lazo que siempre ejecute esas instrucciones o reacomodar esa parte, ya que solo la ejecutara el programa una vez  :mrgreen:
Otra cosa que me llama la atencion es como recoges los datos segun la forma correcta, segun el manual de ccs, deberia ser asi:
gets (string), no se deberias ver eso tambien  :mrgreen:



Saludos
« Última modificación: 05 de Julio de 2011, 00:12:46 por RALF2 »

Desconectado ferorts

  • PIC10
  • *
  • Mensajes: 36
Re: Se resetea el PIC
« Respuesta #2 en: 05 de Julio de 2011, 12:12:17 »
Epale amigo!
Viendo tu codigo me parece que tienes un error aqui:
Citar
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);
el tamaño de la opcion2 y 5 es de 10 caracteres, opcion3 es de 12 caracteres hay que corregir eso, ya que no cuadra con los valores que colocastes de 9 y 5, si es que quieres comparar esas cadenas de caracteres con lo que recibes por el puerto serial.
Lo otro es que la rutina de los if de arriba solo se ejecutara una vez  :mrgreen:
el problema esta en el while que colocas al final.
por lo que deberias colocar un lazo que siempre ejecute esas instrucciones o reacomodar esa parte, ya que solo la ejecutara el programa una vez  :mrgreen:
Otra cosa que me llama la atencion es como recoges los datos segun la forma correcta, segun el manual de ccs, deberia ser asi:
gets (string), no se deberias ver eso tambien  :mrgreen:



Saludos

Gracias RALF2, tienes razon  tengo que depurar eso en mi programa, como de momento no me ha producido problemas es algo que iba dejando para el fianl....xDxD. Mi problema era en la interrupcion con la funcion Do y while, las he quitado de manera que cada vez que salta la interrupcion solo guarda el dato en la variable S2 , es tan sencillo como esto:

#int_RDA
void RDA_isr()
{
 gets(s2);
}

Y ya esta. Asi funciona y el resto del programa seria igual, mejorandolo con la correccion que me has comentado. De nuevo gracias.