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));
}
/********************************/
/********************************/