Sei sulla pagina 1di 7

include <18F2553.

h>
#device adc=12

#FUSES NOWDT //No Watch Dog Timer


//#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PROTECT //Code protected from reads
#FUSES noBROWNOUT //precisa p evitar reset indesejado ao entrar na bateria //Reset
when brownout detected
//#FUSES BORV20 //Brownout reset at 2.0V
//#FUSES PUT //Power Up Timer
//#FUSES NOCPD //No EE protection
//#FUSES STVREN //Stack full/underflow will cause reset
//#FUSES NODEBUG //No Debug mode for ICD
//#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
//#FUSES NOWRT //Program memory not write protected
//#FUSES NOWRTD //Data EEPROM not write protected
//#FUSES IESO //Internal External Switch Over mode enabled
//#FUSES FCMEN //Fail-safe clock monitor enabled
//#FUSES PBADEN //PORTB pins are configured as analog input channels on RESET
//#FUSES NOWRTC //configuration not registers write protected
//#FUSES NOWRTB //Boot block not write protected
//#FUSES NOEBTR //Memory not protected from table reads
//#FUSES NOEBTRB //Boot block not protected from table reads
//#FUSES NOCPB //No Boot Block code protection
#FUSES NOMCLR //Master Clear pin disabled
//#FUSES LPT1OSC //Timer1 configured for low-power operation
//#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled
(Legacy mode)
//#FUSES PLL1 //No PLL PreScaler
#FUSES CPUDIV1 //System Clock by 1
//#FUSES USBDIV //USB clock source comes from PLL divide by 2
//#FUSES VREGEN //USB voltage regulator enabled

#use delay(clock=20000000,RESTART_WDT)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,restart_wdt)

//Esta��o Transmissora

#include <string.h>
#INCLUDE <stdlib.h>

#define dig1 input(pin_b4)


#define dig2 input(pin_b5)
#define dig3 input(pin_b6)
#define dig4 input(pin_b7)
#define LED_TX pin_c1
#define LED_PULSO pin_c0
#define Tempo_Delay 50

#include "..\Biblioteca (Protocolo)\protocolo.h"


#include "..\Biblioteca (Manchester)\manchesterEncoder.h"

static protocolo pacote;


float32 Leitura;
int cont;
int16 X; // Vari�vel de Incremento do For para o Tempo_Delay
float32 ADC_01_Aux;
float32 ADC_02_Aux;
float32 ADC_03_Aux;
float32 ADC_04_Aux;
int32 Quantidade_de_Capturas=0;

int1 Flag_Incrementa_Hidro1=0;
int1 Flag_Incrementa_Hidro2=0;

//*****************************************************

unsigned int16 Numero_Estacao = 80;

unsigned int16 Intervalo_A = 14600;

unsigned int16 Intervalo_B = 10010;

//*****************************************************

unsigned int16 Tempo_mS=0; //Conta a cada vez que entra na interrup��o


unsigned int8 Flag_Envios; //Flag dos Intervalos de Envio
unsigned int16 Intervalo; //Intervalos Espec�ficos

//------------------------------
// Interrup��es do Timer 2
//------------------------------

#int_TIMER2
void TIMER2_isr(void){
Tempo_mS++;
} // void TIMER2_isr(void)

//------------------------------
// Interrup��es do Hidr�metro
//------------------------------

#int_EXT
void EXT1_isr(void)
{
Flag_Incrementa_Hidro1=1;
}//EXT_isr(void)

#int_EXT1
void EXT_isr(void)
{
Flag_Incrementa_Hidro2=1;
}//EXT1_isr(void)

