PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مشکل با نوشتن در eeprom در زیر برنامه وقفه تایمر



mahdifah
07-03-2013, 22:46
با سالم. آقا ما بعد از کلی دردسر کشیدن آخر فهمیدیم زمانی که تایمر داره کار میکنه و از وقفش استفاده میکنیم توی تابع اصلی اگر از دستور if استفاده کرده باشیم هر از چند گاهی برنامه اون if نبینه و دستور توی پرانتز اجرا کنه. به نظرتون به غیر از اینکه میتونیم اون دستور if بیاریم و توی زیر برنامه وقفه تایمر بنویسیم دیگه چیکار میتونیم بکنیم؟؟؟؟؟؟؟/ اگر بخایم توی زیر برنامه وقفه بنویسیم و برناممون طولانی باشه خیلی سخت میشه برنامه نویسی.
همچنین توی برنامه من بعد از دستور if دستور نوشتن در eeprom هستش که اگر این if در زیر برنامه وقفه تایمر1 بنویسم حجم برنامم از 90 درصد میره به صد درصد. با ccs هم برنامه مینویسم. به نظرتون باید چیکار میکردم که نکردم؟:x

meysam.z
07-03-2013, 23:28
دوست عزیز شما این مشکلی که مطرح کردی منم تقریبا من هم مواجه شده بودم با هاش ....
کلا پیشنهاد میشه زیاد از وقفه استاده نشه توی پروژه ها ...
راهی که به ذهن من می رسه اینه که یک خط قبل از اون if مورد نظر بیای تایمر رو بخونی و وقفه رو غیر فعال کنی و بعد از اجرای if وقفه رو فعال کنی ....:wink:

mahdifah
08-03-2013, 10:11
آخه نمیشه از وقفه استفاده نکردش که. توی خیلی از پروژه ها استفاده میکنن و به هیچ مشکلیم نمیخورن. به نظرم باید یه کاری کنیم که ما بلد نیستیم بکنیم. حتما یه راحی باید داشته باشه. راهه میانبور هستش ولی باید یه راهه درست حسابی که همه جا پیدا بشه پیدا کردش

amin1139
08-03-2013, 11:03
تو ccs یا هر کامپایلر دیگه داخل برنامه ی وقفه اول غیر فعالش میکنی پرچمش هم صفر میکنی در پایان وقفه دوباره همه ی وقفه هارو فعال میکنی وگرنه باعث عملکرد ناخواسته میشه
نمیدونم منظورتونو درست فهمیدم؟

mahdifah
08-03-2013, 11:11
تو ccs یا هر کامپایلر دیگه داخل برنامه ی وقفه اول غیر فعالش میکنی پرچمش هم صفر میکنی در پایان وقفه دوباره همه ی وقفه هارو فعال میکنی وگرنه باعث عملکرد ناخواسته میشه
نمیدونم منظورتونو درست فهمیدم؟

منم همین کار میکنم عزیز ولی حجم برنامم 10 درصد بیشتر میشه!!!!!! یعنی زمانی که توی زیر برنامه وقفه یه تابع دیگر فراخوانی میکنم حجم برنامم در کمال ناباوری 10 درصد بیشتر میشه!!!!!

scienceaddict
08-03-2013, 19:45
دوست عزیز شما این مشکلی که مطرح کردی منم تقریبا من هم مواجه شده بودم با هاش ....
کلا پیشنهاد میشه زیاد از وقفه استاده نشه توی پروژه ها ...
راهی که به ذهن من می رسه اینه که یک خط قبل از اون if مورد نظر بیای تایمر رو بخونی و وقفه رو غیر فعال کنی و بعد از اجرای if وقفه رو فعال کنی ....:wink:

سلام دوست عزیز ، بهتره با هم جمع شیم و به شرکت میکروچیپ توصیه کنیم که این چه وضعشه ، ما از چند تا وقفه استفاده میکنیم ، مشکل ایجاد میشه Good Luck

