Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
04/12/10 06:37
Read: times


 
#174987 - Managed to fix lockups, but it doesnt read/write
Responding to: ???'s previous message
ok, I think I fixed the lockups I was having. I completely re-written the read and write subroutines.

void EEPROM_Write(unsigned int *address, unsigned char eeprom_data) // call function, with two input values, the address in which to write and the data to write to it
{
EECON=0x02;	//Enable EEPROM
*address=eeprom_data;	//Latch the data
EECON=0x52;	//Programming  -- I tried both
EECON=0xA2;	//Sequence     -- x4 and x2
Delay(5);		//Delay to give the EEBUSY time to rise
while(((EECON&0x01)==0x01));		//Wait till EEBUSY is off
EECON=0x00;				 //Disable EEPROM
}

char EEPROM_Read(unsigned int *address) // //call the function and specify the needed address 
{
unsigned char eeprom_data='5';  //I set the EEPROM_Data to the char 5 to test if it even gets changed
EECON=0x02;	//Access EPROM
AUXR=0x2C;	//Extend the Read cycles to accomidate for slow memory
eeprom_data=*address;  //write to eeprom_data the value stored at the needed memory
EECON=0x00;	//Allow usage of EPROM
AUXR=0x0C;	//Restore normal R/W Cycles
return(eeprom_data);						  
}

 


however... those subroutines still dont write data into the EEPROM, and when reading it always returns a black block char on the LCD (I think its value is FF). heres how I call the two functions:

b=EEPROM_Read(&user_name[a]);
 


EEPROM_Write(&user_name[a],namestring[a]);
 


and heres the full code for reference

#include <at89c5131.h>	//user the 895131 library
#define userlimit 45	//define userlimit - 45 MAX under onboard 1K EPROM
void new();
void lcd_clear();
void lcd_config();
void encrypt();
void Delay(int wait);
void lcd_display(char strng[],bit line,char slot);
void lcd_line(bit row , char slot);
char scan_keypad();
char EEPROM_Read(unsigned int *address);
void EEPROM_Write(unsigned int *address, unsigned char eeprom_data);
void lcd_blink(bit status);


unsigned char xdata lcd_command _at_ 0x4000;				//define a data port at 4000 and call it lcd_command - for programming the LCD
unsigned char xdata lcd_data _at_ 0x4001;					//define a data port at 4001 and call it lcd_data - for writing on the LCD
unsigned char xdata keypad _at_ 0x6000;						//define a data port at 6000 and call it keypad - for reading the keypad
 
unsigned char xdata encrypted_password[5*userlimit] _at_ 0x0000;	//encrypted password.5*userlimit.
unsigned char xdata user_name[16*userlimit] _at_ 0x00E1;				//stores user name.16*userlimit.
unsigned char xdata user_level[userlimit] _at_ 0x03C0;				//store user level.1*userlimit.
											
unsigned char a,b='5',encrypted[5],key[5],password[5],namestring[]={'Y','a','n','i','v',' ','K','f','i','r',' ',' ',' ',' ',' ',' '};			//global

void main()    				//main program
{
	lcd_clear();
	lcd_display("Starting",0,0);
	for(a=0;a<16;a++)
		EEPROM_Write(&user_name[a],namestring[a]);
	EEPROM_Write(&user_level[0],1);
	Delay(2000);
	lcd_config();					//configure the LCD
	lcd_clear();
	while(1)
	{
	new();
	}
}

void new()
{
	for(a=0;a<5;a++)
		key[a]=0;
	lcd_clear();
	lcd_display("Enter a password",0,0);
	lcd_blink(1);
	for(a=0;a<5;a++)
	{
		password[a]=scan_keypad();
		lcd_line(1,a);
		Delay(400);
		lcd_data='*';
	}
	lcd_clear();
	lcd_display("Swipe Your card  ",0,0);
	while(P1_3==1);
		for(a=0;a<5;a++)
		{
			for(b=0;b<8;b++)
			{
				while(P3_1==1);
				while(P3_1==0);
				if(P3_0==0)
					{
						key[a]=key[a]|0x80;
						key[a]=key[a]>>1;
					}
			}
		}
	while(P1_3==0);
	encrypt();
	lcd_clear();
	lcd_display("Saving...",0,0);
	for(a=0;a<5;a++)
		EEPROM_Write(&encrypted_password[a],encrypted[a]);
	lcd_display("User made:",0,0);
	lcd_blink(0);
	for(a=0;a<16;a++)
	{
		b=EEPROM_Read(&user_name[a]);
		lcd_command=0xc0+a;
		Delay(200);
		lcd_data=b;
	}
}
void encrypt()
{
	char temp;
	lcd_clear();
	lcd_display("Encrypting",0,0);
	for(a=0;a<5;a++)
		password[a]=(password[a]*(a+3))+(90+a); // multiply by 3+slot and add 90+slot
	for(a=0;a<4;a++)
	{
		if(a<2)
		{
			temp=password[4-a];				//Mirror
			password[4-a]=password[0+a];	//Image
			password[0+a]=temp;				//Array
		}
		encrypted[a]=(password[a]^(!key[a]));				// Xor operation between password and keycard data
		password[a]=0;								 		//purge former password from memory by nullfying it.
		key[a]=0;											//purge former keycard from memory by nullfying it.
	}
}

