#include <pic.h>
__CONFIG(HS & WDTDIS & PWRTEN & BORDIS & LVPDIS & DUNPROT & WRTEN & DEBUGEN & UNPROTECT);
#include "delay.h"
#include "stdlib.h"
#include "delay.c"
void initializari(void)
{
GIE=1; // initializeaza intreruperi globale
INTE = 1;
ADCS1 = 0; //select Fosc/8
ADCS0 = 1;
ADCON1=0; // A/D port configuration 0
ADFM = 1; //right justified result
ADON=1; // porneste conversia A/D
T0IE=1;
TMR0=0; //initiere TMR0
T0CS=0; //clock intern
T0SE=0; //numarare pe front crescator
PSA=0; //utilizare prescaler
PS0=1;
PS1=1; //prescaler de 256
PS2=1;
}
unsigned int read_adc(unsigned char channel)
{
channel&=0x07; // trunchiem canalul la 3 biti
ADCON0&=0xC5; //eliberam canalul curent
ADCON0|=(channel<<3); // aplicam noul canal selectat
DelayMs(10);
ADGO=1; //initiem conversia pe canalul selectat
while(ADGO)continue;
return(((ADRESH&0x03)<<8)+ADRESL); // returneaza rezultat pe 10 biti
}
float temp_usf(void)
{
int i;
float temp_an, temp, temp1;
temp_an=0;
for(i=0; i<4; i++)
{
temp_an =temp_an+read_adc(0);
DelayMs(5);
}
temp_an=temp_an/4;
temp =temp_an*((5.0*100.0)/1023.0);
temp1=temp*100;
return(temp1);
}
float temp_umf(void)
{
int i;
float temp_an, temp, temp2;
temp_an=0;
for(i=0; i<4; i++)
{
temp_an =temp_an+read_adc(1);
DelayMs(5);
}
temp_an=temp_an/4;
temp =temp_an*((5.0*100.0)/1023.0);
temp2=temp*100;
return(temp2);
}
void InitUSART() //rutina de setare si initializare a modulului USART
{
// SPBRG=64; //19200 baud la 20 MHz
SPBRG=25; //9600 baud la 4 MHz
BRGH=1; //high speed
SYNC=0; //modul asincron
SPEN=1; //activare port serial
TXIE=0; //dezactivare intrerupere USART la transmisie
TX9=0; //transmisie pe 8 biti
TXEN=1; //activare transmisie
RCIE=0; //dezactivare intrerupere USART la receptie
RX9=0; //receptie pe 8 biti
CREN=1; //activare receptie
}
void TransmitUSART(unsigned char c) //Rutina de transmitere a unui octet la portul serial
{
while(!TXIF); //asteapta sa se termine transmisia precedenta
TXREG=c; //incarca si transmite noua valoare
}
void TransmitUSARTC(const char* c)
{
int i =0;
while(c[i]!=0x0 && c[i]!=0xd)
{
TransmitUSART(c[i]);
i++;
}
// TransmitUSART(0xd);
}
unsigned char ReceiveUSART() //Rutina pt receptia unui octet de la portul serial
{
unsigned char c;
while(!RCIF); //asteapta pana se incheie receptia
c=RCREG; //octetul receptionat este preluat din RCREG
return c;
}
void afisare_usart(unsigned int i)
{
int zeci,unitati;
zeci = i/10 + 48;
unitati = i%10 + 48;
while(!TXIF);
TXREG = zeci;
DelayMs(5);
while(!TXIF);
TXREG = unitati;
}
void afisfloat(long i)
{
int nr1, nr2;
nr1=i/100;
nr2=i%100;
if (nr2>0)
{
afisare_usart(nr1);
TransmitUSARTC(",");
afisare_usart(nr2);
TransmitUSART(0xd);
DelayUs(250);
}
else
{
afisare_usart(nr1);
TransmitUSART(0xd);
DelayUs(250);
}
}
volatile int intoarce,count;
void interrupt isr(void) //este apelata cand este generata o intrerupere
{
if(T0IF)//intreruperea este generata de timer0 ?
{
count++;
if(count==152){ //de test , ar trebui sa seteze "intoarce" la 10 sec
intoarce=1;
count=0;
}
T0IF=0;//am procesat intreruperea, resetam flag-ul pentru a se putea apela din nou
}
}
void main(void)
{
float temp_uscat,temp_umed,umid,dif,dif1;
int temp,sw,um;
long count;
initializari();
DelayUs(20);
InitUSART();
TRISB = 0x01;
TRISC = 0x80;
TRISD = 0;
while(1)
{
temp_umed=temp_umf();
DelayUs(250);
temp_uscat=temp_usf();
DelayUs(250);
dif=temp_uscat-temp_umed;
dif1=dif/100;
DelayUs(250);
temp=temp_uscat/100;
if (temp < 38) //daca temperatura scade sub 38 grade
RD6=1; // pornesc rezistenta de nichelina
else
RD6=0;
TransmitUSARTC(" 1.Temperatura uscata este : ");
afisfloat(temp_uscat);
DelayUs(250);
TransmitUSARTC(" 2.Temperatura umeda este : ");
afisfloat(temp_umed);
DelayUs(250);
TransmitUSARTC(" 3.Diferenta este : ");
afisfloat(dif);
DelayUs(250);
if ((dif1 < 5) || (dif1 > 7)) umid=0; // umiditatea se alege in functie
else if ((dif1 >= 5) && (dif1 < 5.5 )) umid=70; // de diferenta dintre
else if((dif1 >= 5.5 ) && (dif1 < 6)) umid=65; // cele doua temperaturi
else if((dif1 >= 6) && (dif1 < 6.5)) umid=62;
else umid=60;
TransmitUSARTC(" 4.Umiditatea este : ");
afisare_usart(umid);
TransmitUSARTC(" %");TransmitUSART(0xd);
DelayUs(250);
RD5=0;
if(intoarce)
{
intoarce=0;
RD5=1;
// DelayMs(1000);
}
DelayMs(1000); DelayMs(1000); DelayMs(1000); //delay ca sa mearga mai lent pe terminal afisarea
}
}