scienceaddict
08-03-2013, 19:49
تو ccs یا هر کامپایلر دیگه داخل برنامه ی وقفه اول غیر فعالش میکنی پرچمش هم صفر میکنی در پایان وقفه دوباره همه ی وقفه هارو فعال میکنی وگرنه باعث عملکرد ناخواسته میشه
نمیدونم منظورتونو درست فهمیدم؟

سلام دوست عزیز ، در میکروکنترلر های pic به محض اینکه وقفه ای رخ میده ، بیت هفتم رجیستر INTCON یا همون GIE صفر میشه و تا زمانی که برنامه در ساب روتین وقفه ی مورد نظر هست به هیچ وقفه ی دیگه ای پاسخ داده نمیشه ، فقط اگر وقفه ای رخ بده پرچمش یک میشه ، صفر شدن بیت GIE به صورت سخت افزاری انجام میگیره و نیازی نیست ما در ابتدای وقفه این کارو انجام بدیم و در انتهای وقفه فعالش کنیم ، در انتهای ساب روتین دستور اسمبلی RETFIE استک پوینتر رو تو پروگرام کانتر میریزه و به طور خودکار بیت GIE رو یک میکنه Good Luck

mahdifah
08-03-2013, 22:45
سلام دوست عزیز ، بهتره با هم جمع شیم و به شرکت میکروچیپ توصیه کنیم که این چه وضعشه ، ما از چند تا وقفه استفاده میکنیم ، مشکل ایجاد میشه good luck
آقا من اصلا نگفتم از چنتا وقفه استفاده میکنیم. من میگم ااگر توی زیر برنامه وقفه یه تابع رو فراخانی کنیم حجم برنامه میره بالا. چرا؟ باید چیکار کنیم که نره؟ میکروچیپ همه کاراش رو برنامس . مثل من نیستن که اونا. مشکل از ماست

sjafarim
08-03-2013, 23:50
کلا تو روتین وقفه نباید تابعی رو فراخونی کرد، مثلا تو کامپایلرهای microe اصلا اجازشو بهت نمیده، اگر میخوای eeprom رو بخونی یا بنویسی تو چند خط با استفاده از ریجسترهاش انجام بده، منم همین مشکلو داشتم...

mahdifah
09-03-2013, 11:11
کلا تو روتین وقفه نباید تابعی رو فراخونی کرد، مثلا تو کامپایلرهای microe اصلا اجازشو بهت نمیده، اگر میخوای eeprom رو بخونی یا بنویسی تو چند خط با استفاده از ریجسترهاش انجام بده، منم همین مشکلو داشتم...

عزیز شما با ccs کار کردید؟ میدونید چطوری میتونم توی eeprpm خارجی بنویسم و بخونمش بدون استفاده از دستورای کتابخونه ای؟

scienceaddict
10-03-2013, 00:32
سلام دوست عزیز منم خودم با C کار میکردم ، اما توبه کردم که برای میکروکنترلر ها فقط اسمبلی بنویسم ، AVR و PIC ، این برنامه ای که میذارم رو هم تو eeprom داخلی نوشتم و هم تو خارجی ، خارجیه چون کتابخونه at24c16 یا کمتر رو نداشتم ، برنامه رو برای 512 نوشتم که کمتر کسی ده تومن پول این eeprom رو میده ، فرقش با بقیه eeprom های کم حافظه ی اتمل دو خط کم و زیاده اما اصلش همینه ، شما میتونی خیلی ساده تر اینو تبدیل به سی کنی ، الگوی اصلی رو از دیتاشیت های میکروچیپ گرفتم و یکم تغییر دادم ، برای اینکه تو پروتیوس ببینی ، برنامه رو pause کن بعد از منوی دیباگ ، حافظه ها رو بیار ، F11 بزن تا کلاک کلاک ببینی که چی کجا نوشته میشه و چطور خونده میشه نوشتن در حافظه خارجی You can see links before reply نوشتن در حافظه داخلی You can see links before reply

