اطلاعیه

Collapse
No announcement yet.

کوچ کردن از کدویژن به AtmelStudio

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

    پاسخ : کوچ کردن از کدویژن به AtmelStudio

    نباید اینکار را کنید. بهتره تو هدر فایل های استاندارد کامپایلر دست برده نشه.(خوب اسمش پیداست استاندارده دیگه - تو یه چیزه استاندارد که دست نمیبرن )


    ببنید اینجوری نیست که برا برنامه نویسی برای یک میکرو ، کامپایلر نیاز ذاشته باشه بدونه کلاک سی پی یو چه قدره.

    این F_CPU هم فقط تو هدر delay.h مطرح میشه. یعنی فقط این هدر نیاز داره بدونه فرکانس کلاک پردازنده شما چه قدره ،
    خوب اگه بهش اشتباه بدید ، چی میشه؟
    کامپایلر که غمش نیست ، بدون ارور کامپایل میکنه. ولی اگر از توابع delay.h استفاده کنید خوب معلومه ، عملکردشون اشتباه میشه. مثلا میخواید تاخیر 1 میلی ثانیه ایجاد کنید یهو 16 میلی ثانیه میشه یا برعکس.

    خوب برای اینکه بهش بفهمونیم فرکانس کلاک سی پی یو چقدره ، باید چه کرد؟

    اول اینکه نباید کدهای خودشو تغییر بدید(چرا انقدر خشن، صلح آمیز ترم میشه اینکار رو کرد oo: )

    ببنید این هدرفایل به حالت پیشفرض فکر میکنه کلاک سی پی یو 1مگاهرتزه .
    ولی ازتون میخواد تعیین کنید کلاک پردازنده تون چه قدر ، اگرم همون 1مگاهرتزه ازتون یه مهر تایید میخواد وگرنه بتون وارنینگ میده .
    حالا چه طور میشه این مهر تایید رو زد؟
    راحته. قبل از اینکلود کردن delay.h قبلش با یه دیفاین F_CPU را مشخص کنید.
    سلام
    ولی به هرحال با تعریف فرکانس در فایل اصلی و یا در symbol ، محاسبات delay هم بر اون مبنا صورت میگیره درسته ؟
    تشکر .

    دیدگاه


      پاسخ : کوچ کردن از کدویژن به AtmelStudio

      نوشته اصلی توسط aseok
      سلام
      ولی به هرحال با تعریف فرکانس در فایل اصلی و یا در symbol ، محاسبات delay هم بر اون مبنا صورت میگیره درسته ؟
      تشکر .
      سلام

      بله - همینطوره
      اصلا اون قسمت هدر delay.h مهم نیست و همون " تعریف فرکانس در فایل اصلی و یا در symbol " مهمه.
      راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
      کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
      نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
      http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
      انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

      دیدگاه


        پاسخ : کوچ کردن از کدویژن به AtmelStudio

        نوشته اصلی توسط RubeuS
        نباید اینکار صورت بگیره.
        به همون نحو که گفته شد بایستی عمل بشه.
        سلام سید
        میشه بگید چرا نباید این کار رو کرد؟
        آخه من همیشه از این روش استفاده میکنم و تا الان که مشکلی نداشتم!
        در ضمن این روش رو اون اوایل که avrstudio5 اومده تو avrfreaks خوندم.

        دیدگاه


          پاسخ : کوچ کردن از کدویژن به AtmelStudio

          نوشته اصلی توسط M3R
          سلام سید
          میشه بگید چرا نباید این کار رو کرد؟
          آخه من همیشه از این روش استفاده میکنم و تا الان که مشکلی نداشتم!
          در ضمن این روش رو اون اوایل که avrstudio5 اومده تو avrfreaks خوندم.
          سلام

          ببنید اون قسمت داخل هدر delay.h فقط برای ایجاد یک حالت پیشفرض استفاده میشه.
          اصولا حالت پیشفرض را که تغییرش نمیدن.
          زمانی که بخواید جهت نشان دادن مقدار فرکانس کلاک پردازنده به delay.h ، از اینکار استفاده کنید و کلا در فایل اصلی مقدار را F_CPU را تعریف نکنید،
          در هر صورتی کامپایلر به شما وارنینگ " # warning "F_CPU not defined for <util/delay.h>" " میده و میگه برام F_CPU تعریف نشده.
          در این حالت با توجه به اون تغییری که خودتون در فایل delay.h انجام دادید ، خوب عملکرد توابع درست در میاد ولی اصلا اصولی نیست.

          delay.h یک هدر استاندارد کامپایلره. به هیچ عنوان نباید خودتون دستی برید این هدرهای استاندارد را دستکاری کنید.(یه جورایی عاقلانه و اصولی نیست. اصولا وقتی چیزی استاندارده که نمیان دستکاریش کنند)

          بهتره اینکار صورت نگریره چون امکان اشتباه در پروژه های مختلف بسیار زیاده. مسلما شما که فقط روی یک پروژه کار نمیکنید. امکان داره در یک زمان نیاز باشه روی چندین پروژه باهم کار بشه .
          حالا اگه بخواید با این روش کلا delay.h را تغییر بدید. در پروژه های مختلف امکان اشتباه زیاد .
          یعنی باید اینجوری مثلا برای پروژه ی شماره 1 یه بار delay.h را تغییر بدید و پروژه را کامپایل کنید .
          حالا مثلا در پروژه ی 2 کلا کلاک پردازنده عوض میشه ، حالا دوباره delay.h را تغییر میدید و کامپایل میکنید . الی آخر

          حالا 6 ماه دیگه بخواید مثلا بدونید تو پروژه یک فرکانس کلاک میکرو چقدر درنظر گرفته شده ، الان انقدر هی delay.h را عوض کردید که معلوم نیست چی بوده.

          اصلا اصولی تر اینه که اگر از delay.h در پروژه تون استفاده هم نمیکنید یک تعریف برای فرکانس پردازنده در فایل اصلی برنامه تون داشته باشید(همون F_CPU خوبه)
          اینطوری اگر در پروژه مثلا از تایمر استفاده شده است و بعدا خواستید پروژه را نگاه کنید با توجه به مقدار نوشته شده برای کلاک پردازنده و مقادیر تعیین شده برای رجیستر ها سریع میشه فهمید که موقعی که داشتید این پروژه را مینوشتید میخواستید کلاک استفاده شده برای تایمر فلان چقدر باشه.

          من نمیدونم شما از کجا این رو خوندید ولی در کل این روشی که استفاده میکنید یک تعبیر کامل غلط و غیر منطقی(یه جورایی یکم خنده دار) است.
          اصلا وقتی شما در پروژه از کامپیلر وارنینگ دریافت میکنید ، این یعنی یه جا مشکل داره. و در این روشی که استفاده میکنید همیشه کامپایلر وارنینگ میده.
          راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
          کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
          نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
          http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
          انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

          دیدگاه


            پاسخ : کوچ کردن از کدویژن به AtmelStudio

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

            ببنید اون قسمت داخل هدر delay.h فقط برای ایجاد یک حالت پیشفرض استفاده میشه.
            اصولا حالت پیشفرض را که تغییرش نمیدن.
            زمانی که بخواید جهت نشان دادن مقدار فرکانس کلاک پردازنده به delay.h ، از اینکار استفاده کنید و کلا در فایل اصلی مقدار را F_CPU را تعریف نکنید،
            در هر صورتی کامپایلر به شما وارنینگ " # warning "F_CPU not defined for <util/delay.h>" " میده و میگه برام F_CPU تعریف نشده.
            در این حالت با توجه به اون تغییری که خودتون در فایل delay.h انجام دادید ، خوب عملکرد توابع درست در میاد ولی اصلا اصولی نیست.

            delay.h یک هدر استاندارد کامپایلره. به هیچ عنوان نباید خودتون دستی برید این هدرهای استاندارد را دستکاری کنید.(یه جورایی عاقلانه و اصولی نیست. اصولا وقتی چیزی استاندارده که نمیان دستکاریش کنند)

            بهتره اینکار صورت نگریره چون امکان اشتباه در پروژه های مختلف بسیار زیاده. مسلما شما که فقط روی یک پروژه کار نمیکنید. امکان داره در یک زمان نیاز باشه روی چندین پروژه باهم کار بشه .
            حالا اگه بخواید با این روش کلا delay.h را تغییر بدید. در پروژه های مختلف امکان اشتباه زیاد .
            یعنی باید اینجوری مثلا برای پروژه ی شماره 1 یه بار delay.h را تغییر بدید و پروژه را کامپایل کنید .
            حالا مثلا در پروژه ی 2 کلا کلاک پردازنده عوض میشه ، حالا دوباره delay.h را تغییر میدید و کامپایل میکنید . الی آخر

            حالا 6 ماه دیگه بخواید مثلا بدونید تو پروژه یک فرکانس کلاک میکرو چقدر درنظر گرفته شده ، الان انقدر هی delay.h را عوض کردید که معلوم نیست چی بوده.

            اصلا اصولی تر اینه که اگر از delay.h در پروژه تون استفاده هم نمیکنید یک تعریف برای فرکانس پردازنده در فایل اصلی برنامه تون داشته باشید(همون F_CPU خوبه)
            اینطوری اگر در پروژه مثلا از تایمر استفاده شده است و بعدا خواستید پروژه را نگاه کنید با توجه به مقدار نوشته شده برای کلاک پردازنده و مقادیر تعیین شده برای رجیستر ها سریع میشه فهمید که موقعی که داشتید این پروژه را مینوشتید میخواستید کلاک استفاده شده برای تایمر فلان چقدر باشه.

            من نمیدونم شما از کجا این رو خوندید ولی در کل این روشی که استفاده میکنید یک تعبیر کامل غلط و غیر منطقی(یه جورایی یکم خنده دار) است.
            اصلا وقتی شما در پروژه از کامپیلر وارنینگ دریافت میکنید ، این یعنی یه جا مشکل داره. و در این روشی که استفاده میکنید همیشه کامپایلر وارنینگ میده.
            سلام
            سید فک کنم اشتب شده!!
            من فک کردم شما میگید فرکانس تو قسمت symbol نباید تعریف بشه!
            به هر حال ممنون از راهنماییتون

            دیدگاه


              پاسخ : کوچ کردن از کدویژن به AtmelStudio

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

              شما اگر میشه یک مثال بزنید که بگید مثلا میخوام تابع اینطور عمل کنه که با فلان ورودی بهمان خروجی بده.
              میخواید چی کار کنید؟ ، چرا به عنوان پارامتر یک float گرفتید؟ میخواید یک رجیستر به دلخواه مقدار دهی کنید؟ اگر اینطوریه پس چرا float گرفتید؟ منظورتون چی بوده؟
              سلام ببخشید چند روزی نبودم
              ....من میخوام یک عدد float بین 0و1 بگیرم و متناسب با اون به OCR1AH و OCR1AL مقدار بدم...در مورد مقدار دهی به دورجیستر از روی یه عدد مشکل داشتم....با شیفت دادن یک عدد 16بیتی به چپ و راست و قراردادنش در رجیسترهای بالا میخواستم بهشون مقدار بدم ولی جواب نمیگرفتم...پست های قبلی رو کامل خوندم و جوابمو پیدا کردم...البته با تقسیم بر256 و باقیمانده بر 256 هم میشد اینکار رو کرد ولی اصولی نبود...

              سوالی که الان برام پیش اومده اینه که کتابخونه ای هست تا توابع تبدیلش کامل باشند؟
              مثلا C# یک کتابخونه(Convert) داره که انواع متغیر ها string to float- float to string-int to string-int to float-float to int و ..... همه جورشو داره...همچین کتابخونه ای واسه اتمل استودیو هم داریم؟
              با تشکر
              تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

              www.intelart.ir


              ساخت کنترلر دما PID فازی با AVR [آموزشی]

              دیدگاه


                پاسخ : کوچ کردن از کدویژن به AtmelStudio

                نوشته اصلی توسط punisher.x64
                سلام ببخشید چند روزی نبودم
                ....من میخوام یک عدد float بین 0و1 بگیرم و متناسب با اون به OCR1AH و OCR1AL مقدار بدم...در مورد مقدار دهی به دورجیستر از روی یه عدد مشکل داشتم....با شیفت دادن یک عدد 16بیتی به چپ و راست و قراردادنش در رجیسترهای بالا میخواستم بهشون مقدار بدم ولی جواب نمیگرفتم...پست های قبلی رو کامل خوندم و جوابمو پیدا کردم...البته با تقسیم بر256 و باقیمانده بر 256 هم میشد اینکار رو کرد ولی اصولی نبود...

                سوالی که الان برام پیش اومده اینه که کتابخونه ای هست تا توابع تبدیلش کامل باشند؟
                مثلا C# یک کتابخونه(Convert) داره که انواع متغیر ها string to float- float to string-int to string-int to float-float to int و ..... همه جورشو داره...همچین کتابخونه ای واسه اتمل استودیو هم داریم؟
                با تشکر
                سلام
                کلا یک کتابخونه استاندارد در کامپایلرهای سی و سی پلاس پلاس وجود داره، به نام: stdlib.h همچنین برای رشته ها و تبدیلات میتونید از کتابخانه stdio.h و تابع sprinf استفاده کنید.

                اگر تابع مدنظرتون نبود بایستی خودتون بنویسیدش. (با عملگرهای ضرب و تقسیم و شیفت و کستینگ و اشاره گرها میشه خیلی کارا کرد)
                راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                دیدگاه


                  پاسخ : کوچ کردن از کدویژن به AtmelStudio

                  سلام

                  نحوه ی تعریف متغیرها در حافظه فلش یا eeprom به چه صورت هست ؟

                  باتشکر .

                  دیدگاه


                    پاسخ : کوچ کردن از کدویژن به AtmelStudio

                    نوشته اصلی توسط aseok

                    نحوه ی تعریف متغیرها در حافظه فلش یا eeprom به چه صورت هست ؟
                    تو Help نرم افزار به مسیرهای زیر برید.

                    library home - avrlibc - data in program space
                    و
                    library home - avrlibc - modules - EEPROM handling
                    گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

                    دیدگاه


                      پاسخ : کوچ کردن از کدویژن به AtmelStudio

                      سلام
                      ببخشید سوالی از آقای مرتضوی داشتم :

                      در پست 143 در رابطه با استفاده از usart کد زیر را قرار داده اید :
                      کد:
                      #include <avr/io.h> // MCU = Mega32
                      #define F_CPU 8000000UL 
                      #include <avr/interrupt.h>
                      
                      
                      char str[]="eca.ir";
                      
                      
                      
                      ISR(USART_TXC_vect)
                      {
                      	static char *ptr = str;
                      	if (!(*ptr)) return;
                      	UDR = *ptr;
                      	ptr++;	
                      }
                      
                      
                      
                      int main(void)
                      {
                      	UCSRB |= (1<<TXCIE) | (1<<TXEN) ;
                      	UCSRC |= (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0) ;
                      	UBRRL = 51;
                      	sei(); 
                      	
                      	UDR = 0xAA; //send preamble
                      	
                      	while(1);
                      }
                      در خط اول روتین وقفه ، در هر بار ، اشاره گر به اولین آدرس رشته اشاره میکند ( درسته ؟) در این صورت آیا این رشته به طور کامل ارسال میشود ؟
                      باتشکر .

                      دیدگاه


                        پاسخ : کوچ کردن از کدویژن به AtmelStudio

                        سلام

                        در پست 178 در رابطه با تعریف زیر سوال شد :

                        کد:
                        #define porta (*((volatile BYTE_BITFIELD*)(&PORTA)))
                        تفاوت دو عبارت زیر چیه ؟
                        کد:
                        volatile BYTE_BITFIELD*
                        کد:
                        *volatile BYTE_BITFIELD
                        آقای مرتضوی در جوابشون در اون پست ، از عبارت دوم به جای اول استفاده کردن .

                        باتشکر .

                        دیدگاه


                          پاسخ : کوچ کردن از کدویژن به AtmelStudio

                          ببخشید تفاوت ایندو چیه ؟


                          کد:
                          char* a
                          کد:
                          char *a
                          با تشکر .

                          دیدگاه


                            پاسخ : کوچ کردن از کدویژن به AtmelStudio

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

                            نحوه ی تعریف متغیرها در حافظه فلش یا eeprom به چه صورت هست ؟

                            باتشکر .
                            سلام
                            در رابطه با دسترسی با حافظه ی فلش بنده دوتا پست در همین تاپیک قرار دادم که به طور مفصل در رابطه با بیس و مبنای کار و همچنین نحوه ی دسترسی توضیح دادم.
                            در رابطه با eeprom توضیح ندادم؟
                            مشکلی نداره سعی میکنم داخل یک پست جداگانه کامل توضیح بدم.
                            (راستی من سعی میکنم توضیحات جوری باشه که مربوط به یک کامپایلر خاص نباشه و عمومی گفته بشه ولی در آخر توضیحات همیشه مثال در Atmel Studio و کامپایلر gcc قرار میدهم.)
                            راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                            کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                            نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                            http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                            انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                            دیدگاه


                              پاسخ : کوچ کردن از کدویژن به AtmelStudio

                              نوشته اصلی توسط aseok
                              سلام
                              ببخشید سوالی از آقای مرتضوی داشتم :

                              در پست 143 در رابطه با استفاده از usart کد زیر را قرار داده اید :
                              کد:
                              #include <avr/io.h> // MCU = Mega32
                              #define F_CPU 8000000UL 
                              #include <avr/interrupt.h>
                              
                              
                              char str[]="eca.ir";
                              
                              
                              
                              ISR(USART_TXC_vect)
                              {
                              	static char *ptr = str;
                              	if (!(*ptr)) return;
                              	UDR = *ptr;
                              	ptr++;	
                              }
                              
                              
                              
                              int main(void)
                              {
                              	UCSRB |= (1<<TXCIE) | (1<<TXEN) ;
                              	UCSRC |= (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0) ;
                              	UBRRL = 51;
                              	sei(); 
                              	
                              	UDR = 0xAA; //send preamble
                              	
                              	while(1);
                              }
                              در خط اول روتین وقفه ، در هر بار ، اشاره گر به اولین آدرس رشته اشاره میکند ( درسته ؟) در این صورت آیا این رشته به طور کامل ارسال میشود ؟
                              باتشکر .
                              شما به نحوه ی اعلان اشارگر در روتین وقفه توجه کنید.
                              دقت کردید؟
                              از کلمه ی کلیدی static استفاده شده.
                              اگر این کلمه را بردارید ، دقیقا همانطور که گفتید میشود.

                              این کلمه کلیدی static چه کار میکند؟
                              دفعه ی اول که پردازنده وارد روتین وقفه میشود ( اولین وقفه ی ارسال بعد از اتصال تغذیه)
                              دیتا آبجکت مورد نظر (اینجا همون اشاره گر ) با مقدار اولیه ی نوشته شده شکل میگیرد .
                              ولی با خارج شدن از روتین وقفه دیگه مثل اعلان های معمولی اشاره گر از بین نمیرود . پس چون هربار داریم ++ptr میکنیم، اشاره گر به عنصر بعدی آرایه ی str اشاره میکند.
                              پس دید چی شد؟
                              اشاره گر با هر بار ورود به روتین داره به بایت بعدی اشاره میکند و به درستی کل رشته ارسال میشود.
                              راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                              کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                              نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                              http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                              انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                              دیدگاه


                                پاسخ : کوچ کردن از کدویژن به AtmelStudio

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

                                در پست 178 در رابطه با تعریف زیر سوال شد :

                                کد:
                                #define porta (*((volatile BYTE_BITFIELD*)(&PORTA)))
                                تفاوت دو عبارت زیر چیه ؟
                                کد:
                                volatile BYTE_BITFIELD*
                                کد:
                                *volatile BYTE_BITFIELD
                                آقای مرتضوی در جوابشون در اون پست ، از عبارت دوم به جای اول استفاده کردن .

                                باتشکر .
                                ممنون از توجه بالاتون.
                                من چون سریع پست را مینویسم و دوباره دیگه نمیخونم امکان داره اشتباهات سهوی صورت بگیره.
                                چون بدون چپ چین کردن نوشتم اینجا اشتباه شده . منظورم همان:

                                کد:
                                volatile BYTE_BITFIELD*
                                بوده.
                                (توضیحات روی دیفاینی که قرار دادید بوده و چیزی را تغییر ندادم)
                                الان میرم پست را ویرایش میکنم.
                                با تشکر
                                راه اندازی ماژول nrf24l01p برای codevision (ارتباط بیسیم بین دو میکرو) : http://www.eca.ir/forum2/index.php?topic=78587.0
                                کوچ کردن از کدویژن به http://www.eca.ir/forum2/index.php?topic=81025.0 : AtmelStudio
                                نحوه نوشتن اصولی یک لایبرری و درایور نرم افزاری( بصورت ساده) : http://www.eca.ir/forum2/index.php?topic=81071
                                http://www.eca.ir/forum2/index.php?topic=82130.0 سفارش راه انداز ماژول های مختلف توسط اعضای انجمن
                                انشالله به زودی تاپیک ها به روز رسانی خواهد شد،

                                دیدگاه

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