//------------------------------
// Captura de [spam]�gicas
//------------------------------
void Captura_ADC(){

Leitura=0;

pacote.adc0=0;
pacote.adc1=0;
pacote.adc2=0;
pacote.adc3=0;

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// [spam]�gica 00
Leitura=0;
pacote.adc0=0;
set_adc_channel(0);//seta adc A0
delay_us(100);
//for(X=0;X<Tempo_Delay;X++){}
for(cont=1;cont<=200;cont++){//faz a media das 200 Leituras descartando as 40
primeiras

pacote.adc0 = read_adc();//ler adc A0


//for(X=0;X<Tempo_Delay;X++){}
delay_us(100);
if(cont>40){
Leitura+=pacote.adc0;
} //if

}//for
Leitura=(Leitura/160);
//pacote.adc0 = Leitura*12.21;// coloca em mV*10
pacote.adc0 = Leitura;
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// [spam]�gica 01
Leitura=0;
pacote.adc1=0;
set_adc_channel(1);//seta adc A1
delay_us(100);
//for(X=0;X<Tempo_Delay;X++){}
for(cont=1;cont<=200;cont++){//faz a media das 200 Leituras descartando as 40
primeiras
pacote.adc1 = read_adc();//ler adc A1
delay_us(100);
//for(X=0;X<Tempo_Delay;X++){}
if(cont>40){
Leitura=Leitura+pacote.adc1;
}//if
}//for
Leitura=(Leitura/160);
//pacote.adc1 = Leitura*12.21;// coloca em mV*10
pacote.adc1 = Leitura;

//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// [spam]�gica 05
Leitura=0;
pacote.adc2=0;
set_adc_channel(4);//seta adc A5
delay_us(100);
//for(X=0;X<Tempo_Delay;X++){}
for(cont=1;cont<=200;cont++){//faz a media das 200 Leituras descartando as 40
primeiras
pacote.adc2 = read_adc();//ler adc A0
delay_us(100);
//for(X=0;X<Tempo_Delay;X++){}
if(cont>40){
Leitura=Leitura+pacote.adc2;
}//if
}//for
Leitura=(Leitura/160);
//pacote.adc2 = Leitura*12.21;// coloca em mV*10
pacote.adc2 = Leitura;
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// [spam]�gica 09
Leitura=0;
pacote.adc3=0;
set_adc_channel(9);//seta adc A1
delay_us(100);
//for(X=0;X<Tempo_Delay;X++){}
for(cont=1;cont<=200;cont++){//faz a media das 200 Leituras descartando as 40
primeiras
pacote.adc3 = read_adc();//ler adc A1
delay_us(100);
//for(X=0;X<Tempo_Delay;X++){}
if(cont>40){
Leitura=Leitura+pacote.adc3;
}//if
}//for
Leitura=(Leitura/160);
//pacote.adc3 = Leitura*12.21;// coloca em mV*10
pacote.adc3 = Leitura;
//XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

//Mecanismo de integra��o da vari�vel ADC_0X_Aux para posteriormente calcular a


m�dia,
//a depender do valor de quantidade de capturas realizadas.
ADC_01_Aux = ADC_01_Aux + pacote.adc0;
ADC_02_Aux = ADC_02_Aux + pacote.adc1;
ADC_03_Aux = ADC_03_Aux + pacote.adc2;
ADC_04_Aux = ADC_04_Aux + pacote.adc3;

} // void Captura_ADC()

//------------------------------
// C�lculo da m�dia das [spam]�gicas
//------------------------------
void Media_ADC(){

//Atribui a cada elemento pacote.adcX o valor da vari�vel ADC_0X_Aux divido


//pela quantidade de capturas realizadas at� o momento do envio.
pacote.adc0 = ADC_01_Aux/Quantidade_de_Capturas;
pacote.adc0 = pacote.adc0*12.21; // coloca em mV*10

pacote.adc1 = ADC_02_Aux/Quantidade_de_Capturas;
pacote.adc1 = pacote.adc1*12.21; // coloca em mV*10

pacote.adc2 = ADC_03_Aux/Quantidade_de_Capturas;
pacote.adc2 = pacote.adc2*12.21; // coloca em mV*10

pacote.adc3 = ADC_04_Aux/Quantidade_de_Capturas;
pacote.adc3 = pacote.adc3*12.21; // coloca em mV*10
//Zerando as vari�veis ADC_0X_Aux e Quantidade_de_Captura.
Quantidade_de_Capturas=0;
ADC_01_Aux=0;
ADC_02_Aux=0;
ADC_03_Aux=0;
ADC_04_Aux=0;
}