scienceaddict
10-03-2013, 00:47
آقا من اصلا نگفتم از چنتا وقفه استفاده میکنیم. من میگم ااگر توی زیر برنامه وقفه یه تابع رو فراخانی کنیم حجم برنامه میره بالا. چرا؟ باید چیکار کنیم که نره؟ میکروچیپ همه کاراش رو برنامس . مثل من نیستن که اونا. مشکل از ماست

مشکل از شما نیست ، از میکروچیپ هم که اصلا نیست ، از کامپایلر شماست من نمیدونم چرا حجم برنامه میره بالا ، در صورتی که فقط یه دستور کال تو ساب روتین اضافه میشه ، شما یه اسمبلی باز کن ، اسم برچسبتو کال کن CALL LABEL اسمبلی رو ببند ، ببین حجم برنامه ات چطوری میشه Good Luck

mahdifah
10-03-2013, 10:08
سلام دوست عزیز منم خودم با C کار میکردم ، اما توبه کردم که برای میکروکنترلر ها فقط اسمبلی بنویسم ، AVR و PIC ، این برنامه ای که میذارم رو هم تو eeprom داخلی نوشتم و هم تو خارجی ، خارجیه چون کتابخونه at24c16 یا کمتر رو نداشتم ، برنامه رو برای 512 نوشتم که کمتر کسی ده تومن پول این eeprom رو میده ، فرقش با بقیه eeprom های کم حافظه ی اتمل دو خط کم و زیاده اما اصلش همینه ، شما میتونی خیلی ساده تر اینو تبدیل به سی کنی ، الگوی اصلی رو از دیتاشیت های میکروچیپ گرفتم و یکم تغییر دادم ، برای اینکه تو پروتیوس ببینی ، برنامه رو pause کن بعد از منوی دیباگ ، حافظه ها رو بیار ، F11 بزن تا کلاک کلاک ببینی که چی کجا نوشته میشه و چطور خونده میشه نوشتن در حافظه خارجی 22_AT24C512_READ_AND_WRITE (You can see links before reply) نوشتن در حافظه داخلی 20_INTERNAL_EEPROM (You can see links before reply)

آقا دمت گرم ولی من اصلا از اسمبلی اصلا سر در نمیارم. چطوری اسمبلیش call کنم؟؟ بیشتر توضیح میدید؟؟ اصلا میشه از زیر برنامه وقفه اون تابعی که میخوام به زبان اسمبلی فراخانی کنم؟؟ اگر میشه دستورش بگید

sjafarim
11-03-2013, 00:06
نوشتن تو رام خارجی بسته به مدلش داره،کم و زیاد داره، دیتا شیتشو بخون،معمولا هر write مثلا تو 5-6 تا استپ انجام میشه، مدل رامتو بگو یه نیگا بندازم شاید بتونم کمکت کنم...
برای نوشتن اسمبلی وسط c هم این کارو کن:

#asm
کد اسمبلی
#endasm


از دستورای پرش تو اسمبلی استفاده کن، فکر بدی نیست، امتحان کن شاید جواب بده...:wink:
(goto یا Call)

mahdifah
11-03-2013, 10:37
مدل رامم 24c08 هستش عزیز

mahdifah
27-03-2013, 01:51
آقا من تازه فهمیدم مشکل از اینتراپت تایمر و خواندن از eeprom هستش. زمانی که از تایمر و اینتراپتش استفاده میکنم . یعنی زمانی که هم تایمر داره میشماره و وقفه روی میده و از eeprom میخونم, بعضی وقتا توی eeprom نوشته میشه . خیلی عجیبه!!!!!! واقعا موندم

mahdifah
03-04-2013, 03:09
کسی نظر خاسی نداره بده؟ زمانی که وقفه روی میده و دارم از حافظه خارجی میخونم توی حافظه نوشته میشه. !!!!!!!!!!

