اطلاعیه

Collapse
No announcement yet.

خواندن و نوشتن در EEPROM

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

    خواندن و نوشتن در EEPROM

    سلام به همه دوستان
    من یه برنامه نوشتن به زبون C و با کامپایلر C18 توی MPLABX با میکروی PIC18F67K22 هم کار میکنم
    که توی آدرسی از EEPROM بنویسه و بخونه توی پروتئوس تست کردم مشکلی نداره روی میکرو هم ریختم اگر اول بنویسم و بعد بخونم کار میکنه
    ولی وقتی که تغذیه مدارو قطع میکنم و فقط بخونم 0xFF میخونه
    یعنی Data با قطع برق پاک میشه
    برنامه رو میذارم دوستان لطف کنن ببینن مشکل کار چییه؟

    کد:
    /* 
     * File:  EEPROM.c
     * Author: Hoax B0Y
     *
     * Created on January 31, 2013, 10:43 AM
     */
    #include <p18f67k22.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "EEPROM_RW.h"
    
    #pragma config RETEN = OFF
    #pragma config INTOSCSEL = HIGH
    #pragma config SOSCSEL = DIG
    #pragma config FOSC = INTIO2
    #pragma config PLLCFG = OFF
    #pragma config FCMEN = OFF
    #pragma config IESO = OFF
    #pragma config BORPWR = HIGH
    #pragma config RTCOSC = INTOSCREF
    #pragma config DEBUG = ON
    #pragma config PWRTEN = OFF
    #pragma config BOREN = OFF
    #pragma config WDTEN = OFF
    #pragma config XINST = OFF
    
    unsigned char c;
    void main()
    {
      OSCCON = 0x72;
      OSCTUNE |= 0x20;
      
      Nop();
      //EEPROM_Write(0,0x10,0x6D); //Write 0x34 to EEPROM address 0x12
      Nop();
      Nop();
      c = EEPROM_Read(0,0x10); // Read EEPROM address 0x12 in to variable C
    
      while (1)
      {
      }
    }

    کد:
    /* 
     * File:  EEPROM_RW.h
     * Author: Hoax B0Y
     *
     * Created on January 31, 2013, 10:48 AM
     */
    
    void EEPROM_Write(unsigned char addh,unsigned char addl, unsigned char W_Data);
    unsigned char EEPROM_Read(unsigned char addh,unsigned char addl);
    //This function Writes data to given address in internal EEPROM of PIC MCU
    
    void EEPROM_Write(unsigned char addh,unsigned char addl, unsigned char W_Data)
    {
      unsigned char INTCON_SAVE;
    
      EEADRH = addh;
      EEADR = addl;
      EEDATA = W_Data;
    
      EECON1bits.EEPGD= 0; // 0 = Access data EEPROM memory
      EECON1bits.CFGS = 0; // 0 = Access Flash program or DATA EEPROM memory
      EECON1bits.WREN = 1; // enable writes to internal EEPROM
      PIR6bits.EEIF=0; //Clear EEPROM write complete flag.
    
      INTCON_SAVE=INTCON; // Save INTCON register contants
      INTCON=0;       // Disable interrupts, Next two lines SHOULD run without interrupts
    
      EECON2=0x55;    // Required sequence for write to internal EEPROM
      EECON2=0xaa;    // Required sequence for write to internal EEPROM
    
      EECON1bits.WR=1;  // begin write to internal EEPROM
      INTCON=INTCON_SAVE; //Now we can safely enable interrupts if previously used
    
      Nop();
    
      while (~PIR6bits.EEIF);//Wait till write operation complete
    
    
      EECON1bits.WREN=0; // Disable writes to EEPROM on write complete (EEIF flag on set PIR2 )
      PIR6bits.EEIF=0; //Clear EEPROM write complete flag. (must be cleared in software. So we do it here)
    
    }
    // This function reads data from address given in internal EEPROM of PIC
    unsigned char EEPROM_Read(unsigned char addh,unsigned char addl)
    {
      EEADRH = addh;
      EEADR = addl;
      EECON1bits.EEPGD= 0; // 0 = Access data EEPROM memory
      EECON1bits.CFGS = 0; // 0 = Access Flash program or DATA EEPROM memory
      EECON1bits.RD  = 1; // EEPROM Read
      Nop();
      Nop();
      return EEDATA;    // return data
    }
    درایور شبکه و nRF24L01
    کاتالوگ محصولات
    کنترلر CNC شش محوره برای پرینتر 3D و Pick n Place
    شبیه ساز تک تیرانداز و سیبل دیجیتال با پردازش تصویر
    فروش اسیلوسکوپ GWinstek GOS-630FC

    #2
    پاسخ : خواندن و نوشتن در EEPROM

    سلام


    من با eeprom داخلی در کامپایلر C18 کار نکردم اما شما مطمئن هستید که بعد از نوشتن در این حافظه دوسیکل صبر کردن کافیه ؟!.. ( NOP )
    نا امیدی یه دروغ بزرگه که آدما به خودشون میگن
    تلاش یه حقیقت بزرگه که با صبر به ثمر میرسه

    دیدگاه


      #3
      پاسخ : خواندن و نوشتن در EEPROM

      نوشته اصلی توسط ramezani.t
      سلام


      من با eeprom داخلی در کامپایلر C18 کار نکردم اما شما مطمئن هستید که بعد از نوشتن در این حافظه دوسیکل صبر کردن کافیه ؟!.. ( NOP )
      سلام
      مرسی که باز شما زحمت کشیدیو جواب دادی
      ببین دوست عزیز من اینجا while که نوشتم منتظر میمونم تا کارش تموم شه و توی این فاصله هیچکار نمیکنم

      کد:
        EECON1bits.WR=1;  // begin write to internal EEPROM
        INTCON=INTCON_SAVE; //Now we can safely enable interrupts if previously used
      
        Nop();
      
        [color=red]while (~PIR6bits.EEIF);//Wait till write operation complete[/color]
      
      
        EECON1bits.WREN=0; // Disable writes to EEPROM on write complete (EEIF flag on set PIR2 )

      این تا کارش تموم نشه و نوشتن کامل نشه اصلا اجازه ادامه برنامه رو نمیده
      و حتی وقتی برنامه رو خط به خط اجرا میکنم کلی زمان بین خطوط تلف میشه و بنظرم نباید بیش از اینا طول بکشه
      درایور شبکه و nRF24L01
      کاتالوگ محصولات
      کنترلر CNC شش محوره برای پرینتر 3D و Pick n Place
      شبیه ساز تک تیرانداز و سیبل دیجیتال با پردازش تصویر
      فروش اسیلوسکوپ GWinstek GOS-630FC

      دیدگاه


        #4
        پاسخ : خواندن و نوشتن در EEPROM

        سلام
        مقدار 255 یا همان FF را تنها در موقعی دریافت خواهید کرد که داده ای در EEPROM نوشته نشده باشد یا به هر دلیلی این مقدار از بین رفته باشد.
        while (PIR2bits.EEIF==0)
        {
        Nop();
        }

        این خط را جایگزین کنید چون در هنگام نوشتن برای پی بردن به خطا بعضی از متغییرها تغییر وضعیت نمی دهند اما مقداری خاص را دریافت می کنند.مهمترین فاکتوری که باید مد نظر داشت trace کردن خطاها در حین نوشتن هست در حالتی که داده ای بر روی EEPROM می خواین بنویسید طبق دستورات خودتان باید ابتدا متغییرهای زیر را صفر کنید
        EECON1bits.EEPGD= 0; // 0 = Access data EEPROM memory
        EECON1bits.CFGS = 0; // 0 = Access Flash program or DATA EEPROM memory
        اما وقتی این متغییرهای مقداری برابر با یک داشته باشند از یک شدن بیت RD جلوگیری می کنند و این بدان معناست که اجازه خواندن را نمی دهند و بابت همین هست که شما در ابتدا مجبور هستین این ریجسترها را صفر کنید.
        پیشنهاد می کنم بعد از نوشتن داده و اجرا این تابع مقدارهای مختلف ریجستر EECON1 را بررسی کنید از ببینید در هنگام نوشتن خطا دارید یا خیر؟به عنوان مثال با بررسی بیت WRERR و ریجسترها بالا.
        هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

        دیدگاه


          #5
          پاسخ : خواندن و نوشتن در EEPROM

          نوشته اصلی توسط baby_1
          سلام
          مقدار 255 یا همان FF را تنها در موقعی دریافت خواهید کرد که داده ای در EEPROM نوشته نشده باشد یا به هر دلیلی این مقدار از بین رفته باشد.
          while (PIR2bits.EEIF==0)
          {
          Nop();
          }

          این خط را جایگزین کنید چون در هنگام نوشتن برای پی بردن به خطا بعضی از متغییرها تغییر وضعیت نمی دهند اما مقداری خاص را دریافت می کنند.مهمترین فاکتوری که باید مد نظر داشت trace کردن خطاها در حین نوشتن هست در حالتی که داده ای بر روی EEPROM می خواین بنویسید طبق دستورات خودتان باید ابتدا متغییرهای زیر را صفر کنید
          EECON1bits.EEPGD= 0; // 0 = Access data EEPROM memory
          EECON1bits.CFGS = 0; // 0 = Access Flash program or DATA EEPROM memory
          اما وقتی این متغییرهای مقداری برابر با یک داشته باشند از یک شدن بیت RD جلوگیری می کنند و این بدان معناست که اجازه خواندن را نمی دهند و بابت همین هست که شما در ابتدا مجبور هستین این ریجسترها را صفر کنید.
          پیشنهاد می کنم بعد از نوشتن داده و اجرا این تابع مقدارهای مختلف ریجستر EECON1 را بررسی کنید از ببینید در هنگام نوشتن خطا دارید یا خیر؟به عنوان مثال با بررسی بیت WRERR و ریجسترها بالا.
          آقا این کار مشکلو حل نکرد
          ببین من میخوام مثلا چنتا متغییر که دارم توی EEPROM باشن و اگر تغییر کردن Update بشن و هر وقت میکرو خاموش شد با آخرین وضعیت این متغییر ها بیاد بالا
          مثل AVR نمیشه متغییری رو از نوع EEPROM تعریف کرد و خودش این کارو بکنه؟!
          نمیخوام اصلا درگیر این چیزاش بشم
          میخوام بنویسم
          unsigned char eeprom a = 0;
          اینجوری نمیشه؟!
          درایور شبکه و nRF24L01
          کاتالوگ محصولات
          کنترلر CNC شش محوره برای پرینتر 3D و Pick n Place
          شبیه ساز تک تیرانداز و سیبل دیجیتال با پردازش تصویر
          فروش اسیلوسکوپ GWinstek GOS-630FC

          دیدگاه


            #6
            پاسخ : خواندن و نوشتن در EEPROM

            سلام
            تعریفهای خاص برای dataype های مختلف بسته به نوع کامپایلر بوده و نهایتا شاهد هستیم که در کامپایلری دستورات چنینی وجود دارد اما کامپایلرهای دیگر خیر ، به عنوان مثال در خانواده avr در برنامه Bascom چنین دستوراتی وجود دارد اما در کامپایلر C18 میکروچیپ باید از توابع دیگر که چه توسط خود کاربر یا دیگر کاربران نوشته شده است استفاده کرد.

            یک سوال : هنگام نوشتن اینتراپتها فعال هستن ؟اگر بله ، در ابتدای تابع اینتراپتها را غیرفعال و سپس سعی در نوشتن داده بر روی چیپ کنید
            هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

            دیدگاه


              #7
              پاسخ : خواندن و نوشتن در EEPROM

              نوشته اصلی توسط baby_1
              سلام
              تعریفهای خاص برای dataype های مختلف بسته به نوع کامپایلر بوده و نهایتا شاهد هستیم که در کامپایلری دستورات چنینی وجود دارد اما کامپایلرهای دیگر خیر ، به عنوان مثال در خانواده avr در برنامه Bascom چنین دستوراتی وجود دارد اما در کامپایلر C18 میکروچیپ باید از توابع دیگر که چه توسط خود کاربر یا دیگر کاربران نوشته شده است استفاده کرد.

              یک سوال : هنگام نوشتن اینتراپتها فعال هستن ؟اگر بله ، در ابتدای تابع اینتراپتها را غیرفعال و سپس سعی در نوشتن داده بر روی چیپ کنید
              بله فعال هست ولی همانطور که توی برنامه نوشتم

              INTCON_SAVE=INTCON; // Save INTCON register contants
              INTCON=0; // Disable interrupts, Next two lines SHOULD run without interrupts

              همه INTCON رو 0 میکنم که هیچ اینتراپتی فعال نباشه و GIE هم 0 میشه کلا خلاص :biggrin:

              INTCON=INTCON_SAVE; //Now we can safely enable interrupts if previously used
              اینجا هم برشون میگردونم به حالت اولیه که بودن
              همه چی به نطر درسته حتی اگه میکرو خاموش روشن نشه دیتا رو هزار بار هم از EEPROM بخونی درسته
              ولی میکرو خاموش روشن میشه 0xFF میخونه همش :sad:
              درایور شبکه و nRF24L01
              کاتالوگ محصولات
              کنترلر CNC شش محوره برای پرینتر 3D و Pick n Place
              شبیه ساز تک تیرانداز و سیبل دیجیتال با پردازش تصویر
              فروش اسیلوسکوپ GWinstek GOS-630FC

              دیدگاه


                #8
                پاسخ : خواندن و نوشتن در EEPROM

                سلام
                آقای بسطامی من قبلا با EEPROM ها با آدرسدهی های یک بایتی(مثل pic18f452 , ...) که کار کردم به خوبی و بدون مشکلی جواب می دادن و چون دیدم مقدار EEPROm تراشه شما آدرس دهیش دو بایتی هست تراشه ای رو انتخاب کردم که همچین فضای زیادی برای EEPROm داشته باشه که با تست برنامه و کلی ریست و خاموش کردن مشکلی رو ندیدم یعنی توابعتون بدون مشکل کار می کند ، حالا دقیقا باز شما مشکل رو ریشه یابی کنید ان شالله که ما هم از شما یاد بگیریم

                البته در توضیحات قبلی یه اشتباه عددی کرده بودم که همین جا بگم خط
                کد:
                while (PIR4bits.EEIF==1);//Wait till write operation complete
                رو باید عدد یک می دادین که من گفتم صفر کنید چون اصلا حواسم نبود قبلش صفر شده بود و باید یک می شد (البته باز این هم ذکر کنم که در تراشه من EEIF در ریجستر PIR4 هست که بر خلاف تراشه شما که در PIR6 قرار دارد )
                هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                دیدگاه

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