NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3946 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
صفحه 1 از 2 12 آخرینآخرین
نمایش نتایج: از 1 به 20 از 29

موضوع: مشکل با نوشتن در eeprom در زیر برنامه وقفه تایمر

  1. #1
    کاربر علاقه مند mahdifah آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    محمد مهدی
    نوشته ها
    99
    تشکر
    19
    تشکر شده 53 بار در 36 پست

    پیش فرض مشکل با نوشتن در eeprom در زیر برنامه وقفه تایمر

    با سالم. آقا ما بعد از کلی دردسر کشیدن آخر فهمیدیم زمانی که تایمر داره کار میکنه و از وقفش استفاده میکنیم توی تابع اصلی اگر از دستور if استفاده کرده باشیم هر از چند گاهی برنامه اون if نبینه و دستور توی پرانتز اجرا کنه. به نظرتون به غیر از اینکه میتونیم اون دستور if بیاریم و توی زیر برنامه وقفه تایمر بنویسیم دیگه چیکار میتونیم بکنیم؟؟؟؟؟؟؟/ اگر بخایم توی زیر برنامه وقفه بنویسیم و برناممون طولانی باشه خیلی سخت میشه برنامه نویسی.
    همچنین توی برنامه من بعد از دستور if دستور نوشتن در eeprom هستش که اگر این if در زیر برنامه وقفه تایمر1 بنویسم حجم برنامم از 90 درصد میره به صد درصد. با ccs هم برنامه مینویسم. به نظرتون باید چیکار میکردم که نکردم؟

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نام
    Advertising world
    نوشته ها
    Many
     

  3. #2
    کاربر فعال
    تاریخ عضویت
    Mar 2013
    نوشته ها
    136
    تشکر
    87
    تشکر شده 70 بار در 47 پست

    پیش فرض

    دوست عزیز شما این مشکلی که مطرح کردی منم تقریبا من هم مواجه شده بودم با هاش ....
    کلا پیشنهاد میشه زیاد از وقفه استاده نشه توی پروژه ها ...
    راهی که به ذهن من می رسه اینه که یک خط قبل از اون if مورد نظر بیای تایمر رو بخونی و وقفه رو غیر فعال کنی و بعد از اجرای if وقفه رو فعال کنی ....

  4. #3
    کاربر علاقه مند mahdifah آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    محمد مهدی
    نوشته ها
    99
    تشکر
    19
    تشکر شده 53 بار در 36 پست

    پیش فرض

    آخه نمیشه از وقفه استفاده نکردش که. توی خیلی از پروژه ها استفاده میکنن و به هیچ مشکلیم نمیخورن. به نظرم باید یه کاری کنیم که ما بلد نیستیم بکنیم. حتما یه راحی باید داشته باشه. راهه میانبور هستش ولی باید یه راهه درست حسابی که همه جا پیدا بشه پیدا کردش

  5. تشکرها از این نوشته :


  6. #4
    کاربر فعال
    تاریخ عضویت
    May 2011
    نام
    امین
    نوشته ها
    253
    تشکر
    91
    تشکر شده 123 بار در 101 پست

    پیش فرض

    تو ccs یا هر کامپایلر دیگه داخل برنامه ی وقفه اول غیر فعالش میکنی پرچمش هم صفر میکنی در پایان وقفه دوباره همه ی وقفه هارو فعال میکنی وگرنه باعث عملکرد ناخواسته میشه
    نمیدونم منظورتونو درست فهمیدم؟

  7. #5
    کاربر علاقه مند mahdifah آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    محمد مهدی
    نوشته ها
    99
    تشکر
    19
    تشکر شده 53 بار در 36 پست

    پیش فرض

    نقل قول نوشته اصلی توسط amin1139 نمایش پست ها
    تو ccs یا هر کامپایلر دیگه داخل برنامه ی وقفه اول غیر فعالش میکنی پرچمش هم صفر میکنی در پایان وقفه دوباره همه ی وقفه هارو فعال میکنی وگرنه باعث عملکرد ناخواسته میشه
    نمیدونم منظورتونو درست فهمیدم؟
    منم همین کار میکنم عزیز ولی حجم برنامم 10 درصد بیشتر میشه!!!!!! یعنی زمانی که توی زیر برنامه وقفه یه تابع دیگر فراخوانی میکنم حجم برنامم در کمال ناباوری 10 درصد بیشتر میشه!!!!!

  8. #6
    کاربر علاقه مند scienceaddict آواتار ها
    تاریخ عضویت
    Jan 2013
    نام
    محمد رضایی
    نوشته ها
    22
    تشکر
    16
    تشکر شده 15 بار در 12 پست

    پیش فرض

    نقل قول نوشته اصلی توسط meysam.z نمایش پست ها
    دوست عزیز شما این مشکلی که مطرح کردی منم تقریبا من هم مواجه شده بودم با هاش ....
    کلا پیشنهاد میشه زیاد از وقفه استاده نشه توی پروژه ها ...
    راهی که به ذهن من می رسه اینه که یک خط قبل از اون if مورد نظر بیای تایمر رو بخونی و وقفه رو غیر فعال کنی و بعد از اجرای if وقفه رو فعال کنی ....
    سلام دوست عزیز ، بهتره با هم جمع شیم و به شرکت میکروچیپ توصیه کنیم که این چه وضعشه ، ما از چند تا وقفه استفاده میکنیم ، مشکل ایجاد میشه Good Luck

  9. #7
    کاربر علاقه مند scienceaddict آواتار ها
    تاریخ عضویت
    Jan 2013
    نام
    محمد رضایی
    نوشته ها
    22
    تشکر
    16
    تشکر شده 15 بار در 12 پست

    پیش فرض

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

  10. #8
    کاربر علاقه مند mahdifah آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    محمد مهدی
    نوشته ها
    99
    تشکر
    19
    تشکر شده 53 بار در 36 پست

    پیش فرض

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

  11. #9
    کاربر فعال sjafarim آواتار ها
    تاریخ عضویت
    Jan 2008
    نام
    جعفری
    نوشته ها
    225
    تشکر
    93
    تشکر شده 297 بار در 141 پست

    پیش فرض

    کلا تو روتین وقفه نباید تابعی رو فراخونی کرد، مثلا تو کامپایلرهای microe اصلا اجازشو بهت نمیده، اگر میخوای eeprom رو بخونی یا بنویسی تو چند خط با استفاده از ریجسترهاش انجام بده، منم همین مشکلو داشتم...

  12. تشکرها از این نوشته :


  13. #10
    کاربر علاقه مند mahdifah آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    محمد مهدی
    نوشته ها
    99
    تشکر
    19
    تشکر شده 53 بار در 36 پست

    پیش فرض

    نقل قول نوشته اصلی توسط sjafarim نمایش پست ها
    کلا تو روتین وقفه نباید تابعی رو فراخونی کرد، مثلا تو کامپایلرهای microe اصلا اجازشو بهت نمیده، اگر میخوای eeprom رو بخونی یا بنویسی تو چند خط با استفاده از ریجسترهاش انجام بده، منم همین مشکلو داشتم...
    عزیز شما با ccs کار کردید؟ میدونید چطوری میتونم توی eeprpm خارجی بنویسم و بخونمش بدون استفاده از دستورای کتابخونه ای؟

  14. #11
    کاربر علاقه مند scienceaddict آواتار ها
    تاریخ عضویت
    Jan 2013
    نام
    محمد رضایی
    نوشته ها
    22
    تشکر
    16
    تشکر شده 15 بار در 12 پست

    پیش فرض

    سلام دوست عزیز منم خودم با C کار میکردم ، اما توبه کردم که برای میکروکنترلر ها فقط اسمبلی بنویسم ، AVR و PIC ، این برنامه ای که میذارم رو هم تو eeprom داخلی نوشتم و هم تو خارجی ، خارجیه چون کتابخونه at24c16 یا کمتر رو نداشتم ، برنامه رو برای 512 نوشتم که کمتر کسی ده تومن پول این eeprom رو میده ، فرقش با بقیه eeprom های کم حافظه ی اتمل دو خط کم و زیاده اما اصلش همینه ، شما میتونی خیلی ساده تر اینو تبدیل به سی کنی ، الگوی اصلی رو از دیتاشیت های میکروچیپ گرفتم و یکم تغییر دادم ، برای اینکه تو پروتیوس ببینی ، برنامه رو pause کن بعد از منوی دیباگ ، حافظه ها رو بیار ، F11 بزن تا کلاک کلاک ببینی که چی کجا نوشته میشه و چطور خونده میشه نوشتن در حافظه خارجی http://s2.picofile.com/file/76854733...WRITE.zip.html نوشتن در حافظه داخلی http://s2.picofile.com/file/76854778...EPROM.zip.html
    ویرایش توسط scienceaddict : 10-03-2013 در ساعت 00:36

  15. #12
    کاربر علاقه مند scienceaddict آواتار ها
    تاریخ عضویت
    Jan 2013
    نام
    محمد رضایی
    نوشته ها
    22
    تشکر
    16
    تشکر شده 15 بار در 12 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mahdifah نمایش پست ها
    آقا من اصلا نگفتم از چنتا وقفه استفاده میکنیم. من میگم ااگر توی زیر برنامه وقفه یه تابع رو فراخانی کنیم حجم برنامه میره بالا. چرا؟ باید چیکار کنیم که نره؟ میکروچیپ همه کاراش رو برنامس . مثل من نیستن که اونا. مشکل از ماست
    مشکل از شما نیست ، از میکروچیپ هم که اصلا نیست ، از کامپایلر شماست من نمیدونم چرا حجم برنامه میره بالا ، در صورتی که فقط یه دستور کال تو ساب روتین اضافه میشه ، شما یه اسمبلی باز کن ، اسم برچسبتو کال کن CALL LABEL اسمبلی رو ببند ، ببین حجم برنامه ات چطوری میشه Good Luck

  16. تشکرها از این نوشته :


  17. #13
    کاربر علاقه مند mahdifah آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    محمد مهدی
    نوشته ها
    99
    تشکر
    19
    تشکر شده 53 بار در 36 پست

    پیش فرض

    نقل قول نوشته اصلی توسط scienceaddict نمایش پست ها
    سلام دوست عزیز منم خودم با C کار میکردم ، اما توبه کردم که برای میکروکنترلر ها فقط اسمبلی بنویسم ، AVR و PIC ، این برنامه ای که میذارم رو هم تو eeprom داخلی نوشتم و هم تو خارجی ، خارجیه چون کتابخونه at24c16 یا کمتر رو نداشتم ، برنامه رو برای 512 نوشتم که کمتر کسی ده تومن پول این eeprom رو میده ، فرقش با بقیه eeprom های کم حافظه ی اتمل دو خط کم و زیاده اما اصلش همینه ، شما میتونی خیلی ساده تر اینو تبدیل به سی کنی ، الگوی اصلی رو از دیتاشیت های میکروچیپ گرفتم و یکم تغییر دادم ، برای اینکه تو پروتیوس ببینی ، برنامه رو pause کن بعد از منوی دیباگ ، حافظه ها رو بیار ، F11 بزن تا کلاک کلاک ببینی که چی کجا نوشته میشه و چطور خونده میشه نوشتن در حافظه خارجی 22_AT24C512_READ_AND_WRITE نوشتن در حافظه داخلی 20_INTERNAL_EEPROM
    آقا دمت گرم ولی من اصلا از اسمبلی اصلا سر در نمیارم. چطوری اسمبلیش call کنم؟؟ بیشتر توضیح میدید؟؟ اصلا میشه از زیر برنامه وقفه اون تابعی که میخوام به زبان اسمبلی فراخانی کنم؟؟ اگر میشه دستورش بگید

  18. تشکرها از این نوشته :


  19. #14
    کاربر فعال sjafarim آواتار ها
    تاریخ عضویت
    Jan 2008
    نام
    جعفری
    نوشته ها
    225
    تشکر
    93
    تشکر شده 297 بار در 141 پست

    پیش فرض

    نوشتن تو رام خارجی بسته به مدلش داره،کم و زیاد داره، دیتا شیتشو بخون،معمولا هر write مثلا تو 5-6 تا استپ انجام میشه، مدل رامتو بگو یه نیگا بندازم شاید بتونم کمکت کنم...
    برای نوشتن اسمبلی وسط c هم این کارو کن:
    کد:
    #asm
    کد اسمبلی
        #endasm
    از دستورای پرش تو اسمبلی استفاده کن، فکر بدی نیست، امتحان کن شاید جواب بده...
    (goto یا Call)
    ویرایش توسط sjafarim : 11-03-2013 در ساعت 00:10

  20. تشکرها از این نوشته :


  21. #15
    کاربر علاقه مند mahdifah آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    محمد مهدی
    نوشته ها
    99
    تشکر
    19
    تشکر شده 53 بار در 36 پست

    پیش فرض

    مدل رامم 24c08 هستش عزیز

  22. #16
    کاربر علاقه مند mahdifah آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    محمد مهدی
    نوشته ها
    99
    تشکر
    19
    تشکر شده 53 بار در 36 پست

    پیش فرض

    آقا من تازه فهمیدم مشکل از اینتراپت تایمر و خواندن از eeprom هستش. زمانی که از تایمر و اینتراپتش استفاده میکنم . یعنی زمانی که هم تایمر داره میشماره و وقفه روی میده و از eeprom میخونم, بعضی وقتا توی eeprom نوشته میشه . خیلی عجیبه!!!!!! واقعا موندم

  23. #17
    کاربر علاقه مند mahdifah آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    محمد مهدی
    نوشته ها
    99
    تشکر
    19
    تشکر شده 53 بار در 36 پست

    پیش فرض

    کسی نظر خاسی نداره بده؟ زمانی که وقفه روی میده و دارم از حافظه خارجی میخونم توی حافظه نوشته میشه. !!!!!!!!!!

  24. #18
    کاربر علاقه مند scienceaddict آواتار ها
    تاریخ عضویت
    Jan 2013
    نام
    محمد رضایی
    نوشته ها
    22
    تشکر
    16
    تشکر شده 15 بار در 12 پست

    پیش فرض

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

    Good Luck

  25. تشکرها از این نوشته :


  26. #19
    کاربر علاقه مند mahdifah آواتار ها
    تاریخ عضویت
    Aug 2009
    نام
    محمد مهدی
    نوشته ها
    99
    تشکر
    19
    تشکر شده 53 بار در 36 پست

    پیش فرض

    با تشکر از شما. توی برنامه من همیشه زمان در حال شمارش هست و وقفه روی میده و در زیر برنامه اصلیم هم از حافظه خارجی عمل خواندن رو انجام میده. من حتی عمل نوشتن توی 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 میکرو میتونم باهاش ارطباط برقرار کنم.
    ویرایش توسط mahdifah : 03-04-2013 در ساعت 17:32

  27. #20
    کاربر علاقه مند scienceaddict آواتار ها
    تاریخ عضویت
    Jan 2013
    نام
    محمد رضایی
    نوشته ها
    22
    تشکر
    16
    تشکر شده 15 بار در 12 پست

    پیش فرض

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

    دقیقا مشکل شما رو داشتم ، دوستمون هم داشت ، طبق اون توضیحات برید بعد ببینید میتونید بخونید ؟
    من هم عملا و هم تو پروتیوس با AT24C512 نوشتن و خوندن رو به همین طریق که نوشتم ، تست کردم

    Good Luck

صفحه 1 از 2 12 آخرینآخرین

موضوعات مشابه

  1. مطالب زیبا
    توسط javad naderi در انجمن گفت و گوي آزاد
    پاسخ: 317
    آخرين نوشته: 19-04-2014, 10:54
  2. فلزیاب با برد 1 متر
    توسط sobhan537 در انجمن موتورها و درایوها
    پاسخ: 0
    آخرين نوشته: 06-07-2013, 17:38
  3. چطور ولتاژ خروجی pio رو زیاد کنم
    توسط gbg در انجمن AT91 series (ATMEL)
    پاسخ: 10
    آخرين نوشته: 22-05-2013, 12:01
  4. جملات قصار و زیبا
    توسط morteza_rk در انجمن گفت و گوي آزاد
    پاسخ: 3
    آخرين نوشته: 05-03-2012, 00:02
  5. قطعات قابل بازیافت از موبایل
    توسط shayanmelody در انجمن سایر موارد مرتبط با میکرو کنترلرها
    پاسخ: 5
    آخرين نوشته: 14-12-2011, 23:13

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •