سلام دوستان خسته نباشین
من به یه مشکلی برخوردم که کلی درگیرم کرده،3 روز تمام درگیر رفعشم ولی نمیدونم چرا نمیشه
این پروژه ایه که قرار به عنوان کنترل ورود و خروج اماکنی مثل پارکینگها استفاده بشه،داخلش از ماژولهای معمول RFID استفاده شده
برای همین برای هر کاربر اطلاعاتی درنظر گرفته شده که در حافظه EEPROM خارجی ذخیره میشه،اطلاعاتی مثل سریال تگ RFID کاربر،نام و نام خانوادگی و ....
مشکل اینجاست که وقتی اطلاعات ذخیره شده در حافظه رو شروع میکنیم به خوندن و میریزمشون تو متغیرهای خودشون،ینی مثلن نامی که در EEPROM ذخیره شده بیاد در متغیری به نام name ذخیره بشه،به همین ترتیب تا آخر تا همه اطلاعات خونده و به داخل میکرو بیاد تا رورشون پردازش بشه.
من وقتی میام چک کنم ک ببینم این اطلاعات به طور صحیح خونده شده یا نه،ینی اینکه متغیر name مقدار درست نام کاربرو گرفته یا نه،میبینم که اینطور نیست
روش چک کردنم اینه که بعد ازهر بار که کامل اطلاعات از EEPROM خونده شد،تمام متغیر هایی که مقدار گرفتن رو با دستور
میفرستم رو سریال میکرو که ببینم چی تو هر متغیر ذخیره شده و با مقداری که باید باشه برابره یا نه،ولی علاوه بر چیزی که باید باشه کاراکترهای اضافیم همراش میاد. ینی بخام مثال بزنم فرض کنید داخل اون آدرسهایی از EEPROM که قراره نام کاربر ذخیره بشه، مقدار رشته "ardeshir" ریخته شده،بعد از خوندن این آدرسها و ریختنشون تو متغیر name ، وقتی که با این دستور
محتویات name رو پرینت میگیریم خروجی اینه :
ینی متغیر چیزای اضافیم داخلش ذخیره شده!
چیزی که من حدس میزنم اینه که شاید چون در طول برنامه از توابع سریال زیاد استفاده میشه،باعث میشه اطلاعات توی بافر سریال با چیزی که قراره بیاد تو خروجی ترکیب بشه و خروجی رو خراب کنه...
یه چیز دگ هم اینه که شاید همین مشکل برای بافر ارتباط دوسیمه I2C که برای ارتباط با EEPROM استفاده شده وجود داشته باشه.
خیلی اطلاعات هس که بخام براتون از از این پروژه بزارم که باعث میشه پست خیلی طولانی بشه،برای همین ازتون خواهش میکنم که هرجایی از کد رو که خواستین بگین تا بزارم،تمومش هست مثله نحوه خوندن نوشتن از EEPROM، نحوه آدرس دهی ، جداسازی اطلاعات مفید از غیر مفید یا هرچیزی که میخواین....
علی الحساب اون مهمارو میزارم
توابع خواندن و نوشتن از EEPROM از طریق رابط I2C :
روش ریختن اطلاعات در متغیر مربوط به خودش :
اینم توضیحاتی برای متغیرها و توابع: (بعضیاشون تو این کدا نیس)
دلیل اینکه حلقه 64 بار تکرار میشه اینه که کل اطلاعات برای هر کاربر 64 کاراکتره که پشت سر هم ذخیره شده،برای همینم پشت سرهم خونده میشه و در آرایه 64 کاراکتریه data ذخیره و بعد از اون داخل متغیرهای دگ خرد میشه.
خب دوستان پیشتر از راهنماییهاتون تشکر میکنم و امیدوارم که بتونیم مشکل و متوجه و رفعش کنیم...واقن دگ اشکمو داره در میاره
من به یه مشکلی برخوردم که کلی درگیرم کرده،3 روز تمام درگیر رفعشم ولی نمیدونم چرا نمیشه
این پروژه ایه که قرار به عنوان کنترل ورود و خروج اماکنی مثل پارکینگها استفاده بشه،داخلش از ماژولهای معمول RFID استفاده شده
برای همین برای هر کاربر اطلاعاتی درنظر گرفته شده که در حافظه EEPROM خارجی ذخیره میشه،اطلاعاتی مثل سریال تگ RFID کاربر،نام و نام خانوادگی و ....
مشکل اینجاست که وقتی اطلاعات ذخیره شده در حافظه رو شروع میکنیم به خوندن و میریزمشون تو متغیرهای خودشون،ینی مثلن نامی که در EEPROM ذخیره شده بیاد در متغیری به نام name ذخیره بشه،به همین ترتیب تا آخر تا همه اطلاعات خونده و به داخل میکرو بیاد تا رورشون پردازش بشه.
من وقتی میام چک کنم ک ببینم این اطلاعات به طور صحیح خونده شده یا نه،ینی اینکه متغیر name مقدار درست نام کاربرو گرفته یا نه،میبینم که اینطور نیست
روش چک کردنم اینه که بعد ازهر بار که کامل اطلاعات از EEPROM خونده شد،تمام متغیر هایی که مقدار گرفتن رو با دستور
printf("%s",variable);
printf("name : %s",name);
کد HTML:
name : ardeshirhjshf
چیزی که من حدس میزنم اینه که شاید چون در طول برنامه از توابع سریال زیاد استفاده میشه،باعث میشه اطلاعات توی بافر سریال با چیزی که قراره بیاد تو خروجی ترکیب بشه و خروجی رو خراب کنه...
یه چیز دگ هم اینه که شاید همین مشکل برای بافر ارتباط دوسیمه I2C که برای ارتباط با EEPROM استفاده شده وجود داشته باشه.
خیلی اطلاعات هس که بخام براتون از از این پروژه بزارم که باعث میشه پست خیلی طولانی بشه،برای همین ازتون خواهش میکنم که هرجایی از کد رو که خواستین بگین تا بزارم،تمومش هست مثله نحوه خوندن نوشتن از EEPROM، نحوه آدرس دهی ، جداسازی اطلاعات مفید از غیر مفید یا هرچیزی که میخواین....
علی الحساب اون مهمارو میزارم
توابع خواندن و نوشتن از EEPROM از طریق رابط I2C :
unsigned char eeprom_read(char haddress, char laddress)
{
unsigned char data;
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS_W);
i2c_write(haddress); //high byte address
i2c_write(laddress); //low byte address
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS_R);
data=i2c_read(0);
i2c_stop();
led_red=1;
delay_ms(10);
led_red=0;
return data;
}
void eeprom_write(unsigned char haddress, unsigned char laddress, unsigned char data)
{
i2c_start();
i2c_write(EEPROM_BUS_ADDRESS_W);
i2c_write(haddress); //high byte address
i2c_write(laddress); //low byte address
i2c_write(data);
i2c_stop();
led_red=1;
delay_ms(10);
led_red=0;
}
روش ریختن اطلاعات در متغیر مربوط به خودش :
for(i=0;i<=63;i++)
{
data[i]=eeprom_read(((current_user-1)/4)+1,((current_user-1)%4)*data_len+i);
}
for(i=0;i<=63;i++)
{
if((i>=0)&&(i<=15))
{
card[i]=data[i];
}
else if((i>=16)&&(i<=25))
{
fname[i-16]=data[i];
}
else if((i>=26)&&(i<=35))
{
lname[i-26]=data[i];
}
else if((i>=36)&&(i<=41))
{
fdate[i-36]=data[i];
}
else if((i>=42)&&(i<=47))
{
ftime[i-42]=data[i];
}
else if((i>=48)&&(i<=53))
{
ldate[i-48]=data[i];
}
else if((i>=54)&&(i<=59))
{
ltime[i-54]=data[i];
}
else if(i==60)
{
allowed[0]=data[i];
}
else if(i==61)
{
entered[0]=data[i];
}
else if(i==62)
{
credit=data[i];
}
else if(i==63)
{
credit+=data[i];
status=1;
}
}
اینم توضیحاتی برای متغیرها و توابع: (بعضیاشون تو این کدا نیس)
data[64] defination :
0 to 15 > card serial characters
16 to 21 > date of registered in yymmdd format
22 to 27 > time of registered in hhmmss format
28 to 33 > date of last enterance in yymmdd format
34 to 39 > time of last enterance in hhmmss format
40 to 49 > first name maximum in 10 charecters
50 to 59 > last name maximum in 10 characters
60 > did user enter? 1 for yes , 0 for no
61 > does user allow to access? 1 for yes , 0 for no
62 >
63 >
-----------------------------------------------------------
rcvd_code :
data received by serial port transmitted by RFID or PC Interface
--------------------------------------------------------------------------------
adrd_mem_ h :
high byte address value that addressed in last time
adrd_mem_l :
low byte address value that addressed in last time
----------------------------------------------------------------------------
eeprom_read(haddress,laddress) :
read data from in haddress and laddress that contained low and high byte of an address
eeprom_write(haddress,laddress,data) :
write data in haddress and laddress that contained low and high byte of an address
data value have't be larger than a byte of size.
-------------------------------------------------------------------------------------
check_mem() :
function read basic info about last address used(addrd_mem_h,addrd_mem_l),number of saved users(saved_user_count),number of entered users(exist_user)
-----------------------------------------------------------------------------------------
current_user :
contained number of current user who veriffied and accessed.
دلیل اینکه حلقه 64 بار تکرار میشه اینه که کل اطلاعات برای هر کاربر 64 کاراکتره که پشت سر هم ذخیره شده،برای همینم پشت سرهم خونده میشه و در آرایه 64 کاراکتریه data ذخیره و بعد از اون داخل متغیرهای دگ خرد میشه.
خب دوستان پیشتر از راهنماییهاتون تشکر میکنم و امیدوارم که بتونیم مشکل و متوجه و رفعش کنیم...واقن دگ اشکمو داره در میاره

دیدگاه