Thursday, May 13, 2010

Powerbox:The safe ac meter final code on c++

The following code is applied in PIC and successfully run in 2009.
It was our project and one copy of our project was submitted to Pulchowk Campus.
//#include
#include
#include

#define RS RB0
#define RW RB1
#define EN RB2
#define data PORTD
#define _XTAL_FREQ 20000000

__CONFIG(HS & WDTDIS & BORDIS & PWRTEN & LVPDIS);



void init(void)
{
PIE1 = 0b00000001;
INTCON = 0b01000000;
OPTION = 0b10000000;
TRISB = 0b00000000;
T1CON = 0b00110101;
}
const char cut[] = "current=";
const char volt[] =" volt=";
const char fre[] = "frequency=";
const char real[] = "real pow=";
const char tot[] = "total pow=";
const char pf[] = "pf=";
const char recpow[] = "rectpow=";
int i,j;


void delay_100us(unsigned char n) //100us
{
while(n>0)
{
TMR1L = 0xFE;
TMR1H = 0xFE;
T1CKPS0 = 0;
T1CKPS1 = 0; //1:1 prescaler
TMR1CS = 0;
TMR1IF = 0;
TMR1ON = 1;
while(!TMR1IF){
}
TMR1IF = 0;
n--;
}
}



void init_adc()
{
PCFG3 = 1; PCFG2 = 0; PCFG1 = 0; PCFG0 = 0; //all analog channels selected with

ADCS0 = 0; ADCS1 = 1 ; // Fosc/64 Clock Conversion
ADCS2=1;
ADFM =0; //Left Justified..
ADON = 1;
}

unsigned int adc(int a,int b,int c)
{
int x=0;

CHS0=a;CHS1=b;CHS2=c;
delay_100us(1);
ADGO=1;
init_adc();

while(ADGO);
x=ADRESH;

return x;
}





void delay_TMR1(void)
{
TMR1L = 0x33;
TMR1H = 0xF5;
T1CKPS0 = 0;
T1CKPS1 = 0;
TMR1CS = 0;
TMR1IF = 0;
TMR1ON = 1;
while(!TMR1IF){
}
TMR1IF = 0;
}
void delay_n(unsigned char n)
{
while(n>0)
{
delay_TMR1();
n--;
}
}
void LCD_Write(unsigned char value,int rs)
{
data = value;
RS = rs;
RW = 0;
EN = 1;
delay_n(1);
EN = 0;
}