scienceaddict
03-04-2013, 11:36
سلام دوست عزیز
من فکر کردم شما مسئله ات رو تا حالا حل کردی:baad:
سوال من از شما اینه که شما از کجا مطمئنید تو حافظه مینویسه بجای اینکه بخونه؟
و اینکه احتمالش خیلی کمه چون این ارتباط مثل 1wire زمان بندی نداره و سنکرون هست ، کلاک رو هم مستر تولید میکنه ، مستر حالا به یه زیر برنامه تایمر بره و برگرده طبیعتا دیتایی نباید بره و چیزی نباید تغییر کنه ، اما تفاوت خوندن و نوشتن در یک بیته A1 یعنی خوندن و A0 یعنی نوشتن در همون page
یه سوال دیگه ، اینکه کتابخونه ای که ازش استفاده میکنید برای نوشتن و خوندن از AT24c فقط از RC4 و RC5 استفاده میکنه ، یا میتونی AT24C رو روی هر پایه ای از میکرو قرار بدی(مثل کدویژن AVR)؟
اگه صبر و حوصله داشته باشیم میتونیم یه کتابخونه بنویسیم مخصوص AT24C08 که بتونی تو زیربرنامه هات فراخوانیش کنی

Good Luck

mahdifah
03-04-2013, 16:52
با تشکر از شما. توی برنامه من همیشه زمان در حال شمارش هست و وقفه روی میده و در زیر برنامه اصلیم هم از حافظه خارجی عمل خواندن رو انجام میده. من حتی عمل نوشتن توی eeprom رو پاک کردم از کتابخونه حافظه. دستور نوشتن در eeprom هم در زیر میزارم


BYTE read_ext_eeprom(long int address) {
BYTE data;

while(!ext_eeprom_ready());
i2c_start();
i2c_write((0xa0|(BYTE)(address>>7))&0xfe);
i2c_write(address);
i2c_start();
i2c_write((0xa0|(BYTE)(address>>7))|1);
data=i2c_read(0);
i2c_stop();
return(data);
}

هرچقدر هم زمان وقفه کمتر میکنم عمل نوشتن توی حافظه سریعتر انجام میشه. توی کل حافظه نمینویسه ها توی بعضی از جاهاش اطلاعات غلط مینویسه.

اینم برنامه ای که باهاش تستش کردم و فهمیدم زمانی که وقفر فعال میکنم عمل نوشتن جای خوندن توش اجرا میشه.



#int_timer2
void timer2_isr() {
if(++tick>=50&&shasyz==0){
tick=0;
output_toggle(led);}}



void main(){output_b(0b0);
setup_timer_2 ( T2_DIV_BY_16,55,16);
enable_interrupts(INT_timer2);
enable_interrupts(GLOBAL);
set_tris_b(0b00000101);
set_tris_a(0b0000011);
int16 i;
int8 r3,r2,r1,byte1,byte2,byte3;
int1 gg=0;

while(true){
for (i=0;i<1023;i+=2){ i++;
r3=read_ext_eeprom(i);delay_us(850);
r2=read_ext_eeprom(i+1);delay_us(850);
r1=read_ext_eeprom(i+2);delay_us(850);

if (byte3==r3&&byte2==r2&&byte1==r1){i=1024;gg=1;}}
}}
راستی فقط از پایه های scl , sda میکرو میتونم باهاش ارطباط برقرار کنم.

scienceaddict
03-04-2013, 18:45
سلام دوست عزیز
شما لینک زیر که کوتاه هست رو بخون
(You can see links before reply)
دقیقا مشکل شما رو داشتم ، دوستمون هم داشت ، طبق اون توضیحات برید بعد ببینید میتونید بخونید ؟
من هم عملا و هم تو پروتیوس با AT24C512 نوشتن و خوندن رو به همین طریق که نوشتم ، تست کردم

Good Luck

mahdifah
03-04-2013, 19:18
من نوشتم تستش کنم ولی فکر نمیکنم جواب بده. چون توی حالت عادی و بدون استفاده از وقفه توش جای خوندن اشتباه نمینویسه. فقط زمانی توی حافظه اظلاعات غلط مینویسه که از وقفه استفاده کرده باشم

