Es mas voy a enviar el programa completo para que lo analicen y vean porque inicializo así.
/********************************************************
Programa de prueba para circuito de alarma de detección de
irregularidad por cortocircuitado de terminales primarios de
Transformadores de corriente de Media Tensión.
Creado por Cristian Morales Vasquez
Estudiante en Prácticas
Medida Especial-Magdalena
Electricaribe S.A. E.S.P.
2009
*********************************************************/
/************************Inicialización**********************************************/
#include<pic.h> /* Libreria para reconocer funciones de microcontrolador PIC*/
#include "delay.h" /* Libreria para funciones de retardo de tiempo*/
static volatile bit led1 @ (unsigned)&PORTB*8+1; /*"led1" es la variable del led indicador de alarma*/
static volatile bit led2 @ (unsigned)&PORTB*8+2; /*"led2" es la variable del led indicador de operación*/
/*******Inicializacion de comunicacion serial************/
#define InitUSART() \
BRGH=1; \
SPBRG=25; \
SPEN = 1; \
SYNC = 0; \
TX9 = 0; \
RX9 = 0; \
CREN = 1; \
TXEN = 1; \
RCIE=0;
short int i1[9],i2[9], i3[9], v1[9], v2[9], v3[9]; /*ix es el vector que almacenará las 8 muestras tomadas a la señal alterna de corriente en un ciclo*/
char i,h; /*vx es el vector que almacenará las 8 muestras tomadas a la señal alterna de tensión en un ciclo*/
unsigned long cont1=0, cont2=0, cont3=0, cont4=0, cont5=0, cont6=0, even1=0, even2=0, even3=0; /*acumuladores para hallar el valor RMS de las señales y para contar los segundos que se mantiene la irregularidad*/
short int rmsi1, rmsi2, rmsi3, rmsv1, rmsv2, rmsv3; /*variables para hallar el valor rms de la señal muestreada*/
char mens1[]="AT+CMGF=1"; /*Mensaje de configuración para el Modem*/
char mens2[]="AT+CMGS=\"3118235452\""; /*numero de telefono al que llamara el modem*/
char mens3[]="Problema de medida"; /*Mensaje que enviará el modem al número especificado*/
char mens4[3]; /*vector que almacenará la palabra ok*/
/************************************************************************************/
void Init_adc() /*Inicializacion modulo ADC*/
{
ADCON1 = 0b10001000; /*Se configuran los terminales AN3 como +Vref y AN2 como -Vref*/
ADCON0 = 0b10000001; /*Inicialización, se modifica mas adelante*/
}
/**********Funcion para el muestreo de señales******************/
//***canal especifica el canal a utilizar
//***despl especifica el # de bits para el muestreo
// 0 corresponde a 10bit de muestreo
// 1 corresponde a 9bit de muestreo
// 2 corresponde a 8bit de muestreo
int adc(unsigned char canal,unsigned char despl) /*Configuración del ADC*/
{
int temp;
ADCON0 &= 0b11000111;
canal= canal << 3 ;
ADCON0 |=canal;
DelayUs(50);
ADGO=1; //START ADC
while(ADGO) continue ; //adc oK
temp=((ADRESH<<
+ADRESL);
temp=temp>>despl;
return temp;
}
/***********Programa Principal*****************/
void main(void)
{
TRISA=0x2F; /*Canales de entrada RA0, RA1, RA5 y Tensiones de referencia RA2 y RA3*/
TRISB=0x0; /*RB1 y RB2 seran las salidas de led1 y led2*/
TRISC=0x80; /*RC7 como RX y RC6 como TX para comunicación serial*/
TRISD=0x0; /*+Vref será +5V y -Vref será de -5V*/
TRISE=0x7; /*Canales de entrada RE0, RE1 y RE2*/
PORTB=0; /*Todas las salidas a 0V*/
PORTC=0;
PORTD=0;
led2=0;
led1=0;
/*Los canales de entrada RA0, RA1 y RA5 se toman como entradas de señales de los TC's*/
/*Los canales de entrada RE0, RE1 y RE2 se toman como entradas de señales de los TP's*/
do{
/********Muestreo de señales de tensión y de corriente cada 2.083mS-->480Hz*********/
for (i=0;i<=9;i++){
i1
=adc(0,0);
i2=adc(1,0);
i3=adc(4,0);
v1=adc(5,0);
v2=adc(6,0);
v3=adc(7,0);
delayMs(2);
DelayUs(83);
}
/********Fin del muestreo**********************************************************/
/********Calculo del valor RMS de las señales muestreadas almacenadas*************/
for (i=0;i<=9;i++){
cont1=((i1)^2)+cont1;
cont2=((i2)^2)+cont2;
cont3=((i3)^2)+cont3;
cont4=((v1)^2)+cont4;
cont5=((v2)^2)+cont5;
cont6=((v3)^2)+cont6;
}
rmsi1=(cont1/8)^(1/2);
rmsi2=(cont2/8)^(1/2);
rmsi3=(cont3/8)^(1/2);
rmsv1=(cont4/8)^(1/2);
rmsv2=(cont5/8)^(1/2);
rmsv3=(cont6/8)^(1/2);
/***************************************************************************************/
/*******Establecimiento de la condición de irregularidad, tensión en sec. de TC's muy baja > 10 días******/
if((rmsv1>=529&&rmsv2>=529)||(rmsv2>=529&&rmsv3>=529)||(rmsv3>=529&&rmsv1>=529)){
if(rmsi1<=512)even1++;
else if(rmsi2<=512)even2++;
else if(rmsi3<=512)even3++;
}
i=0;
/*****************************************************************************************/
/**********Envío de mensaje al celular****************************************************/
if(even1>=864000||even2>=864000||even3>=864000){
led1=1;
do{
while(!TXIF); // Check to empty transmit
TXREG=mens1;
i++;
if(mens1!='\0'){
while(!TXIF); // Check to empty transmit
TXREG=0xD; /*TXREG=13 envia enter*/
while(!RCIF); // Wait while receive
mens4[0]=RCREG; // Read data
while(!RCIF);
mens4[1]=RCREG;
if((mens4[0]!='O')&&(mens4[1]!='K'))i=0;
}
}while(mens1!='\0');
i=0;
do{
while(!TXIF); // Check to empty transmit
TXREG=mens2;
i++;
if(mens2!='\0'){
while(!TXIF); // Check to empty transmit
TXREG=0xD; /*TXREG=13 envia enter*/
while(!RCIF); // Wait while receive
if(RCREG!='>')i=0;
}
}while(mens2!='\0');
i=0;
do{
while(!TXIF); // Check to empty transmit
TXREG=mens3;
i++;
if(mens3!='\0'){
while(!TXIF); // Check to empty transmit
TXREG=0x1A; /*envia el mensaje*/
for(h=0;h<=10;h++)while(!RCIF); // Wait while receive
while(!RCIF); // Wait while receive
mens4[0]=RCREG; // Read data
while(!RCIF);
mens4[1]=RCREG;
if((mens4[0]!='O')&&(mens4[1]!='K'))i=0;
}
}while(mens3!='\0');
even1=0;
even2=0;
even3=0;
}
/****************Fin del mensaje**********************************/
/****************Encendido y apagado de Led's y retardo de tiempo para cumplir 1S****************/
if(led2==0) led2=1;
else led2=0;
for(i=0;i<=4;i++)delayMs(250);
delayMs(150);
}while(1);
}