Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

problem in displaying ADC value on LCD 16*2 using ATMEGA32 in c code

Status
Not open for further replies.

suraksha s

Newbie level 5
Joined
Jan 18, 2013
Messages
8
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,281
Activity points
1,330
sir this is our program to display adc_ppm value on LCD using ATMEGA32 microcontroller we are facing problem in displaying converted value the result is in symbol form not in any value plz help me out as soon as possible

Code:
#include <avr/io.h> 
#define F_CPU 8000000
#include<util/delay.h>

#define LCD_DATA PORTC 	// LCD data port
#define ctrl PORTA
#define en PA6 			// enable signal
#define rw PA5 			// read/write signal
#define rs PA4 			// register select signal

void LCD_cmd(unsigned char cmd);
void LCD_init(void);							// initialization of LCD
void LCD_write_data(unsigned int data);				//Single Character Display
void LCD_send_string(char *string);				//Character Array Display
void ADC_init(void);							//initialization of ADC
unsigned int ADC_StartConversion(unsigned int channel);//function of ADC
void LCD_read_data(unsigned int data);

int main(void) 
{
   
    unsigned int adc_result,adc_ppm;
	
	DDRC=0xFF;				// Port C as output port
	DDRB=0xFF;				// Port B as output port
	
	DDRA=(1<<PA6)|(1<<PA5)|(1<<PA4); 		// making PORTA pins 4,5,6 as output for LCD

	PORTC=0x00;				// Clearing Port C
    
	
	MCUCSR|=(1<<JTD);		// sending 1 to JTD to disable JTAG interface with Port C
	MCUCSR|=(1<<JTD);		
	
	ADC_init();				//initialization of ADC
	_delay_ms(10);
	LCD_init(); 			// initialization of LCD
	_delay_ms(2); 			// delay of 1 milli seconds


	LCD_cmd(0x80);					//cursor on the 1st line
	_delay_ms(2);
	LCD_send_string("CO Level:"); 	// Display "CO level" on first line
	_delay_ms(2);	

	while (1)
	{
		adc_result=ADC_StartConversion(0);  //Get the adc value of channel zero 
		adc_ppm=(adc_result/20);        	/*since 1ppm=20counts the adc_result is divided by 20 
											inorder to get the CO ppm Value*/
	
		LCD_cmd(0x89); 						//cursor on 1st line 10th position                              
		_delay_ms(10);
		LCD_write_data(adc_ppm);	         	//sending ppm value to LCD
	
		LCD_cmd(0x8C);					 	//cursor on 1st line 13th position
		_delay_ms(2);
		LCD_send_string("PPM");     	 //Displaying PPM "the unit" of gas to LCD
		
				
		if(adc_ppm<=20)
		{
			LCD_cmd(0xC7);				//cursor on the 2nd line 7th position
			_delay_ms(2);
			LCD_send_string("  SAFE ");	//displays SAFE when ppm value is <20
			PORTB=0x00;
   			_delay_ms(500);
   			PORTB=0x01;
   			_delay_ms(500); 
    	}


		else if(adc_ppm>20)
	 	{
			LCD_cmd(0xC6);				//cursor on the 2nd line 6th position
			_delay_ms(2);
	    	LCD_send_string(" DANGER ");	//displays DANGER when ppm value is >20
			PORTB=0x00;
   			_delay_ms(500);
   			PORTB=0x02;
   			_delay_ms(500);
	     }

}

	return 0;

}

void LCD_send_string(char *string)								//Character Array Display
{
 	while(*string)
		{
	 		LCD_DATA= *string;
	 		ctrl = (1<<rs)|(0<<rw)|(1<<en); // RW as LOW and RS, EN as HIGH
		 	_delay_ms(2);
	 		ctrl = (1<<rs)|(0<<rw)|(0<<en); // EN and RW as LOW and RS HIGH
	 		_delay_ms(2); 					// delay to get things executed
			string++;
		}
}


void LCD_init(void)	 							// initialization of 16X2 LCD in 8bit mode
{
	LCD_cmd(0x38);
	_delay_ms(2);
 
	LCD_cmd(0x01); 		// Clear Display, Cursor to Home
	_delay_ms(2);	
 
	LCD_cmd(0x0E); 		// Display, Cursor, and Cursor Blink OFF
	_delay_ms(2);
 
	LCD_cmd(0x80); 		// ---8 go to first line and --0 is for 0th position
	_delay_ms(2);

return;
}
 
void LCD_cmd(unsigned char cmd)
  {
	LCD_DATA=cmd;
	ctrl =(0<<rs)|(0<<rw)|(1<<en); // RS and RW as LOW and EN as HIGH
	_delay_ms(2);
	ctrl =(0<<rs)|(0<<rw)|(0<<en); // RS, RW , LOW and EN as LOW
	_delay_ms(2);
 
return;

}

void LCD_write_data(unsigned int data)							//Single Character Display
{
 	
	LCD_DATA= data;
	ctrl = (1<<rs)|(0<<rw)|(1<<en); // RW as LOW and RS, EN as HIGH
	_delay_ms(2);
	ctrl = (1<<rs)|(0<<rw)|(0<<en); // EN and RW as LOW and RS HIGH
	_delay_ms(2);					// delay to get things execute
	
 return;
}
void LCD_read_data(unsigned int data)							//Single Character Display
{
 	
	LCD_DATA= data;
	ctrl = (1<<rs)|(1<<rw)|(1<<en); // RW as LOW and RS, EN as HIGH
	_delay_ms(2);
	ctrl = (1<<rs)|(1<<rw)|(0<<en); // EN and RW as LOW and RS HIGH
	_delay_ms(2);					// delay to get things execute
	
 return;
}

void ADC_init()												//initialization of ADC
 {
   ADCSRA=0x82; 	//Enable ADC , sampling freq=osc_freq/64
   _delay_ms(10);
   ADMUX=0x40; 		//Result right justified, select channel zero
 }

unsigned int ADC_StartConversion(unsigned int channel)
{
   
   ADMUX=channel; 					//Select a channel
   _delay_ms(10);   					//Wait till the channel is selected
   
   ADCSRA|=(1<<ADSC);   					//Start the ADC conversion by setting bits for ADEN, ADSC, Prescaler to /64 
   
while((ADCSRA & (1<<ADIF))==0);  	//Wait till the conversion is over
  
                               	//ADIF will be set once ADC conversion is complete	
return(ADC);               		 //Return the 10-bit result
}
 
Last edited by a moderator:

Frst you initialize ADC
Code:
void ADC_init()												//initialization of ADC
         {
           ADCSRA=0x82; 	//Enable ADC , sampling freq=osc_freq/64
           _delay_ms(10);
           [B]ADMUX=0x40; 		//Result right justified, select channel zero[/B]
         }

And then you set the channel
Code:
unsigned int ADC_StartConversion(unsigned int channel)
        {
           
           [COLOR="#FF0000"]ADMUX=channel; 					//Select a channel[/COLOR]
           _delay_ms(10);   					//Wait till the channel is selected
           
           ADCSRA|=(1<<ADSC);   					//Start the ADC conversion by setting bits for ADEN, ADSC, Prescaler to /64 
           
        while((ADCSRA & (1<<ADIF))==0);  	//Wait till the conversion is over
          
                                       	//ADIF will be set once ADC conversion is complete	
        return(ADC);               		 //Return the 10-bit result
        }

So what happens to bit6 of the ADMUX that was set to 1 during initialization?

LCD_write_data(adc_ppm);
the function is intended for ASCII characters not integer numbers, you have to convert the number to ASCII first.
One way to do that is using sprintf.
 

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top