LCD 4 bit interface problem.

Status
Not open for further replies.

magvitron

Active Member
hi i have a program for stamping mechanism as a project. the problem is that in simualtion, the code ,ie the LCD interface works fine but not in real world application. tried almost everything. when i changed the ports ie portd to portb, it worked. but now i have to change the whole PCB design for the new port. can any one help?
Code:
/*****************************
		Stamper 
******************************
Program by   : Manu krishnan
version      : 1.0.0.0 (beta)
Assembled in : winavr
core         : mega 8 (8k)
fuse         : 8Mhz internal rc
			   rst disabled
AVR Studio	 :	4.15.623  
GUI Version	 :	4, 15, 0, 623
AVR Simulator:  1, 0, 2, 1
ATMEGA16		247
date 		 : 12 feb 2013 20.44
*******************************/
/*******************************
Preprovcessor Directive
*******************************/
#define F_CPU 8000000UL
#include<avr/io.h>
#include<util/delay.h>
#include<avr/interrupt.h>
#include<avr/eeprom.h>
/******************************/
//MACROS
#define output_low(port,pin) port &= ~(1<<pin)
#define output_high(port,pin) port |= (1<<pin)
#define set_input(portdir,pin) portdir &= ~(1<<pin)
#define set_output(portdir,pin) portdir |= (1<<pin)
/*******************************
LCD definitions
*******************************/
#define ctrl PORTD
#define en PD3		//enable signal
#define rs PD2		//resister select signal

/*******************************
uart definitions
*******************************/
#define USART_BAUDRATE 9600
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1)
#define motor PORTB
#define servo PB6
#define mot1 PB4
#define mot2 PB5

void init();
void backward(int delayx);
void forward(int delayx);
void usart_init();
void usart_putch(unsigned char send);void stamp();
void servo_to(char degree);void calibrate();
unsigned int usart_getch();
 void lcd_write_string(unsigned char *str);
void lcddata(char dataout); 
void lcdcmd(char cmdout);
void dis_data(char data_value);
void to_line(char line,char pos);
void dis_cmd(char cmd_value);
void lcd_init();	// fuction for intialize 
char read_eeprom(unsigned int addr);
void write_eeprom();
void run_the_thing(unsigned char X);
void convert(unsigned int value,unsigned int numb);

unsigned char temp,del,k,serial,pre;
unsigned int max_ser,min_ser,addr,delay,r;