void LCD_num(int n)
{
if(n<=9)
{
LCD_Write(48+n,1);
}
else if(n<=99)
{
LCD_Write((n/10)+48,1);
LCD_Write((n%10)+48,1);
}
else if(n<=999)
{
LCD_Write((n/100)+48,1);
LCD_Write(((n%100)/10)+48,1);
LCD_Write((n%10)+48,1);
}
else if(n<=9999)
{
LCD_Write((n/1000)+48,1);
LCD_Write(((n%1000)/10)+48,1);
LCD_Write(((n%100)/10)+48,1);
LCD_Write((n%10)+48,1);
}
delay_n(20);
}
void disp_set_decimal_places(int a)
{
LCD_Write(48,1);
LCD_Write(46,1);
for(i=1;i
LCD_Write(48,1);
}
void sc(void)
{
LCD_Write(0x38,0); //set delay,display line, font
delay_n(35);
LCD_Write(0x0E,0);//t moving direction of cursor,cursor,Appoint if move
delay_n(35);
LCD_Write(0x01,0);//Screen Clear, Set AC to 0 cursor RepositionE
delay_n(35);
LCD_Write(0x06,0);
LCD_Write(0x80,0);//Set display on/off,cursor on/off,blink on/off
LCD_Write(0x80,0);
}

void delay_bi(int a)
{
for(i=0;i
delay_n(3000);
}


void main()
{
init();
init_adc();
double rct,rct1;
unsigned long int powfac,tp,n,rel,v3,c3,v1,v,c,c1,c2,a,b,f,k,v2,v4,c4,realpow,vneg,vpos,totalpow,cpos,cneg,vpr,vnxt;
TRISC = 0x00;
TRISD = 0x00;
TRISB = 0x00;
LCD_Write(0x30,0);
delay_n(35);
RS=0;
RW=0;
delay_n(35);
a1:
for(f=0;f<50 div="" f="">
{
v3=0;
c3=0;
rel=0;
delay_n(5);
for(i=0;i<=1001;i++)
{
c1=adc(1,0,0);
v1=adc(0,0,0);
if(c1>128)
c3=c3+c1-128;
else
c3=c3-c1+128;
if(v1<127 div="">
v3=v3-v1+128;
else
v3=v3+v1-128;
}
v=v3/54;
c=c3*5/920;
sc();
for(i=0;cut[i]!=0;i++)
{
LCD_Write(cut[i],1);
__delay_ms(20);
}
if(c<9 div="">
disp_set_decimal_places(2);
LCD_num(c);
}
else if(c<99 div="">
{
disp_set_decimal_places(1);
LCD_num(c);
}
else if(c<999 div="">
{
LCD_Write((c/100)+48,1);
LCD_Write(46,1);
LCD_Write(((c%100)/10)+48,1);
LCD_Write((c%10)+48,1);
}
delay_bi(15);
__delay_ms(20);
LCD_Write(0xC0,0);
__delay_ms(20);
for(j=0;volt[j]!=0;j++)
{
LCD_Write(volt[j],1);

}
LCD_num(v);
delay_bi(5);
__delay_ms(20);
realpow=0;
totalpow=v*c;
for(i=0;i<=1001;i++)
{
vpos=0;
vneg=0;
cpos=0;
cneg=0;
vpr=adc(0,0,0);
c2=adc(1,0,0);
vnxt=adc(0,0,0);
v1=(vpr+vnxt)/2;
if(c2>128)
cpos=(c2-128);
else
cneg=128-c2;
if(v1>128)
vpos=(v1-128);
else
vneg=(128-v1);
realpow=realpow+(cpos*vpos)+(vneg*cneg)-(cpos*vneg)-(cneg*vpos);
}

rel=realpow*5/6400;

sc();

for(i=0;real[i]!=0;i++)
{
LCD_Write(real[i],1);
}
LCD_num(rel);
delay_bi(15);
LCD_Write(0xC0,0);
delay_n(305);
LCD_Write(0xC0,0);
for(j=0;tot[j]!=0;j++)
{
LCD_Write(tot[j],1);
delay_100us(10000);
}
LCD_num(totalpow/100);
tp=totalpow/100;
if(tp
goto a1;
delay_bi(20);
k=0;
a=0;
c=0;
do
{
n=1;
v=adc(0,0,0);
if (v>125 && v<130 div="">
{c++;
delay_100us(10);
}
a++;
}
while (a<=5600);

b=c/2;
sc();
for(j=0;fre[j]!=0;j++)
{
LCD_Write(fre[j],1);
//delay_n(350);
}
delay_n(300);
LCD_num(b);
delay_bi(5);
powfac=(rel*1000/tp);
LCD_Write(0xC0,0);
delay_n(305);
LCD_Write(0xC0,0);
for(j=0;pf[j]!=0;j++)
{
LCD_Write(pf[j],1);

//delay_n(350);
}
if(powfac<9 div="">
disp_set_decimal_places(2);
else if(powfac<99 div="">
disp_set_decimal_places(1);
else if(powfac<999 div="">
disp_set_decimal_places(0);
else
powfac=1;
LCD_num(powfac);
delay_bi(20);
sc();
rct=sqrt(tp*tp-rel*rel);
v1=(int)rct;
for(j=0;recpow[j]!=0;j++)
{
LCD_Write(recpow[j],1);

//delay_n(350);
}

LCD_num(v1);
delay_bi(20);
}
}//

///all the code is tested on pic16f877a at 20mz
//for more info and complete proteus diagram contact on my mail...bikesh_shr7@hotmail.com