Continue to Site

Welcome to our site!

Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

  • Welcome to our site! Electro Tech is an online community (with over 170,000 members) who enjoy talking about and building electronic circuits, projects and gadgets. To participate you need to register. Registration is free. Click here to register now.

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.

Latest threads

Back
Top