volatile unsigned int i;
volatile unsigned char inp[4];
unsigned char test[4];
void lcd_write_string(unsigned char *str);
unsigned int cal_del();
int main()
{

max_ser=180;
min_ser=0;
temp=100;
init();
lcd_write_string("Automatd Stamper");
to_line(2,0);
lcd_write_string("-------%--------");
	while(1)
	{
	cli();
	 if(usart_getch()=='Q')
	 {
	   to_line(1,0);
	   lcd_write_string("Program mode:        ");
	   to_line(2,0);
	   lcd_write_string("-------%--------");
	   program();
	 }
	 else
	 {
	 if(usart_getch()=='P')
	 {
	 go();
	 }
	 }
	}
}
void go()
{
 to_line(1,0);
lcd_write_string("Running....!!   ");
for(addr=0;addr<=512;addr++)
{
run_the_thing(read_eeprom(addr));
}
}
void program()
{
 unsigned char pre_val,addr,j;
 addr=0;
 j=0;
 while(1)
 {  
    to_line(2,j);
    eeprom_write_byte (addr,usart_getch());
	dis_data(read_eeprom(addr));
	addr=addr+1;
	j=j+1;
    if(j==16)
	j=0;
	if(addr==511)
	addr=0;
  
 }
}
void run_the_thing(unsigned char X)
{
switch (X)
		{
			case 'F':
				forward(cal_del());
				to_line(2,0);
				lcd_write_string(" Stepper Forward");
				pre='F';
				break;
			case 'B':
				backward(cal_del());
				to_line(2,0);
				lcd_write_string("Stepper Backward");
				pre='B';
				break;
			case 'S':
		     	to_line(2,0);
				lcd_write_string(" Stamping...     ");
				stamp();	
				break;
			case 'U':
				to_line(1,0);
				lcd_write_string("Motor UP        ");
				output_high(motor,mot1) ;
				output_low(motor,mot2);
				break;
			case 'D':
				to_line(1,0);
				lcd_write_string("Motor DOWN      ");
				output_high(motor,mot2);
				output_low(motor,mot1);
				break;
            case 'C':
		   	     to_line(1,0);
				lcd_write_string("   Calibration      ");
		        calibrate();
				 to_line(1,0);
				lcd_write_string(" *Automated Stamper*");
				break;
			case 'Z':
			    addr=0;
					lcd_write_string("------DONE------");
					_delay_ms(1000);
				break;
			default:
		    	to_line(2,0);
				lcd_write_string("Delay......     ");
				dis_data(read_eeprom(addr));
				_delay_ms(1000);
				delay=((read_eeprom(addr)-48)*1000);
				addr=addr+1;
				delay=delay+((read_eeprom(addr)-48)*100);
				addr=addr+1;
				delay=delay+((read_eeprom(addr)-48)*10);
				addr=addr+1;
				delay=delay+((read_eeprom(addr)-48)*1);
			    to_line(2,12);convert(delay,4);
				if(pre=='F')
				{
					delay=delay/100;
				}
				else
				{
   				if(	pre=='B')
					{
						delay=delay/100;
					}
                 }

				for(r=0;r<delay;r++)
				{
					switch (pre)
					{
					  case 'F':
	                  forward(100);
					  to_line(1,0);
				    	lcd_write_string(" Stepper Forward");
					  break;
					  case 'B':
					  to_line(1,0);
			       	lcd_write_string(" Stepper Backward");
					  backward(100);
					  break;
					  default:
					  _delay_ms(delay);
					}
					to_line(2,12);
					convert(r,4);
				}
				
				
				}



}
/**********************************************
conversions lcd and the uart
**********************************************/
void convert(unsigned int value,unsigned int numb)
{
unsigned char text[numb];
unsigned char t,temp_char;
 for(t=1;t<=numb;t++)
 {
   temp_char = value%10;
   value=value/10;
   text[t]=temp_char+48;
 }
 
 for(t=numb;t>=1;t--)
 {
  dis_data(text[t]);//=text[t];
 }

}
void calibrate()
{
   to_line(2,0);
   lcd_write_string("Servo- Max:");
	usart_putch('M');
	while(inp[0]!='X');
	{
	    dis_data(inp[1]);
		dis_data(inp[2]);
		dis_data(inp[3]);
		max_ser=((inp[1]-48)*100)+((inp[2]-48)*10)+((inp[3]-48));
		inp[0]=' ';
	}
	_delay_ms(1000);
	usart_putch('L');
	 to_line(2,0);
	  lcd_write_string("Servo- Min:");
	while(inp[0]!='X');
	{
	   dis_data(inp[1]);
		dis_data(inp[2]);
		dis_data(inp[3]);
		min_ser=((inp[1]-48)*100)+((inp[2]-48)*10)+((inp[3]-48));
	}
	_delay_ms(1000);
      to_line(1,0);
     lcd_write_string(" Calib completed ");//leted");
	   to_line(2,0);
     lcd_write_string(" Successfully!! ");
	 _delay_ms(1000);
	 to_line(2,0);
	   lcd_write_string("       :)       ");
	usart_putch('O');usart_putch('K');

}

void stamp()
{

 unsigned int degree_value,time;
 	for(degree_value=min_ser;degree_value<max_ser;degree_value +=20)
		for(time=0;time<50;time++)
		{
			
			servo_to(degree_value);
		}

}

void servo_to(char degree)
{
    k=50+(k*10);
	motor= (1<< servo);
	_delay_us(k);
	motor = (0<<servo);
	_delay_ms(18);

}
unsigned int cal_del()
{
 del=((inp[1]-48)*100)+((inp[2]-48)*10)+((inp[3]-48));
return del;
}
void init()
{
	sei();
 	_delay_ms(100);
	usart_init();
	DDRB=0xff;
	DDRD=0xFC;
	 lcd_init();
}
void forward(int delayx)
{
	PORTB = 0b00001010;//+45
	_delay_ms(delayx);
	PORTB = 0b00000110; //+135
	_delay_ms(delayx);
	PORTB = 0b00000101;//-135
	_delay_ms(delayx);
	PORTB = 0b00001001;//-45
	_delay_ms(delayx);
}
void backward(int delayx)
{

	PORTB = 0b00001001;//-45
	_delay_ms(delayx);
	PORTB = 0b00000101;//-135
	_delay_ms(delayx);
	PORTB = 0b00000110; //+135
	_delay_ms(delayx);
	PORTB = 0b00001010;//+45
	_delay_ms(delayx);
}


