Problema con PIC16F886

Hola a todos, estoy programando un PIC16F886 utilizando CCS C, y simulando con proteus, mi problema es que he conseguido que funcione todo como es debido en la simulacion mediante proteus pero cuando programo el pic y lo pruebo, al activar un bit a 1 por la salida RB4,se ejecuta el if de la opcion7 "t1on" el -->void char sel_tr1_on(). se me ponen a cero todas las demas salidas, en el proteus no pasa esto pero en la realidad si, y no se si es culpa del pic que se ha roto o hace un cierre, o es culpa de mi programa,¿podria ser porque la salida esa RB4 hay unas puertas logicas que me consumen 15mA y el pic al estar las otras activas no puede con toda esa corriente y por eso las pone a 0?, aqui os dejo el programa y los archivos de simulacion del proteus por si podeis ayudarme por favor.
Gracias.

#include <16F886.h>
#device adc=8
#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
//#FUSES NOWRT //Program memory not write protected
#include <string.h>
#use delay(clock=4000000) //Osc Interno a 4 Mhz
#use RS232(BAUD=9600, BITS=8 ,PARITY=N, XMIT=PIN_C6, RCV=PIN_C7) //Configuracion de Rs232
#use fast_io(b)

void char encendido_laser();
void char laser_apagado();
void char triger_on();
void char triger_off();
void char On_Rele_1();
void char Off_Rele_1();
void char On_Rele_2();
void char Off_Rele_2();
void char sel_tr1_on();
void char sel_tr1_off();
void char sel_tr2_on();
void char sel_tr2_off();


#int_RDA
RDA_isr()
{ // Interrupción recepción serie USART
char s2[8]; //Creamos una varible de intercambio
//char s1[8]; //Creamos una varible de intercambio
char *opcion="ontr";
char *opcion2="ofr1";
char *opcion3="onr1";
char *opcion4="carga";
char *opcion5="laser";
char *opcion6="onla";
char *opcion7="t1on";
char *opcion8="t1of";
char *opcion9="oftr";
char *opcion10="t2on";
char *opcion11="t2of";
char *opcion12="i2c";

printf("\f");

do{


printf("\r\n Comando :");
fgets(s2);
printf("\r\n Comando introducido es ");
puts(s2);

delay_ms(10);

if(strcmp(s2,opcion)==0)
{
//printf("\r\n Frecuencia");
triger_on();
}
else
{
if(strcmp(s2,opcion2)==0)
{
//printf("\r\n Rele 1 Posicion Reposo ");
Off_Rele_1();
}
else
{
if(strcmp(s2,opcion3)==0)
{
On_Rele_1();
}
else
{
if(strcmp(s2,opcion4)==0)
{
printf("\r\n Rele 2 Carga");
Off_Rele_2();
}
else
{
if(strcmp(s2,opcion5)==0)
{
On_Rele_2();
}
else
{
if(strcmp(s2,opcion6)==0)
{
printf("\r\n Laser en Marcha");
encendido_laser();
}
else
{
if(strcmp(s2,opcion7)==0)
{
sel_tr1_on();
}
else
{
if(strcmp(s2,opcion8)==0)
{
sel_tr1_off();
}
else
{
if(strcmp(s2,opcion9)==0)
{
triger_off();
}
else
{
if(strcmp(s2,opcion10)==0)
{
sel_tr2_on();
}
else
{
if(strcmp(s2,opcion11)==0)
{
sel_tr2_off();
}
else
{
if(strcmp(s2,opcion12)==0)
{
printf("\r\n Comunicacion I2C ");
}
else
{
printf("\r\n Vuelva A Introducir comando:");;
}
}
}
}
}
}
}
}

}
}
}
}
}
while(1);
}




void main()
{

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);
output_bit( PIN_B6, 0);
output_bit( PIN_B7, 0);

set_tris_b(0x00); //puerto B como salida
enable_interrupts(INT_RDA);
enable_interrupts(GLOBAL);

while(1);
}


void char encendido_laser()
{
delay_us(100);
output_high(pin_B7);
delay_ms(500);
output_low(pin_B7);
//output_bit( PIN_B3, 1);
//delay_ms(500);
}


void char triger_on()
{
setup_timer_2(T2_DIV_BY_4,249,1);
setup_ccp1(CCP_PWM);
set_pwm1_duty(512);
setup_oscillator(OSC_4MHZ);
printf("\n\r Señal PWM de 1 Khz por PIN_C2 \n\r");
//output_bit( PIN_B2, 1);
}

void char On_Rele_1()
{
//output_bit( PIN_B0, 1);
output_bit( PIN_B5, 1);
printf("\n\r Rele 1 en Posicion NA \n\r");
}

void char Off_Rele_1()
{
//output_bit( PIN_B0, 0);
output_bit( PIN_B5, 0);
printf("\n\r Rele 1 en Posicion NC \n\r");

}


void char Off_Rele_2(){
//output_bit( PIN_B1, 0);
output_bit( PIN_B6, 0);
printf("\n\r Rele 2 en Posicion de Carga \n\r");

}

void char On_Rele_2()
{
//output_bit( PIN_B1, 1);
output_bit( PIN_B6, 1);
printf("\n\r Rele 2 en Posicion de Laser \n\r");
}

void char sel_tr1_on()
{
//output_bit( PIN_B1, 1);
output_bit( PIN_B4, 1);
//output_bit( PIN_B0, 1);
printf("\n\r Seleccion de Triger Activado \n\r");
}

void char sel_tr1_off()
{
//output_bit( PIN_B1, 1);
output_bit( PIN_B4, 0);
//output_bit( PIN_B0, 0);
printf("\n\r Seleccion de Triger desactivado \n\r");
}

void char triger_Off()
{
output_bit(pin_c2,0);
setup_timer_2(T2_DISABLED,0,1);
output_bit(pin_c2,0);
printf("\n\r Señal PWM Apagada PIN_C2 \n\r");
//output_bit( PIN_B2, 0);
}

void char sel_tr2_on()
{
//output_bit( PIN_B1, 1);
//output_bit( PIN_B4, 1);
output_bit( PIN_C1, 1);
printf("\n\r Seleccion de Triger 2 Activado \n\r");
}

void char sel_tr2_off()
{
//output_bit( PIN_B1, 1);
//output_bit( PIN_B4, 0);
output_bit( PIN_C1, 0);
printf("\n\r Seleccion de Triger 2 desactivado \n\r");
}
 

Adjuntos

  • pic16f886_2.rar
    15.5 KB · Visitas: 4
Atrás
Arriba