bagusdj
Member level 3
- Joined
- Nov 25, 2012
- Messages
- 67
- Helped
- 0
- Reputation
- 0
- Reaction score
- 0
- Trophy points
- 1,286
- Activity points
- 1,766
i think this may work...................Code:void adc() //Function to drive ADC { while(1) { ADD_C=0; // Selecting input channel 2 using address lines ADD_B=0; ADD_A=1; delay(2); ale=1; delay(2); sc=1; delay(1); ale=0; delay(1); sc=0; while(eoc==1); while(eoc==0); oe=1; BCD(); lcd_command(0x88); delay(2); oe=0; firing(); } }
try this
i dont understand why i should call void firing (), it is inside interrupt routine. i thin it should check every interrupt.
Code:
// Program to interface TGS2600 using ADC 0809. The output of TGS2600 is displayed on LCD. Controller interrupt is used to generate the clock for driving ADC 0808.
#include<reg52.h>
sbit ale=P1^0; //address latch enable
sbit oe=P1^3; //output enable
sbit sc=P1^1; //start conversion
sbit eoc=P1^2; //end of conversion
sbit clk=P1^7; // clock
sbit ADD_A=P1^4; // Address pins for selecting input channels.
sbit ADD_B=P1^5;
sbit ADD_C=P1^6;
sfr lcd_data_pin=0xA0; //P2 port
sbit rs=P3^7;
sbit rw=P3^1;
sbit en=P3^6;
sbit triac=P3^0;
sfr input_port=0x80; //P0 port
unsigned int bitvalue,decimal_value,key,left_value,value,number,ascii1,ascii2,ascii3,flag,key1,lastReading;
void cct_init(void);
void initint0(void);
void timer0() interrupt 1 // Function to generate clock of frequency 500KHZ using Timer 0 interrupt.
{
clk=~clk;
}
void delay(unsigned int count) //delay function in mS
{
unsigned int i;
while(count) {
i = 115;
while(i>0) i--;
count--;
}}
void cct_init(void)
{
P3=0x05; //triac is on when active low. initialy triac is off.
}
void initINT0(void) //activate int0
{
IT0=1; //interupted when transition from logic 1 to 0 (zero cross detector)
EX0=1;
EA=1;
}
void external0_isr(void) interrupt 0 //interrupt routine
{
lastReading=input_port;
if((lastReading>=52) && (lastReading<=77)) //1st condition
{triac=1;
delay(4);
triac=0;
delay(1);
triac=1;}
else if((lastReading>=77) && (lastReading<=103)) //2nd condition
{triac=1;
delay(3);
triac=0;
delay(1);
triac=1;}
else if((lastReading>=103) && (lastReading<=128)) //3rd condition
{triac=1;
delay(2);
triac=0;
delay(1);
triac=1;}
else if(lastReading>128) //4th condition; full power
{triac=0;
delay(1);
triac=1;}
else //5th condition; triac not firing
{triac=1;}
}
void lcd_command(unsigned char comm) //Function to send command to LCD.
{
lcd_data_pin=comm;
en=1;
rs=0;
rw=0;
delay(10);
en=0;
}
void lcd_data(unsigned char disp) //Function to send data to LCD.
{
lcd_data_pin=disp;
en=1;
rs=1;
rw=0;
delay(10);
en=0;
}
lcd_dataa(unsigned char *disp) //Function to send string data to LCD.
{
int x;
for(x=0;disp[x]!=0;x++)
{
lcd_data(disp[x]);
}
}
void lcd_ini() //Function to inisialize the LCD
{
lcd_command(0x38);
delay(5);
lcd_command(0x0E);
delay(5);
lcd_command(0x80); //Force cursor to blink at line 1 positon 0
delay(5);
}
void BCD() // Binary to decimal conversion to send the data to LCD
{
key1++;
key=0;
flag=0;
number=input_port;
number= number*39;
number= number/100;
value=number%10;
number=number/10;
ascii1=value+48;
if(number!=0)
{
value=number%10;
number=number/10;
ascii2=value+48;
flag=1;
}
else
{
ascii2=48;
flag=1;
}
if(number!=0)
{
value=number%10;
number=number/10;
ascii3=value+48;
key=2;
}
else
{
ascii3=48;
key=2;
}
if(key==2)
lcd_data(ascii3);
if(flag==1)
lcd_data(ascii2);
lcd_data(ascii1);
if(key1==3)
{
key1=0;
ascii3=0;
ascii2=0;
ascii1=0;
delay(10);
}
}
void adc() //Function to drive ADC
{
while(1)
{
ADD_C=0; // Selecting input channel 2 using address lines
ADD_B=0;
ADD_A=1;
delay(2);
ale=1;
delay(2);
sc=1;
delay(1);
ale=0;
delay(1);
sc=0;
while(eoc==1);
while(eoc==0);
oe=1;
BCD();
lcd_command(0x88);
delay(2);
oe=0;
}
}
void main()
{
cct_init();
initINT0();
eoc=1;
ale=0;
oe=0;
sc=0;
key1=0;
TMOD=0x02; //timer0 setting for generating clock of 500KHz using interrupt enable mode.
TH0=0xFD;
IE=0x82;
TR0=1;
lcd_ini();
lcd_dataa("PPM : ");
lcd_command(0x88);
adc();
}
this is my updated code.