/*******************************
uart thingies
*******************************/
void usart_init()
{
	UCSRB |= (1<<RXCIE) | (1 << RXEN) | (1 << TXEN);   	// Turn on the transmission reception ..
								// circuitry and receiver interrupt
	UCSRC |= (1 << URSEL) | (1 << UCSZ0) | (1 << UCSZ1); // Use 8-bit character sizes

	UBRRL = BAUD_PRESCALE; 	// Load lower 8-bits of the baud rate value..
				// into the low byte of the UBRR register
	UBRRH = (BAUD_PRESCALE >> 8); 	// Load upper 8-bits of the baud rate value..
					// into the high byte of the UBRR register
}

ISR (USART_RXC_vect)
{
	///	unsigned char value;
    inp[i] = UDR; 		// Fetch the received byte value into the variable "value"
	i=i+1;
 	if(i>=4)
	{
	usart_putch('E');
	i=0;
	}
}
void usart_putch(unsigned char send)
{
	while ((UCSRA & (1 << UDRE)) == 0); // Do nothing until UDR is ready..
							// for more data to be written to it
	UDR = send; // Send the byte 
}
unsigned int usart_getch()
{
	while ((UCSRA & (1 << RXC)) == 0);
				// Do nothing until data have been received and is ready to be read from UDR
	return(UDR); // return the byte
	serial =UDR;
}

/*******************************
Class LCD 4 bit for 4 bit lcd
interface 
*******************************/

void lcd_init()	// fuction for intialize 
{
	dis_cmd(0x02);		// to initialize LCD in 4-bit mode.
	dis_cmd(0x28);		//to initialize LCD in 2 lines, 5X7 dots and 4bit mode.
	dis_cmd(0x0C);
	dis_cmd(0x06);
	dis_cmd(0x80);
	_delay_ms(100);
}

void dis_cmd(char cmd_value)
{
	char cmd_value1;
	cmd_value1 = cmd_value & 0xF0;		//mask lower nibble because PA4-PA7 pins are used. 
	lcdcmd(cmd_value1);			// send to LCD
 	cmd_value1 = ((cmd_value<<4) & 0xF0);	//shift 4-bit and mask
	lcdcmd(cmd_value1);			// send to LCD
}						
 
void to_line(char line,char pos)
{
if(line ==1)
{
 	dis_cmd(0x80 + pos);
}
else
{
 	dis_cmd(0xC0+pos);
}
}
void clear()
{
    to_line(1,0); 
    lcd_write_string("                ");
}

void dis_data(char data_value)
{

	char data_value1;
	
	data_value1=data_value&0xF0;
	lcddata(data_value1);
 
	data_value1=((data_value<<4)&0xF0);
	lcddata(data_value1);
}
 
void lcdcmd(char cmdout)
{
	ctrl=cmdout;
	ctrl&=~(1<<rs);
	ctrl|=(1<<en);
	_delay_ms(1);
	ctrl&=~(1<<en);
}

void lcddata(char dataout)
{
	ctrl=dataout;
	ctrl|=(1<<rs);
	ctrl|=(1<<en);
	_delay_ms(1);
	ctrl&=~(1<<en);
}
 
void lcd_write_string(unsigned char *str)	//take address vaue of the string in pionter *str
{
	int i=0;
	while(str[i]!='\0')				// loop will go on till the NULL charaters is soon in string 
	{
		dis_data(str[i]);				// sending data on CD byte by byte
		i++;
	}

}

/********************************/
char read_eeprom(unsigned addr)

{
    return(eeprom_read_byte(addr));

}
/********************************/
/********************************/
 
.. its not working sorry if any one read the previous post. is there any problem with the above code? other codes works fine, but not the above.
 
Last edited:
Status
Not open for further replies.
Cookies are required to use this site. You must accept them to continue using the site. Learn more…