mahdifah
03-04-2013, 19:49
آقا ما تستشم کردیم ولی جواب ندادش. موندم چیکار کنم واقعا!!!!!!!!!!! 2 یا 3 ماهه رو این مشکل گیر کردم

scienceaddict
04-04-2013, 00:29
سلام دوست عزیز
دوست عزیز من شما تاپیکی که گذاشتم رو خوندی ؟
تابع نوشتن شما در حافظه اشتباه است ، به صورت زیر اصلاح کنید



BYTE read_ext_eeprom(long int address) {
BYTE data;
while(!ext_eeprom_ready());
i2c_start();
i2c_write((0xa0|(BYTE)(address>>7))&0xfe);
i2c_write(address);
i2c_stop();
i2c_start();
i2c_write((0xa0|(BYTE)(address>>7))|1);
data=i2c_read(0);
i2c_stop();
return(data); }

من باز هم ازمایش کردم و دوتا عکسی که پایین گذاشتم عکس هایی اند که تو پروتیوس دیباگ کردم ، شما برای خوندن دیتا باید بعد از شرایط شروع ، و A0 و آدرس ، شرایط پایان ایجاد کنید ، دوباره شرایط شروع ، A1 ، و گرفتن دیتا ، شرایط پایان
شما عکس ها رو نگاه کن
تنها نکته اینه که چون AT24C512 هست بعد از دستور A0 آدرس باید دوبار (16 بیتی) نوشته بشه ، در عکسی که نوشتن بصورت اشتباه انجام شده ، I2C دیباگر ، شرایط پایان و شروع رو اصلا احساس نکرده واسه همین نمایش نداده ، میتونم برنامه رو برات قرار بدم تا خط به خط خودت دیباگ کنی

You can see links before reply
You can see links before reply

واقعا دو سه ماهه رو این مورد مشکل داری:unh::unh:؟ ، اگه اگه شروع کرده بودی اسمبلی میخوندی الان تمومش کرده بودی :125:

Good Luck

mahdifah
04-04-2013, 01:15
خوب عزیز منم برنامه بالار تستش کردم دیگه. بعد از چند دقیقه اطلاعات اشتباه مینویسه توی حافظه. شما به صورت عملی ببندید متوجه میشیدمیشید. بعد از چند دقیقه که بگذره هر از چند دقیقه ای توی یه حافظه یه چیزی مینویسه. بیشترم 167 مینویسه نمیدونم چرا