void lcd_clear()
{
	lcd_command=0x01; // clear screen
	lcd_command=0x02; // reset position
	Delay(10);
}

void lcd_config()
{
	Delay(10);
	lcd_command=0x38;// 8 Bit Dual line 5*7 dots shape.
	Delay(10);
	lcd_command=0x0e;//Display on, Cursor on without blinking
	Delay(10);
	lcd_command=0x01;//Clear screen
	Delay(10);
	lcd_command=0x02;//Cursor to the beginning of the line
	Delay(10);
	lcd_command=0x06;// Increment cursor, no display shift.
}

void Delay(int wait)
{
	long i; 
	for(i=0;i<wait;i++)
	{
		TMOD=0x01;
		TL0=0x5F;
		TH0=0xF9;
		TR0=1;
		while(!TF0);
		TF0=0;
	}
}

void lcd_display(char strng[],bit line,char slot)
{
	char i=0;// define i as a char for aing the array
	Delay(1);
	while(strng[i])			// while the string containts data, do the loop
	{
		if(line==1)
			lcd_command=0xc0+slot+i;
		else
			lcd_command=0x80+slot+i;
		Delay(1);
		lcd_data=strng[i];	// display character from array on the lcd
		i=i+1;				// increment the i variable by one to a the next array slot
	}
}

void lcd_line(bit row , char slot) //define default value of row to 1 and of slot to 0
{
	if (row==0)// if the required line is 1
		lcd_command=0x80+slot;// display on the first line
	else// else, display on the
		lcd_command=0xc0+slot;// second line
	Delay(10);
}

char scan_keypad()
{
	unsigned char ascii;
	while(P1_0==0);
	ascii=keypad;
	if((ascii>=0x00)&(ascii<0x04))
		ascii++;
	if((ascii>0x06)&(ascii<0x0C))
		ascii--;
	if(ascii==0x0C)
		ascii='*'-'0';
	if(ascii==0x0D)
		ascii=0;
	if(ascii==0x0E)
		ascii='#'-'0';
	Delay(10);
		return(ascii);
}

void EEPROM_Write(unsigned int *address, unsigned char eeprom_data)
{
EECON=0x02;	//Enable EEPROM
*address=eeprom_data;	//Latch the data
EECON=0x52;	//Programming
EECON=0xA2;	//Sequence
Delay(5);		//Delay to give the EEBUSY time to rise
while(((EECON&0x01)==0x01));		//Wait till EEBUSY is off
EECON=0x00;				 
}

char EEPROM_Read(unsigned int *address)
{
unsigned char eeprom_data='5';
EECON=0x02;	//Access EPROM
AUXR=0x2C;	//Extend the Read cycles to accomidate for slow memory
eeprom_data=*address;
EECON=0x00;	//Allow usage of EPROM
AUXR=0x0C;	//Restore normal R/W Cycles
return(eeprom_data);						  
}

void lcd_blink(bit status)
{
	if(status==0)
		lcd_command=0x0c; // turn blinking off
	else
		lcd_command=0x0f; // turn blinking on
	Delay(10);
}
 


List of 23 messages in thread
TopicAuthorDate
EEPROM Read/Write Issues            01/01/70 00:00      
   if it was an external EEPROM            01/01/70 00:00      
   if it was an external EEPROM            01/01/70 00:00      
   Special sequence.            01/01/70 00:00      
      Thanks, but can you please simplyfy it?            01/01/70 00:00      
         Hope this explains            01/01/70 00:00      
   Managed to fix lockups, but it doesnt read/write            01/01/70 00:00      
      You have to choose your API            01/01/70 00:00      
         Already did all that            01/01/70 00:00      
            char vs int            01/01/70 00:00      
            I gave you a function            01/01/70 00:00      
               Still no luck            01/01/70 00:00      
                  unsigned int is not the size of the unsigned int* pointer            01/01/70 00:00      
                  Why not use the function I gave you.            01/01/70 00:00      
                     I did use you function            01/01/70 00:00      
                        My apologies.            01/01/70 00:00      
                           Sorry to keep dragging you back here...            01/01/70 00:00      
                              FLIP is a pain            01/01/70 00:00      
                                 We have progress!            01/01/70 00:00      
                                    Terribly sorry to bump but I really need help            01/01/70 00:00      
                                       Found the solution!            01/01/70 00:00      
                                          Study your C textbooks            01/01/70 00:00      
                                          it cant distinguise the sign bit            01/01/70 00:00      

Back to Subject List