//------------------------------
// Captura de Digitais
//------------------------------

void Captura_Digitais(){

pacote.d1=dig1;
pacote.d2=dig2;
pacote.d3=dig3;
pacote.d4=dig4;

} // void Captura_Digitais()

//------------------------------
// Captura de Hidr�metros
//------------------------------
void Captura_Hidrometros(){
if(Flag_Incrementa_Hidro1==1){
output_high(LED_PULSO); // Acende LED para demonstrar
delay_ms(100); // que houve interrup��o
output_low(LED_PULSO); // ap�s 250 ms apaga LED
pacote.hidro1++;
if(pacote.hidro1>=9999999)pacote.hidro1=0;
Flag_Incrementa_Hidro1=0;
}
if(Flag_Incrementa_Hidro2==1){
output_high(LED_PULSO); // Acende LED para demonstrar
delay_ms(100); // que houve interrup��o
output_low(LED_PULSO); // ap�s 250 ms apaga LED
pacote.hidro2++;
if(pacote.hidro2>=9999999)pacote.hidro2=0;
Flag_Incrementa_Hidro2=0;
}
}

void main(){

setup_adc_ports(AN0_TO_AN9|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL);
//setup_adc(ADC_CLOCK_DIV_2);

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_4);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8); //Incremento em 1.6uS
setup_timer_2(T2_DIV_BY_4,249,5); //Incremento em 1.0mS
enable_interrupts(INT_EXT);
enable_interrupts(INT_EXT1);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
ext_int_edge(0,H_TO_L); // Int_Ext sens�vel a borda de descida
ext_int_edge(1,H_TO_L); // Int_Ext sens�vel a borda de descida

//Identifica��o da Esta��o (M�ximo de Quatro D�gitos)


pacote.id=Numero_Estacao;
pacote.hidro1=0;
pacote.hidro2=0;
//Flag dos Intervalos de Envio
Flag_Envios=1;

//pisca o led 4 vezes //vers�o 130417


output_high(LED_TX);
output_high(LED_PULSO);
delay_ms(250);
output_low(LED_TX);
output_low(LED_PULSO);
delay_ms(250);
output_high(LED_TX);
output_high(LED_PULSO);
delay_ms(250);
output_low(LED_TX);
output_low(LED_PULSO);
delay_ms(250);
output_high(LED_TX);
output_high(LED_PULSO);
delay_ms(250);
output_low(LED_TX);
output_low(LED_PULSO);
delay_ms(250);
output_high(LED_TX);
output_high(LED_PULSO);
delay_ms(250);
output_low(LED_TX);
output_low(LED_PULSO);
delay_ms(250);

while(true){

//---------------------------------------------------------
//Realiza as Capturas

Captura_ADC();
Captura_Digitais();
Captura_Hidrometros();
Quantidade_de_Capturas++;

//---------------------------------------------------------
//Defini��o do Intervalo

if(Flag_Envios==1 || Flag_Envios==2 || Flag_Envios==3){


Intervalo=Intervalo_A;
}
else if(Flag_Envios==4 || Flag_Envios==5){
Intervalo=Intervalo_B;
}
else if(Flag_Envios==6){
Intervalo=( (5000) + (pacote.id*100) );
Flag_Envios=0;
}
//---------------------------------------------------------
//Condi��o para o envio

if(Tempo_mS>=Intervalo){
Tempo_mS=0;
Flag_Envios++;
Media_ADC();
output_high(LED_TX);
montaPacote(&pacote);
enviaPacote(mensagem,(sizeof(protocolo)+2));
output_low(LED_TX);
} // if(Tempo_mS>=Intervalo)

//---------------------------------------------------------

} // while(true)
} // void main()