scienceaddict
04-04-2013, 03:35
سلام دوست عزیز
ببخشید من منظورتونو متوجه نشدم
بهر حال من تو پروتیوس تست کردم و عملا هم دیدم که تو خوندن اون شرط پایان باید باشه و اگر باشه درسته ، خط به خط برنامه ام رو تو پروتیوس دیباگ کردم عکسش هم گذاشتم یعنی نهایت مطمئن ، عملا تو یه خونه فقط نوشتم و خوندم ، برای At24C16
اما حتما حتما حتما ، ظهر دوتا برنامه جدا برای دوتا میکرو مینویسم که یکی تو تمام خونه های At24C16 دیتا هایی رو بنویسه ، بعد حافظه رو میذارم روی یه میکروی دیگه با یه برنامه دیگه که فقط حافظه رو بخونه ، بفرسته به سریال ، شکل دیتا ها رو تو متلب میکشم میذارم همینجا ، عجبب کارم سخت شد:(
اینجوری مطمئن میشیم که کجا اشتباهه ، مشکل یا از طرز نوشتن و خوندن ما تو این حافظه هست یا از جای دیگه ،
بالاخره پیداش میکنیم دیگه:wink:
تا نیمروز

Good Luck

mahdifah
04-04-2013, 12:02
آقا دمت گرم انصافا. من 1 حافظه خالی فقط میخونم حتی توش اصلا نمینویسم. وقتی خالی باشه همه بایتاش 255 هستن.ولی زمانی که زمان وقفر کم میکنم جای اینکه بخونه مینویسه توش. من یه برنامه گذاشتم که فقط میخونه و یه برنامه هم نوشتم که از رو حافظه میخونه و روی ال سی دی نشون میده اطلاعاتش. میخاید اونم بزارم؟؟ میشه بگید شما با متلب چطوری شبیه سازی میکنید؟ با همین زبان سی شبیه سازی میکنید؟؟
یه چیزیرم یادم رفت بگم. من فقط 1 بایت نمیخونم و بعد از خوندن اون یه بایت توی حافظه نوشته بشه. من میزارم 1 ربع , بیست دقیقه میمونه , بعدش که میام میخونم و روی ال سی دی نگاهش میکنم 2 یا 3 بایتش فقط توش نوشته شده.

من فکر میکنم برنامه میاد تا خط قبل از استوپ اولی اجرا میکنه و بعد وقفه روی میده . سی پی یو میره و کارای وقفر انجام میده , وقتی بر میگرده جای اینکه بره بقیه برنامر اجرا کنه دوباره اون تابع از اول میخونه. واسه همین جای خوندن مینویسه توش

scienceaddict
04-04-2013, 18:40
سلام دوست عزیز
من همین برنامه ای که تو پست #23 هست رو به اسمبلی اجرا کردم ، تو تمام خونه های AT24C16 به ترتیب FF و 00 یکی در میون نوشتم ، بعد از نوشتن پورت B چشمک میزنه ،
بعد با یه میکرو دیگه که برنامش تو لینک هست ، کل 2048 بایت حافظه رو خوندم و با باود ریت 4800 بیت بر ثانیه میفرسته برای سریال ، خروجیش هم نات کردم دادم به پورت کام ، برنامه متلب هم تو فایل read قرار دادم ، متلب انقدر سطحش بالاست که برنامه اش نیاز به توضیح نداره خیلی ساده است ، پورت رو باز میکنه دیتا رو میگیره و نمودارشو میکشه ، تاخیر ها خییییییلی زیاد هستند میدونم اما ببخشید برنامه رو عجله ای نوشتم ، اما کار میکنه
AT24C16 (You can see links before reply)
خب حالا که مطمئن شدیم برنامه ی پست #23 شما درسته ، اما شما میگی که به جای خوندن مینویسه ، باید ببینیم چرا ، ببینید تو دوتا عکسی که گذاشتم ، I2C Debugger پروتیوس شرایط شروع جدید رو اصلا احساس نکرد ، تو برنامه ی پست #23 شما ، اگه شرایط پایان نباشه یا به هر دلیلی درست انجام نشه ، آی سی شرط شروع بعد از شرط پایان رو احساس نمیکنه ، و فکر میکنه بایت بعدی که قراره بیاد باید بنویسه ، بایت بعدی هم A1 یا 161 هست ، که شما میگفتی بیشتر 161 مینویسه ، دلیل مشکل اینه ، شما برنامه ات رو با I2C دیباگر پروتیوس دیباگ کن ببین مشکل کجاست ، اگه ممکنه برنامه ات رو اینجا هم بذار تا من هم دیباگ کنم
اگه خواستی عملا ببندی بگو تا برنامه رو تغییر بدم یا بگم خودت تغییر بدی ، چون C16 هشت تا page دویست و پنجاه و شش بایتی داره ولی C8 چهار تا page داره
Good Luck

mahdifah
04-04-2013, 18:58
آقا انصافا خیلی سطح بالا گفتید. میشه میلتون بدید؟؟ من برنامم گذاشتم صفحه 2 دیگه

1hoshmand
09-07-2013, 02:47
سلام من دارم برنامه رمز را مینویسم که توش 4 کاربر با رمزهای مختلف وقابل تغییر وارد یه زیر برنامه میشن اما مشکل اینجا ست که موقع کامپایل یه پیام درباره کدword to strمیده که باعث میشه توعمل اعداد روی ال سیدی نمایش داده نشه اما برنامه کار خودش را میکنه تمامی تبدیل هی من هم براساس helpنر م افزارmikroeهست کی میتونه کمکم کنه