# Problema con PIC16F886



## ferorts (Ene 6, 2011)

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");
}


----------

