اطلاعیه

Collapse
No announcement yet.

خواندن و نوشتن در حافظه

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

    خواندن و نوشتن در حافظه

    باسلام
    یه برنامه باید بنویسم که تو اون چهار تا عدد در حافظه نوشته بشه و بعد هم از اون خونده شو د تو کتاب علی کاهه زیاد مطلب در رابطه با اون ندیدم البته یه چیزی هایی بود که من از اون سر در نیاوردم :
    مثلا اینکه چطوری حافظه آدرس دهی می شود
    چرا یک عدد به دو قسمت باارزش و کم ارزش شکسته میشه و چطور این کار انجام میشه
    از دوستان کسی ی تونه من رو در این زمینه راهنمایی کنه
    با تشکر

    #2
    پاسخ : خواندن و نوشتن در حافظه

    به نام خدا oo: oo: oo: oo: oo: oo:

    دوست من شما باید از دستورات Writeeeprom و readeeprom استفاده کنید که عددهاتون رو توی حافظه غیرفرار بنویسید.
    به این صورت که :



    writeeeprom a,1

    waitms 10

    این باعث میشه که متغیر a در خانه یک حافظه نوشته بشه

    حالا


    readeeprom a,1


    این دستور هم باعث میشه که در ادرس 1 هرچی هست توی متغیر a قرار بگیره

    امید وارم درست گفته باشم oo:
    به نام خدا

    دیدم آن چشمه ی هستی که جهانش خوانند

    _-_-_-_-_-_-_-_-
    آنقدر آب کزان دست توان شست نداشت به به به به

    دیدگاه


      #3
      پاسخ : خواندن و نوشتن در حافظه

      خانه های حافظه در AVR هشت بیتی هستند. پس اگه قرار باشه یه مقدار 16 بیتی تو حافظه ذخیره بشه باید به دو قسمت هشت بیت کم ارزش و پر ارزش تبدیل بشه بعد تو دو خونه پشت سر هم ذخیره بشه.
      از اون طوف وقتی می خوای یه عدد 16 بیتی رو از حافظه بخونی کافیه متغیری که قراره محتوای آدرس توش ریخته بشه , WORD یا INTEGER تعریف کنی. این طوری مشخص میشه که تعداد خونه های حافظه ای که قراره خونده بشه دو تاست.

      دیدگاه


        #4
        پاسخ : خواندن و نوشتن در حافظه

        نوشته اصلی توسط ba_maram_shiraz
        به نام خدا oo: oo: oo: oo: oo: oo:

        دوست من شما باید از دستورات Writeeeprom و readeeprom استفاده کنید که عددهاتون رو توی حافظه غیرفرار بنویسید.
        به این صورت که :



        writeeeprom a,1

        waitms 10

        این باعث میشه که متغیر a در خانه یک حافظه نوشته بشه

        حالا


        readeeprom a,1


        این دستور هم باعث میشه که در ادرس 1 هرچی هست توی متغیر a قرار بگیره

        امید وارم درست گفته باشم oo:
        با سلام
        ممنون از راهنمایی مشکلی تو دستورات ندارم آدرس ها رو متوجه نمی شوم چطور باید بدم
        مثلا خونه های بعدی چه آدرسی دارند ؟ آیا اینجوری باید بنویسم 00000010

        دیدگاه


          #5
          پاسخ : خواندن و نوشتن در حافظه

          موقع تعریف کردن متغیر اون رو از نوع Erom انتخاب کن تا کارت راحت بشه.مثلا

          dim a as eram byte

          موقع استفاده دیگه مثل متغیرهای عادی از اون استفاده می کنی البته باید یه فرصتی برای نوشته شدنش تو EEPROM به میکرو بدی.

          a=10
          waitms 10

          فکر کنم اینجوری راحت تره. :wow:
          عمر گران میگذرد خواهی نخواهی سعی بر آن کن نرود رو به تباهی
          مطلب دل را طلب از سوی خدا کن زآنکه بود رحمت او لا یتناهی

          دیدگاه


            #6
            پاسخ : خواندن و نوشتن در حافظه

            سلام
            البته همین جور که دوستان گفتند برای این کار می توان از دستورات Writeeeprom و readeeprom استفاده کرد ولی فکر می کنم بهترین روش همون معرفی کردن متغییر به صورت EEPROM است که دیگه احتیاجی نیست فکرتون رو مشغول کنید که متغییرتون از چه نوعی است، کجای حافظه ذخیره شده و بایت MSB اول ذخیره میشه تو حافظه یا LSB ؟
            ساده می نویسم :
            Dim Var as eram type
            که در آن VAR متغییر شما و type نوع متغییر است. حال دیگر براحتی هر مقداری را در Var می نویسیم و یا از آن می خوانیم. فقط باید محدودیت EEPROM داخلی میکرو رو در نظر گرفت که بیشتر از حد مجاز نشود. که اگر به حافظه بیشتری احتیاج داشتید بسته به مقدار حجم مورد نیاز شما راه حل های دیگری وجود دارد که اگر لازم شد در موردش صحبت می کنیم که البته در این مثالی که شما گفتید اگر اشتباه نکنم 4 عدد از نوع word بودن که قطعا از لحاظ حجمی مشکل نخواهید داشت.
            اگر باز هم تو این زمینه مشکل داشتید پروژه اصلی رو دقیقا تشریح کنید تا من فایل شبیه سازی شده پروژه همراه با سورس برنامه رو براتون بگذارم، یا اینکه شما بگذارید تا شاید من و یا دیگر دوستان متوجه مشکل برنامه شما بشیم.
            موفق باشید.
            سعی نکن انسان موفقی باشی بلکه سعی کن انسان ارزشمندی باشی. آلبرت انیشتین

            دیدگاه


              #7
              پاسخ : خواندن و نوشتن در حافظه

              نوشته اصلی توسط احمد رضا لیاقت
              سلام
              البته همین جور که دوستان گفتند برای این کار می توان از دستورات Writeeeprom و readeeprom استفاده کرد ولی فکر می کنم بهترین روش همون معرفی کردن متغییر به صورت EEPROM است که دیگه احتیاجی نیست فکرتون رو مشغول کنید که متغییرتون از چه نوعی است، کجای حافظه ذخیره شده و بایت MSB اول ذخیره میشه تو حافظه یا LSB ؟
              ساده می نویسم :
              Dim Var as eram type
              که در آن VAR متغییر شما و type نوع متغییر است. حال دیگر براحتی هر مقداری را در Var می نویسیم و یا از آن می خوانیم. فقط باید محدودیت EEPROM داخلی میکرو رو در نظر گرفت که بیشتر از حد مجاز نشود. که اگر به حافظه بیشتری احتیاج داشتید بسته به مقدار حجم مورد نیاز شما راه حل های دیگری وجود دارد که اگر لازم شد در موردش صحبت می کنیم که البته در این مثالی که شما گفتید اگر اشتباه نکنم 4 عدد از نوع word بودن که قطعا از لحاظ حجمی مشکل نخواهید داشت.
              اگر باز هم تو این زمینه مشکل داشتید پروژه اصلی رو دقیقا تشریح کنید تا من فایل شبیه سازی شده پروژه همراه با سورس برنامه رو براتون بگذارم، یا اینکه شما بگذارید تا شاید من و یا دیگر دوستان متوجه مشکل برنامه شما بشیم.
              موفق باشید.
              سلام
              شرمنده دیر جواب دادم
              من متغییر رو از نوع Eram تعریف کردم مشکلی تو برنامه نیست اما وقتی می خواهم از دستور lcd برای نمایش اون استفده کنم خطا می دهد
              خطای شماره 42( تو بیسکام) 42
              Numeric parameter expected
              مشکل از کجا می تواند باشد

              دیدگاه


                #8
                پاسخ : خواندن و نوشتن در حافظه

                سلام
                در مورد مشکل اخیر بهتره کدت رو هم بذاری.
                در دستورهای Writeeeprom و Readeeprom آدرس دهی به صورت عدد دسیماله و لازم نیست درگیر تبدیلها بشی. مثل کد زیر:
                کد:
                Writeeeprom S , 114
                که میره تو خونه 114 متغیره S رو مینویسه.همچنین می شه این کار رو هم کرد:
                کد:
                Writeeeprom S , Ad
                که در کد بالا Ad متغیریه از نوع WORD و براحتی میتونی به اون مقدار بدی و هر جای حافظه که خواستی بنویسی. یک نکته دیگه اینکه بر خلاف اینکه تو کتاب مهندس کاهه نوشته لازم نیست تا بعد از دستور Writeeeprom تاخیر در روند اجرای برنامه بندازیم. چون خود بسکام کاملا از این دستور محافظت میکنه. اولا اینکه به محض رسیدن به این دستور تمام اینتراپتها غیر فعال میشن و بعد از اجرا دوباره به صورت خودکار فعال میشن و ازلحاظ واحد دستورات بسکام، تا این دستور اجرا نشه، دستورهای بعدی رو اجرا نمیکنه. یک نکته دیگه هم بگم که تو Help بسکام بهش اشاره کرده و اون اینکه هیچ وقت در خونه صفر E2PROM چیزی نوشته نشه چرا که بر اساس مستندهای Atmel ممکنه در Reset شدن میکروکنترلر، این خونه هم تغییر کنه.
                موفق باشی

                دیدگاه


                  #9
                  پاسخ : خواندن و نوشتن در حافظه

                  با سلام
                  منم با شما موافقم _e_ جان
                  قبلاً که تو مثالهایه خود کامپایلر بسکام دقت کرده بودم اثری از دستور wait بعد از دستور writeeeprom ندیدم.
                  گیرم گلاب ناب شما اصل قمصر است/اما چه سود، حاصل گلآ‌های پرپر است!-از آن زمان که آیینهآ‌گردان شب شُدید*آیینه دل از دَم دوران مکدر است-وقتی بهار، وصله ناجور فصلآ‌هاست*وقتی تبر، مدافع حق صنوبر است-وقتی به دادگاه عدالت، طناب دار*بر صدر میآ‌نشیند و قاضی و داور است-از من مخواه شعرِ تر، ای بیآ‌خبر ز درد!*شعری که خون از آن نچکد ننگ دفتر است!-ای از تبار هرچه سیاهی، سرشتآ‌تان*رنگ جهنم است تمام بهشتآ‌تان
                  "گزیده ابیاتی چند از بیداد خراسانی"

                  دیدگاه


                    #10
                    پاسخ : خواندن و نوشتن در حافظه

                    نوشته اصلی توسط _e_
                    سلام
                    در مورد مشکل اخیر بهتره کدت رو هم بذاری.
                    با سلام
                    اینم کدها:
                    [left]]
                    کد:
                    $regfile = "m32def.dat"
                    $crystal = 1000000
                    Config Timer1 = Timer , Prescale = 1024
                    Enable Interrupts
                    Enable Ovf1
                    On Ovf1 Export_time
                    Config Spi = Hard , Interrupt = Off , Data Order = Lsb , Master = No , _
                    Polarity = High , Phase = 0 , Clockrate = 128
                    Ddra = 0 : Porta = 225
                    Config Portc = Output : Config Portd = Output
                    Ddrb.0 = 0 : Portb.0 = 1
                    Ddra.0 = 0 : Porta.0 = 1
                    Ddrb.1 = 0 : Portb.1 = 1
                    Ddrb.2 = 0 : Portb.2 = 1
                    Ddrb.3 = 0 : Portb.3 = 1
                    Config Lcdpin = Pin , Db4 = Pina.4 , Db5 = Pina.5 , Db6 = Pina.6 , Db7 = Pina.7_
                     , Rs = Pina.3 , E = Pina.2
                    Config Lcd = 16 * 2
                    Dim A As Byte : Dim B As Byte
                    Dim A0 As Eram Byte : Dim B0 As Eram Byte
                    Dim A1 As Eram Byte : Dim B1 As Eram Byte
                    Spiinit
                    Do
                      If B.0 = 0 Then
                       Incr A
                       Locate 1 , 1
                       Lcd "stepper right=" ; A
                      End If
                      If B.1 = 0 Then
                       Decr A
                       Locate 1 , 1
                       Lcd "stepper right=" ; A
                      End If
                      If B.2 = 0 Then
                       Incr B
                       Locate 2 , 1
                       Lcd "stepper right=" ; B
                      End If
                      If B.3 = 0 Then
                       Decr B
                       Locate 2 , 1
                       Lcd "stepper right=" ; B
                      End If
                      If A.0 = 0 Then
                       If A0 <> A Then A1 = A
                       If B0 <> B Then B1 = B
                       lcd a0
                      End If
                    Loop
                    End
                    Export_time:
                    Spiout A , 1
                    Lcd "vvvvvvvvvv"
                    Return
                    left]]
                    شرمنده به بیسکام دسترسی ندارم تا خطا رو بگم اما هنگام نمایش a0 خطا می دهد

                    دیدگاه


                      #11
                      پاسخ : خواندن و نوشتن در حافظه

                      سلام
                      متاسفانه و البته به احتمال این هم همون مشکل قدیمی کامپایلر بسکامه که قادر به ارزشیابی چندین دستور یک جا با هم نیست. حالا با این چیزا کاری نداریم. ولی یک متغیر موقتی مثل Temp تعریف کن و اول A0 رو بریز تو اون بعد مقدار Temp رو Lcd کن.
                      موفق باشی

                      دیدگاه


                        #12
                        پاسخ : خواندن و نوشتن در حافظه

                        نوشته اصلی توسط _e_
                        سلام
                        متاسفانه و البته به احتمال این هم همون مشکل قدیمی کامپایلر بسکامه که قادر به ارزشیابی چندین دستور یک جا با هم نیست. حالا با این چیزا کاری نداریم. ولی یک متغیر موقتی مثل Temp تعریف کن و اول A0 رو بریز تو اون بعد مقدار Temp رو Lcd کن.
                        موفق باشی
                        با سلام
                        منظورتون رو متوجه نمی شوم
                        مگه بعضی دستورات زیر دستور ندارند پس چه طور نمی تونه چند دستور رو با هم اجرا کنه
                        در ضمن متغییر موقت رو از چه نوعی تعریف کنم به فکرم رسیده غیر از eram تعریف کنم اما ظاهرا باید نگاهی هم به رم داشته باشم آخه این برنامه یه جزئی از اصلیه و بعد از اینکه فهید مقدار a0زیاد شده یا کم همینطورb0 وارد چهار زیر برنامه می شه و عدد باینری یه پورت رو می خونه و او نو شیفت میده (می خواهم استپر موتور رو بچرخونم منتها از یک مقدار مشخص که از گردش قبل در حافظه مونده)

                        دیدگاه


                          #13
                          پاسخ : خواندن و نوشتن در حافظه

                          سلام
                          منظور اینه که به طور مثال فرض کن که یه تابع تعریف کردی به نام Test با یه پارامتر ورودی از نوع بایت و به صورت Byval. این تابع رو باید به صورت زیر فراخوانی کنی:
                          کد:
                          Call Test(a)
                          حالا اگر همین تابع رو به صورت
                          کد:
                          Call Test(a+1)
                          فراخوانی کنی اونوقت کامپایلر اول باید a بعد از اینکه از حافظه کشید یه واحد بهش اضافه کنه و بعد بع تابع پاس بده که Error میده تو زمان کامپایل.
                          در مورد کد منظورم این بود که اول حلقه Do-Loop مقادیر a0 و b0 رو بریز تو متغیرهای از نوع SRAM مثل Tempa و Tempb. بعد اونارو استفاده کن. مثل زیر:
                          کد:
                          dim tempa as byte
                          dim tempb as byte
                          :
                          do
                          Tempa=a0
                          tempb=b0
                          موفق باشی

                          دیدگاه

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