اطلاعیه

Collapse
No announcement yet.

eeprom در avr مقدار خود را بی دلیل از دست میدهد؟

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    eeprom در avr مقدار خود را بی دلیل از دست میدهد؟

    سلام به دوستان عزیز من سیستمی طراحی کردم که که در اون باید نزدیک به 50 متغیر از نوع eeprom تعریف شده است که گاهی اوقات در هنگام مقدار دهی توسط کیبرد خود به خود مقادیری که قبالا تنظیم شده قاط میزنه یا اینکه مقدار صفر میگیره من برنامه رو با codevision نوشتم اولش فکر میک ردم واسه نویزه اما بعید میدونم چون خازن بارون کردم مدارو بعدش گفتم شاید چون پروسه رایت رو EEPROM زمان بیشتری از چند کلاک پالس میخواد باید بعد دستور رایت وقفه 10 میلی ثانیه بدم اما اینم نبود چون خود codevision توی هلپش چنین کاری رو پیشنهاد نمیکنه دوستان ممکنه راهنمایی کنن اگر کسی تو این زمینه تجربه داره ممنون میشم کمک کنه آیا نوشتن با تغییر دادن مقدار متغیر روش خاص و استانداردی داره که ممکنه من رعایت نکرده باشم ممنون میشم دوستان کمک کنند.
    سه کس را شنیدم که غیبت رواست وز این درگذشتی چهارم خطاست
    یکی پادشاهی ملامت پسند کز او بر دل خلق بینی گزند
    حلال است از او نقل کردن خبر مگر خلق باشند از او بر حذر
    دوم پرده بر بی حیائی متن که خود میآ‌درد پرده بر خویشتن
    ز حوضش مدار ای برادر نگاه که او میآ‌درافتد به گردن به چاه
    سوم کژ ترازوی ناراست خوی ز فعل بدش هرچه دانی بگوی

    #2
    پاسخ : eeprom در avr مقدار خود را بی دلیل از دست میدهد؟

    دوستان واقعا با این همه پاسخ ما رو شرمنده می کنند :smile:
    سه کس را شنیدم که غیبت رواست وز این درگذشتی چهارم خطاست
    یکی پادشاهی ملامت پسند کز او بر دل خلق بینی گزند
    حلال است از او نقل کردن خبر مگر خلق باشند از او بر حذر
    دوم پرده بر بی حیائی متن که خود میآ‌درد پرده بر خویشتن
    ز حوضش مدار ای برادر نگاه که او میآ‌درافتد به گردن به چاه
    سوم کژ ترازوی ناراست خوی ز فعل بدش هرچه دانی بگوی

    دیدگاه


      #3
      پاسخ : eeprom در avr مقدار خود را بی دلیل از دست میدهد؟

      سلام دوست من
      همونطور که اشاره کردید و طبق دیتا شیت هر بار نوشتن در EEprom حدود 8.5 میلی ثانیه طول میکشد

      ولی ظاهرا این نباید مشکل کار شما باشه
      شما تو برنامه چطوری از eeprom استفاده میکنی با روش آدرس دهی مستقیم وبا استفاده از رجیسترها یا با نوشتن eeprom char..... در برنامه؟
      فرزندم در راه است

      دیدگاه


        #4
        پاسخ : eeprom در avr مقدار خود را بی دلیل از دست میدهد؟

        سورس برنامه رو بزار ببینیم چی کار کردی ؟
        معجزه پس از معجزه می آید و شگفتی ها از تجلی باز نمی مانند.

        دیدگاه


          #5
          پاسخ : eeprom در avr مقدار خود را بی دلیل از دست میدهد؟

          سلام داداش خوبی؟ من کل سورسو اومدم بذارم خطا داد جون نزدیک به 2500 خط هست اما من نوع متغیر ها رو میذارم ببینی ببین کارم جایی مشکل داره ا نه؟


          این متغیر های من هستند:

          eeprom int eepInt_Temp_Ascending=-1,eepInt_Time2Add_Temp=0,eepInt_Humidity=65;
          eeprom unsigned char eepuCh_BackLight_Status=0;
          eeprom int IntTemp1=30,IntTemp2=36,IntTemp3=36,IntTemp4=38,In tTemp5=40,IntTemp6=40,IntTemp7=45;
          eeprom int IntTemp8=45,IntTemp9=48,IntTemp10=48,IntTemp11=50, IntTemp12=50,IntTemp13=70,IntTemp14=70;
          eeprom int IntTemp15=0,IntTemp16=0;
          eeprom int IntTime1=12,IntTime2=12,IntTime3=12,IntTime4=2,Int Time5=15,IntTime6=3,IntTime7=10,IntTime8=2;
          eeprom int IntTime9=3,IntTime10=2,IntTime11=10,IntTime12=10,I ntTime13=5,IntTime14=0,IntTime15=0;
          eeprom unsigned char Uch_Limit=1;

          اینم قسمتی از برنامه که دیتا میره رو eeprom:

          void Temp_Set(void)
          {
          unsigned char UchCursor=0,uChTemp1=0,uChTemp2=0,uChTime1=0,uChTi me2=0,;
          unsigned char IntCounter=0;
          char str_Temp_Time[]="00",str_Temp[]="00",str_Time[]="00";
          int int_temp=0;
          uch_TempTime_Number=1; // Default
          print_temp_time();

          while(1)
          {

          #asm ("wdr"
          delay_ms(150);
          IntCounter++;

          if (IntCounter>150)
          return;

          if (PIND!=0xF0)
          {
          IntCounter=0;
          Lcd_Light=ON;
          Lcd_Light_Counter=0;

          Beep_Out=ON;
          delay_ms(25);
          Beep_Out=OFF;
          delay_ms(25);
          ReadKey();
          }

          if (key==12) //ESC Key Press...
          {
          key=16;
          return;
          }

          if (key>=0 && key<10)
          {
          if (UchCursor==0)
          UchCursor=1;

          if (UchCursor==1)
          {
          UchCursor=2;
          lcd_gotoxy(8,0);
          lcd_putsf(" "

          uChTemp1=key;
          itoa(key,str_Temp_Time); // Convert int To String
          lcd_gotoxy(10,0);
          lcd_puts(str_Temp_Time);

          lcd_gotoxy(11,0);
          lcd_putsf("\x5f"
          }
          else
          if (UchCursor==2)
          {
          UchCursor=3;
          uChTemp2=key;
          itoa(key,str_Temp_Time); // Convert int To String
          lcd_gotoxy(11,0);
          lcd_puts(str_Temp_Time);

          lcd_gotoxy(10,1);
          lcd_putsf("\x5f"

          lcd_gotoxy(8,1);
          lcd_putsf("\x7e"

          }
          else
          if (UchCursor==3)
          {
          UchCursor=4;
          lcd_gotoxy(8,1);
          lcd_putsf(" "

          uChTime1=key;
          itoa(key,str_Temp_Time); // Convert int To String
          lcd_gotoxy(10,1);
          lcd_puts(str_Temp_Time);

          lcd_gotoxy(11,1);
          lcd_putsf("\x5f"
          }
          else
          if (UchCursor==4)
          {
          UchCursor=0;

          uChTime2=key;
          itoa(key,str_Temp_Time); // Convert int To String
          lcd_gotoxy(11,1);
          lcd_puts(str_Temp_Time);

          lcd_gotoxy(8,0);
          lcd_putsf("\x7e"
          }

          key=16;
          }

          if (key==13)
          {
          key=16;
          uch_TempTime_Number--;

          if (uch_TempTime_Number<1)
          uch_TempTime_Number=16;

          print_temp_time();
          }
          if (key==14)
          {
          key=16;
          uch_TempTime_Number++;

          if (uch_TempTime_Number>16)
          uch_TempTime_Number=1;

          print_temp_time();
          }

          if (key==10) // set key
          {
          // eepInt_Temp_Ascending=-1;
          key=16;
          lcd_clear();
          lcd_putsf("Saving..."
          delay_ms(1000);

          sprintf(str_Temp,"%i%i",uChTemp1,uChTemp 2);
          sprintf(str_Time,"%i%i",uChTime1,uChTime 2);


          if (uch_TempTime_Number==1)
          {

          IntTemp1=atoi(str_Temp); // Convert String To Integer
          IntTime1=atoi(str_Time); // Convert String To Integer
          }
          else
          if (uch_TempTime_Number==2)
          {
          int_temp=atoi(str_Temp);
          if (int_temp>=IntTemp1)
          {
          uch_TempTime_Number++;
          IntTemp2=int_temp; // Convert String To Integer
          IntTime2=atoi(str_Time); // Convert String To Integer
          }
          }
          else
          if (uch_TempTime_Number==3)
          {
          IntTemp3=atoi(str_Temp); // Convert String To Integer
          IntTime3=atoi(str_Time); // Convert String To Integer
          }
          else
          if (uch_TempTime_Number==4)
          {
          IntTemp4=atoi(str_Temp); // Convert String To Integer
          IntTime4=atoi(str_Time); // Convert String To Integer
          }
          if (uch_TempTime_Number==5)
          {
          IntTemp5=atoi(str_Temp); // Convert String To Integer
          IntTime5=atoi(str_Time); // Convert String To Integer
          }
          if (uch_TempTime_Number==6)
          {
          IntTemp6=atoi(str_Temp); // Convert String To Integer
          IntTime6=atoi(str_Time); // Convert String To Integer
          }
          if (uch_TempTime_Number==7)
          {
          IntTemp7=atoi(str_Temp); // Convert String To Integer
          IntTime7=atoi(str_Time); // Convert String To Integer
          }
          if (uch_TempTime_Number==8)
          {
          IntTemp8=atoi(str_Temp); // Convert String To Integer
          IntTime8=atoi(str_Time); // Convert String To Integer
          }
          if (uch_TempTime_Number==9)
          {
          IntTemp9=atoi(str_Temp); // Convert String To Integer
          IntTime9=atoi(str_Time); // Convert String To Integer
          }
          if (uch_TempTime_Number==10)
          {
          IntTemp10=atoi(str_Temp); // Convert String To Integer
          IntTime10=atoi(str_Time); // Convert String To Integer
          }
          if (uch_TempTime_Number==11)
          {
          IntTemp11=atoi(str_Temp); // Convert String To Integer
          IntTime11=atoi(str_Time); // Convert String To Integer
          }
          if (uch_TempTime_Number==12)
          {
          IntTemp12=atoi(str_Temp); // Convert String To Integer
          IntTime12=atoi(str_Time); // Convert String To Integer
          }
          if (uch_TempTime_Number==13)
          {
          IntTemp13=atoi(str_Temp); // Convert String To Integer
          IntTime13=atoi(str_Time); // Convert String To Integer
          }
          if (uch_TempTime_Number==14)
          {
          IntTemp14=atoi(str_Temp); // Convert String To Integer
          IntTime14=atoi(str_Time); // Convert String To Integer
          }
          if (uch_TempTime_Number==15)
          {
          IntTemp15=atoi(str_Temp); // Convert String To Integer
          IntTime15=atoi(str_Time); // Convert String To Integer
          }
          if (uch_TempTime_Number==16)
          {
          IntTemp16=atoi(str_Temp); // Convert String To Integer
          // IntTime16=atoi(str_Time); // Convert String To Integer
          }

          // uch_TempTime_Number++;

          if (uch_TempTime_Number>16)
          uch_TempTime_Number=1;

          print_temp_time();

          // Int_Minute_Counter=0;
          // eepInt_Temp_Ascending=0;
          // uCh_Second_Counter=0;

          // Uch_Limit=1; // neshan midahad ke aknun dar che gami gharar darim
          }
          }
          }

          آیا این مشکلی داره یا نداره؟ آیا توی این روش مقدار دهی متغیر ها باید delay داد یا خود کامپایلر میده؟ نوکرتم دادا کمک کن
          سه کس را شنیدم که غیبت رواست وز این درگذشتی چهارم خطاست
          یکی پادشاهی ملامت پسند کز او بر دل خلق بینی گزند
          حلال است از او نقل کردن خبر مگر خلق باشند از او بر حذر
          دوم پرده بر بی حیائی متن که خود میآ‌درد پرده بر خویشتن
          ز حوضش مدار ای برادر نگاه که او میآ‌درافتد به گردن به چاه
          سوم کژ ترازوی ناراست خوی ز فعل بدش هرچه دانی بگوی

          دیدگاه


            #6
            پاسخ : eeprom در avr مقدار خود را بی دلیل از دست میدهد؟

            سلام
            شما میتونید متغییرها را با استفاده از روش آدرس دهی در EEprom ذخیره کنید
            برای دسترسی به EEprom سه رجیستر موجود است:
            1)EEAR:رجیستر آدرس
            2)EEDR:رجیستر دیتا
            3)EECR:رجیستر کنترلی
            مثلا برای نوشتن در eeprom باید اول آدرس خونه ای که میخواهی توش دیتا بریزی در EEAR بزاری بعد در EEDR خود دیتا را بزاری و سپس فرمان را در دوخط EECR=2;
            و EECR=4: بدی به همین راحتی میتونی یه کاراکتر را در eeprom قرار بدی
            واسه خوندن هم باید آدرس را در EEAR بزاری و دستور read را بصورت EECR=1; بذی و مقدار EEDR را در یه کاراکتر ذخیره کنی
            اینجوری تو هر برنامه ای که بخواهی میتونی ای متغییرها را باآدرسشون بخونی
            فرزندم در راه است

            دیدگاه


              #7
              پاسخ : eeprom در avr مقدار خود را بی دلیل از دست میدهد؟

              آقا نوکرتم میشه یه کم واضح تو توضیح بدی من اینجوری نمیفهمم یا لطف کنی نمونه برننامه ای بزاری ببینم چه جوریاست؟ اگه لطف کنیئ ممنون میشم عزیزم :redface:
              سه کس را شنیدم که غیبت رواست وز این درگذشتی چهارم خطاست
              یکی پادشاهی ملامت پسند کز او بر دل خلق بینی گزند
              حلال است از او نقل کردن خبر مگر خلق باشند از او بر حذر
              دوم پرده بر بی حیائی متن که خود میآ‌درد پرده بر خویشتن
              ز حوضش مدار ای برادر نگاه که او میآ‌درافتد به گردن به چاه
              سوم کژ ترازوی ناراست خوی ز فعل بدش هرچه دانی بگوی

              دیدگاه


                #8
                پاسخ : eeprom در avr مقدار خود را بی دلیل از دست میدهد؟

                آقا تو رو خدا یکی نگاه کنه ببینه این روس مقدار دهی که من تو این برامه به کار بردم نیاز به DELAY داره یا نداره جون من بگید من بد جوری گرفتارشم فقط میخوام بدونم بعد قرار دادن مقدار در EEPR0M در CODEVISION به روشی که تو این برنامه استفاده کردم باید 10 میلی سانیه صبر کنم یا خود کامپایلر این کار رو انجام میده؟ لطفا راهنمایی کنید.
                سه کس را شنیدم که غیبت رواست وز این درگذشتی چهارم خطاست
                یکی پادشاهی ملامت پسند کز او بر دل خلق بینی گزند
                حلال است از او نقل کردن خبر مگر خلق باشند از او بر حذر
                دوم پرده بر بی حیائی متن که خود میآ‌درد پرده بر خویشتن
                ز حوضش مدار ای برادر نگاه که او میآ‌درافتد به گردن به چاه
                سوم کژ ترازوی ناراست خوی ز فعل بدش هرچه دانی بگوی

                دیدگاه


                  #9
                  پاسخ : eeprom در avr مقدار خود را بی دلیل از دست میدهد؟

                  سلام.
                  منم همین مشکلو دارم. از خیلی ها پرسیدم همین مشکلو دارن. دلایل زیادی داره.
                  نتیجه اینکه من و خیلی ها که دیدم واسه کارهای حساس به داده از eeprom 24xxx سریال استفاده میکنیم.
                  شرکتی که من کار میکنم بردهاشو از چین میاره. روی اون بردها هم eeprom 24xxx سریال هست و از داخلی استفاده نکرده.؟؟ :eek:

                  نوشته اصلی توسط ali_rk
                  سلام
                  شما میتونید متغییرها را با استفاده از روش آدرس دهی در EEprom ذخیره کنید
                  برای دسترسی به EEprom سه رجیستر موجود است:
                  1)EEAR:رجیستر آدرس
                  2)EEDR:رجیستر دیتا
                  3)EECR:رجیستر کنترلی
                  .................................................. .....
                  این تنها روش دسترسی به EEprom داخلی هست که CODEVISION هم از این روش استفاده میکنه.
                  مشکل از زمان رایت شدن دیتا و تاخیر نیست. خود CODEVISION یا هر کامپایلر و کتابخونه ای از چک کردن flag مربوطه استفاده میکنن.
                  حالا تجربه من اینه که موقع قطع و وصل تغذیه داده در EEprom عوض میشه.
                  شما احتمالا باید چک کنین که موقع rise time و fall time در تغذیه ، داده ای در EEprom نوشته نشه وگرنه در این زمان داده نا معتبر میشه .
                  ” تا سگ نشوی کوچه و بازار نگردی هرگز نشوی گرگ بیابان حقیقت”

                  دیدگاه


                    #10
                    پاسخ : eeprom در avr مقدار خود را بی دلیل از دست میدهد؟

                    با سلام به همه دوستان عزیز :icon_razz:

                    من هم جزء کسانی بودم که این مشکل رو داشتم.البته من با BASCOM کار می کنم.
                    هر وقت یه اطلاعاتی رو می خواستم تو EEPROM بریزم ؛بعد از ریست شدن سیستم فقط اطلاعات خونه اول حافظه قابل دسترسی بود و بقیه خونه ها صفر نشون می داد.
                    بعدش اومدم بجای اینکه از روش آدرس دهی مستقیم استفاده کنم ؛متغیرهامو بصورت ERAM تعریف کردم و مشکل حل شد.
                    به بزرگواری خودتون ببخشید که من C بلد نیستم.ولی اگه تو C هم شما از روش آدرس دهی استفاده می کنید می تونید این روش رو امتحان کنید.

                    نمونه برنامه :
                    DIM A AS BYTE
                    A=xx
                    writeeeprom a,5

                    به این صورت اطلاعات a تو خونه پنجم نوشته می شه.که همونطوری که گفتم در این حالت میکرو گیج میزنه

                    DIM A AS ERAM BYTE
                    DIM B AS BYTE
                    B=xx
                    A=B
                    و در این حالت دیگه مشکل حل میشه :biggrin:

                    بازم به بزرگواری خودتون ببخشید که من C بلد نیستم
                    موفق باشید :bye

                    دیدگاه

                    لطفا صبر کنید...
                    X