اطلاعیه

Collapse
No announcement yet.

کار با حافظه SRAM داخلی میکرو زبان سی

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

    کار با حافظه SRAM داخلی میکرو زبان سی

    سلام.

    من تازه می خوام برنامه نویسی سی رو یاد بگیرم. میشه لطف کنید و بگید که چطور یه دیتایی رو تو Sram ذخیر کنم و دوباره بخونم و تغییرش بدم./

    مثلاً تو آدرس 20 هگز یه دیتایی رو ذخیره کنه و بخونه؟ :smile:

    #2
    پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

    اگر منظور شما استاده از codevision جهت برنامه نویسی است .در این کامپایلر از کلمه کلیدی flash و یا const برای متغیر های ثابت استفاده می شود و eeprom هم برای متغییر های داخل eeprom و برای sram هم نیازی نیست به چیزی و به طور عادی و پیش رض این حافظه را در نظر می گیرد . خوب حالا برای چی شما میخواهی در مکانی خاص از حافظه داده را قرار دهی.

    دیدگاه


      #3
      پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

      سلام و ممنون از جوابتون ... چه سریع!

      همینطوری مخام کار با حافظه ها رو یاد بگیرم.

      آره با کد ویژن منظورمه . میشه یه مثال بزنی./

      مثلاً متغیر a از نوع char رو توی ادرس 20 هگز حافظه sram ذخیره کن و یه بارم بخونش./

      دیدگاه


        #4
        پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

        خوب اساسا شما داری با یک زبانی برنامه می نویسی که مثل اسمبلی دیگه کمتر نیاز به ادرس دهی و نگه داری و رعایت شماره جایگری متغیر در حافظه رو داشته باشی و این کار رو خود کامپایلر انجام می ده . مگر در شرایط خاص .
        کد:
          
        flash char a='s'; 
        eeprom char a='s';
        char a= 's';

        دیدگاه


          #5
          پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

          در زبان برنامه نویسی C و در کدویژن برای ذخیره متغییر های سراسری در آدرسی مشخص از حافظه ی SRAM باید به صورت زیر عمل کنیم:

          ;آدرس محل @ نام متغییر نوع

          مثلا

          ;cahr a @ 0x20


          توجه کن توجه کن!!
          در صورتی که به صورت بالا عمل نکنی و به این صورت بنویسی:

          ;cahr a

          در این صورت بسته به این که متغییر به صورت سراسری تعریف شده باشد یا محلی مکان ذخیره شدن متغییر در حافظه ی SRAM نیز متفاوت میباشد.
          [glow=red,2,300]گرد هم آمدن شروع است.با هم ماندن پيشرفت است.با هم کار کردن موفقيت است.[/glow]
          [img width=98 height=100]http://s3.picofile.com/file/7407857311/icon3.png[/img]

          دیدگاه


            #6
            پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

            نوشته اصلی توسط حمیدجان
            در زبان برنامه نویسی C و در کدویژن برای ذخیره متغییر های سراسری در آدرسی مشخص از حافظه ی SRAM باید به صورت زیر عمل کنیم:

            ;آدرس محل @ نام متغییر نوع

            مثلا

            ;cahr a @ 0x20


            توجه کن توجه کن!!
            در صورتی که به صورت بالا عمل نکنی و به این صورت بنویسی:

            ;cahr a

            در این صورت بسته به این که متغییر به صورت سراسری تعریف شده باشد یا محلی مکان ذخیره شدن متغییر در حافظه ی SRAM نیز متفاوت میباشد.

            سلام وممنون از راهنمایی که فرمودین .دقیقاً اون چیزی بود که می خواستم ومنظورم بود. فقط حالا چطور از این مکان بخونم . یه مثالم واسه خوندن از محل بزنید.ممنون

            دیدگاه


              #7
              پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

              دوست عزیز برای خواندن اطلاعات از مکان خاصی از حافظه های RAM ، Flash و EEPROM باید از اشارگر ها
              ( pointers) استفاده کنیم.

              اشاره گر متغییریه که به جای مقدار یک قلم داد ، محل یا آدرس اون را معرفی میکنه . در واقع مقدار اون آدرس یک حافظه هست.

              به عبارت دیگر اشاره گر متغییریه که آدرس متغییر دیگری را در خود نگه میداره.

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

              }()main

              ;int y,*z
              ;z=&a
              ;y=*z
              {

              در این برنامه ابتدا یه متغییر اشاره تعریف کردیم. و یه متغییر بدون اشاره به اسم y
              بعد از اون آدرس محل قرار گیری متغییر a رو در متغییر z میریزیم.
              و سپس محتوای مکانی که آدرس اون در z هست رو در y میریزیم.
              در این مثال متغییر a همان متغییری هست که توی تاپیک قبل در آدرس 20 هگز ذخیره شد.

              در صورتی که آدرس متغییر a رو بدانیم میتوان به طور مستقیم مقدار آدرس رو در متغییر z بریزیم. به صورت زیر:

              }()main

              ;int *z
              ;z=0x20
              ;y=*z
              {
              [glow=red,2,300]گرد هم آمدن شروع است.با هم ماندن پيشرفت است.با هم کار کردن موفقيت است.[/glow]
              [img width=98 height=100]http://s3.picofile.com/file/7407857311/icon3.png[/img]

              دیدگاه


                #8
                پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

                آقا سلام به همه

                من هم در همین مورد مشکل دارم داشتم تو گوگل میگشتم تا به این سایت رسیدم.

                خدارو شکر هم بچه های فعالی داره اینجا هم درست حسابی جواب میدن به آدم.

                در ضمن اگر تاپیک قدیمیه و آوردمش بالا ببخشید (البته تاریخ ها رو که دیدم قدیمی نبود ولی خوب ...)

                حالا سوال من: ببینید من نیاز دارم یک متقیر دارای 11 آرایه رو تو حافظه غیر فرار میکرو ذخیره کنم تا در مواقع نیاز بتونم ازشون استفاده کنم.

                من اومدم آرایهم رو اینطوری تعریف کردم:
                کد:
                [left]eeprom unsigned char Password[10][/left]
                حالا میخوام ببینم درسته یا نه؟
                اگر آره مثلا با کد Password[0]=55; عدد 55 داخل آرایه 0 این متغیر ذخیره میشه که بعد از قطع برق هم از بین نره؟

                اگر نه پس میشه بهم توضیح بدید؟

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

                این برنامه رو هم دارم برای ATMEGA32 مینویسم و با CodeVision هم دارم این کار رو انجام میدم.

                ببخشید که اینجا دارم مطرح میکنم: من اومدم تست کنم ببینم پروگرامری که ساختم درست کار میکنه یا نه! یک فایل خالی (Blank) رو روی میکرو Program کردم و از اون جایی که تو همه سایت ها از فیوز بیت ها منو ترسونده بودن تیک همه فیوز بیت ها رو برداشته بودم

                بصورت دقیق:

                کد:
                Flash
                Start: 0
                End: 0
                کد:
                EEPROM
                Start: 0
                End: 9
                کد:
                Flash Lock Bit: No Protection
                کد:
                Program Fuse Bit(s): Activate
                CKSEL0=0: Deavtive
                CKSEL1=0: Deavtive
                CKSEL2=0: Deavtive
                CKSEL3=0: Deavtive
                SUT0=0: Deavtive
                SUT1=0: Deavtive
                BODEN=0: Deavtive
                BODLEVEL=0: Deavtive
                BOOTRST=0: Deavtive
                BOOTSZ0=0: Deavtive
                BOOTSZ1=0: Deavtive
                EESAVE=0: Deavtive
                CKOPT=0: Deavtive
                JTAGEN=0: Deavtive
                OCDEN=0: Deavtive
                کد:
                Boot Lock Bit 0: B01=1 B02=1
                کد:
                Boot Lock Bit 0: B11=1 B12=1
                اما بعد از پروگرام شدن دیگه میکرو من شناخته نشد به هیچ عنوان، وقتی دیدم اینطوری شد تو اینترنت چرخ زدم تا این که تو یک سایت دیدم نوشته اگر موقع پروگرام کردن تیک گزینه های BOOTSZ0=0 و BOOTSZ1=0 رو نزنید دیگه با کدویژن نمیتونید میکروتون رو پروگرام کنید.

                وقتی اینو خوندم اومدم با نرم افزار PonyProg امتحان کردم بازم نشد.

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

                ببخشید که این پست خیلی طولانی شد
                اگر من و شما هر كدوم يك چيز ياد داشته باشيم ولي به همديگه ياد بديم، حالا هر كدوم از ما دو تا چيز ياد داريم

                دیدگاه


                  #9
                  پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

                  دوست عزیز در مورد نحوه ی تعریف متغییر در eeprom درست عمل کردید میتونید جای کلمه ی eeprom رو نیز تغییر بدید به این صورت [unsigned char eeprom Password[10


                  در مورد پروگرم کردن میکرو :

                  میکرویی که از بازار میخرید به طور پیش فرض فیوز بیت ها و lockbit های اون تنظیم شده هست.

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

                  بعضی موقع ها هست که ما اصلا لازم نداریم تغییری در اونا بدیم.


                  در مورد اینکه میکروهاتون دیگه کار نمیدن نگران نباشید با پروگرمر Jtag میتونید میکرو رو به حالت عادی برگردونید.

                  برای اینکه مشکل اکثر دوستانی که میخوان کار با AVR ها رو شروع کنن همین فیوز بیت ها ست من سعی میکنم انشاء الله به زودی زود یه آموزش کامل در مورد پروگرم کردن میکرو بذارم که نمونش رو هیج جایی پیدا نمی کنید.
                  [glow=red,2,300]گرد هم آمدن شروع است.با هم ماندن پيشرفت است.با هم کار کردن موفقيت است.[/glow]
                  [img width=98 height=100]http://s3.picofile.com/file/7407857311/icon3.png[/img]

                  دیدگاه


                    #10
                    پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

                    نوشته اصلی توسط حمیدجان
                    دوست عزیز در مورد نحوه ی تعریف متغییر در eeprom درست عمل کردید میتونید جای کلمه ی eeprom رو نیز تغییر بدید به این صورت [unsigned char eeprom Password[10


                    در مورد پروگرم کردن میکرو :

                    میکرویی که از بازار میخرید به طور پیش فرض فیوز بیت ها و lockbit های اون تنظیم شده هست.

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

                    بعضی موقع ها هست که ما اصلا لازم نداریم تغییری در اونا بدیم.


                    در مورد اینکه میکروهاتون دیگه کار نمیدن نگران نباشید با پروگرمر Jtag میتونید میکرو رو به حالت عادی برگردونید.

                    برای اینکه مشکل اکثر دوستانی که میخوان کار با AVR ها رو شروع کنن همین فیوز بیت ها ست من سعی میکنم انشاء الله به زودی زود یه آموزش کامل در مورد پروگرم کردن میکرو بذارم که نمونش رو هیج جایی پیدا نمی کنید.
                    بازم سلام،

                    آقا دستت درد نکنه

                    شما گفتی درست تعریف کردم اما در مورد مقدار دهی ها توضیح ندادی.

                    همون طوری که خودم گفتم درسته؟

                    هیچ کد اضافه ای لازم نداره؟

                    با این پروگرامر JTAG میتونم از طریق همین Code Vision میکرو رو به حالت عادی بر گردونم؟
                    اگر من و شما هر كدوم يك چيز ياد داشته باشيم ولي به همديگه ياد بديم، حالا هر كدوم از ما دو تا چيز ياد داريم

                    دیدگاه


                      #11
                      پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

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

                      البته فقط پیشنهاد دادم.

                      نحوه ی تعریف و مقدار دهی اولیه به متغیرهای آرایه به صورت کامل:

                      ;{0,eprom unsigned char password[2]={0

                      برای مقدار دهی در قسمت های مختلف برنامه:

                      مثلا
                      ;0=[password[0

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

                      اگه برای مقدار دهی این کار رو بکنی error میگره ;0=[password[2
                      چون این آرایه 2 بعد داره اما شما به بعد سومش مقدار دادی ( مقدار بعدها از صفر شروع میشه.)

                      با پروگرمر jtag میتونی با هر نرم افزاری اعم از کدویژن ، بسکام و... میکرو رو پروگرم کنی.

                      شب بخیر



                      [glow=red,2,300]گرد هم آمدن شروع است.با هم ماندن پيشرفت است.با هم کار کردن موفقيت است.[/glow]
                      [img width=98 height=100]http://s3.picofile.com/file/7407857311/icon3.png[/img]

                      دیدگاه


                        #12
                        پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

                        نوشته اصلی توسط حمیدجان
                        دوست عزیز برای خواندن اطلاعات از مکان خاصی از حافظه های RAM ، Flash و EEPROM باید از اشارگر ها
                        ( pointers) استفاده کنیم.

                        اشاره گر متغییریه که به جای مقدار یک قلم داد ، محل یا آدرس اون را معرفی میکنه . در واقع مقدار اون آدرس یک حافظه هست.

                        به عبارت دیگر اشاره گر متغییریه که آدرس متغییر دیگری را در خود نگه میداره.

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

                        }()main

                        ;int y,*z
                        ;z=&a
                        ;y=*z
                        {

                        در این برنامه ابتدا یه متغییر اشاره تعریف کردیم. و یه متغییر بدون اشاره به اسم y
                        بعد از اون آدرس محل قرار گیری متغییر a رو در متغییر z میریزیم.
                        و سپس محتوای مکانی که آدرس اون در z هست رو در y میریزیم.
                        در این مثال متغییر a همان متغییری هست که توی تاپیک قبل در آدرس 20 هگز ذخیره شد.

                        در صورتی که آدرس متغییر a رو بدانیم میتوان به طور مستقیم مقدار آدرس رو در متغییر z بریزیم. به صورت زیر:

                        }()main

                        ;int *z
                        ;z=0x20
                        ;y=*z
                        {
                        سلام آقا حمید. خوبی؟

                        ممنون از جوابی که دادید./

                        بعنوان آخرین سوال:

                        اگه بخوام تو آدرس 20 هگز یه چیزی بریزم می تونم اینطور بنویسم a=0x20; یا باز م باید از اشاره گر ها استفاده کنم .اگه آره یه مثال میشه لطف کنید.

                        می دونم سوالام خیلی مبتدیانه هستش و بهتره برم سرلغ کتاب و اینقدر مزاحم شما نشم اما گیرم فقط همین قسمت هستش.

                        دیدگاه


                          #13
                          پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

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

                          حالا من مطالب گفته شده رو دوباره مرور میکنم:


                          شما سوال پرسیدین که:

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

                          من تازه می خوام برنامه نویسی سی رو یاد بگیرم. میشه لطف کنید و بگید که چطور یه دیتایی رو تو Sram ذخیر کنم و دوباره بخونم و تغییرش بدم./

                          مثلاً تو آدرس 20 هگز یه دیتایی رو ذخیره کنه و بخونه؟ :smile:
                          ومن جواب دادم:

                          نوشته اصلی توسط حمیدجان
                          در زبان برنامه نویسی C و در کدویژن برای ذخیره متغییر های سراسری در آدرسی مشخص از حافظه ی SRAM باید به صورت زیر عمل کنیم:

                          ;آدرس محل @ نام متغییر نوع

                          مثلا

                          ;cahr a @ 0x20


                          توجه کن توجه کن!!
                          در صورتی که به صورت بالا عمل نکنی و به این صورت بنویسی:

                          ;cahr a

                          در این صورت بسته به این که متغییر به صورت سراسری تعریف شده باشد یا محلی مکان ذخیره شدن متغییر در حافظه ی SRAM نیز متفاوت میباشد.
                          و بعد پرسیدین که:
                          نوشته اصلی توسط babak_9051

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

                          نوشته اصلی توسط حمیدجان
                          دوست عزیز برای خواندن اطلاعات از مکان خاصی از حافظه های RAM ، Flash و EEPROM باید از اشارگر ها
                          ( pointers) استفاده کنیم.

                          اشاره گر متغییریه که به جای مقدار یک قلم داد ، محل یا آدرس اون را معرفی میکنه . در واقع مقدار اون آدرس یک حافظه هست.

                          به عبارت دیگر اشاره گر متغییریه که آدرس متغییر دیگری را در خود نگه میداره.

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

                          }()main

                          ;int y,*z
                          ;z=&a
                          ;y=*z
                          {

                          در این برنامه ابتدا یه متغییر اشاره تعریف کردیم. و یه متغییر بدون اشاره به اسم y
                          بعد از اون آدرس محل قرار گیری متغییر a رو در متغییر z میریزیم.
                          و سپس محتوای مکانی که آدرس اون در z هست رو در y میریزیم.
                          در این مثال متغییر a همان متغییری هست که توی تاپیک قبل در آدرس 20 هگز ذخیره شد.

                          در صورتی که آدرس متغییر a رو بدانیم میتوان به طور مستقیم مقدار آدرس رو در متغییر z بریزیم. به صورت زیر:

                          }()main

                          ;int *z
                          ;z=0x20
                          ;y=*z
                          {
                          حالا اگه توجه کرده باشین جوابتونو دادم:
                          نوشته اصلی توسط حمیدجان
                          توجه کن توجه کن!!
                          در صورتی که به صورت بالا عمل نکنی و به این صورت بنویسی:

                          ;cahr a

                          در این صورت بسته به این که متغییر به صورت سراسری تعریف شده باشد یا محلی مکان ذخیره شدن متغییر در حافظه ی SRAM نیز متفاوت میباشد.
                          یعنی اینکه اگه به صورت ;a=0x20 بنویسی این متغییری که الان تعریف کردی اون مقداری (0x20) رو که بهش دادی مقدار اولیه این متغییر هست نه آدرس ذخیره شدن در حافظه .

                          فکر کنم چون شما اینو دیدین( ;z=0x20)فکر کردین یعنی این متغییر z در آدرس 0x20 تعریف شده:
                          نوشته اصلی توسط حمیدجان

                          }()main

                          ;int *z
                          ;z=0x20
                          ;y=*z
                          {
                          پس نمیشود به صورت ;a=0x20 آدرس قرارگیری متغییر a رو درآدرس حافظه ی0x20 قرار داد.
                          [glow=red,2,300]گرد هم آمدن شروع است.با هم ماندن پيشرفت است.با هم کار کردن موفقيت است.[/glow]
                          [img width=98 height=100]http://s3.picofile.com/file/7407857311/icon3.png[/img]

                          دیدگاه


                            #14
                            پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

                            سلام .

                            ببخشید شاید من منظورم رو بد گفتم.

                            منظورم این بود که اول یه متغیر رو توی آدرس مشخص توی sram تعریف کنیم. مثلاً ;cahr a @ 0x20

                            حالا اگه بخوام یه مقدار به متغیر a بدم می تونم بنویسم a=0x80; و این مقدار توی خونه 0x20 حافظه sram ذخیره میشه؟!!!

                            بازم ممنونم

                            دیدگاه


                              #15
                              پاسخ : کار با حافظه SRAM داخلی میکرو زبان سی

                              بله دوست من دقیقا همین طوریه که گفتین.
                              [glow=red,2,300]گرد هم آمدن شروع است.با هم ماندن پيشرفت است.با هم کار کردن موفقيت است.[/glow]
                              [img width=98 height=100]http://s3.picofile.com/file/7407857311/icon3.png[/img]

                              دیدگاه

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