اطلاعیه

Collapse
No announcement yet.

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

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

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

    اونجاهایی که سبز هست یعنی به یه نحوی سیو شده(یا موقع کامپیال یا دستی).اون هایی که زرد هست یعنی تازه اضافه شده و سیو نشده.

    دیدگاه


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

      دوستان کد زیر مربوط به کنترل خاموش وروشن کردن سه ال ای دی است که در تابع setled انجام میشود.آن چیزی در تحلیل کدها برام مورد سئوال هست نقش خطوط علامت گذاری شده(با -----&gt وهمینطور کلا نحوه عملکرد این تابعsetled در خطوط بعدی میباشد. یکی از مشکلاتی که دارم اینه که بتونمledها رو بجای صفر کردن پورت مربوطه بایک کردن پورت روشن کنم . مشکل بعدی مربوط به قسمت if 0 # تا آخر آن endif # هست که اینجا چکار میکنه ونقشش چیه؟
      توضیح خط به خط دوستان خیلی مفید خواهد بود.
      کد:
      [left][/left]
      #define LEDB	PB7
      #define LEDR	PB6
      #define LEDG	PB5
      #define BTN1	PB0
      #define BTN2	PB1
      
      #define LED_OFF 0
      #define LED_R 1  <----
      #define LED_G 2  <---- 
      #define LED_B 3  <----
      
      
      extern volatile char blink;
      
      volatile char pos_red;
      volatile char pos_green;
      volatile char pos_blue;
      volatile unsigned char fanpos;
      
      
      
        
       PORTB=(1<<BTN1)|(1<<BTN2);
       DDRB=0;
       PORTD=(1<<RPM);
       DDRD=0;
      
      
      void setled(char l) {
        DDRB&=~((1<<LEDR)|(1<<LEDG)|(1<<LEDB));  
        if ((l==LED_R) && ((blink&4)==0)) DDRB=(1<<LEDR);
        if ((l==LED_G) && ((blink&2)==0)) DDRB=(1<<LEDG);
        if ((l==LED_B) && ((blink&1)==0)) DDRB=(1<<LEDB);
        return;
      }
      
       if (fanpos>60) {
      	setled(LED_OFF);
      	return;
        }
      
      ISR(TIMER1_COMPA_vect) {
        char l;
        static char mux;
        //
        if (fanpos<250 || fanpos==255) fanpos++;
        
        //
        if (fanpos>60) {
      	setled(LED_OFF);
      	return;
        }
      
        
        //
        l=LED_OFF;
        if ((fanpos)==pos_blue) l=LED_B;  
        if ((fanpos)==pos_green) l=LED_G; 
        if ((fanpos)==pos_red) l=LED_R;  
        
        //
       #if 0
        mux++;
        if (mux>2) mux=0;
        if ((fanpos)==pos_blue && mux==1) l=LED_B; 
        if ((fanpos)==pos_green && mux==2) l=LED_G; 
      #endif
        setled(l);
      }

      دیدگاه


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

        قسمت هایی که علامتگذاری کردید ماکروهایی هستند که هنگام کامپایل توسط کامپایلر معادلشان قرار داده می شود
        در تابع setled در خط اول پین های مربوط به LEDR, LEDG و LEDB ورودی و سایر پین ها روی PORTB خروجی تعریف شده اند. در خط بعدی اگر مقدار l برابر LED_R یعنی 1 و بیت سوم متغیر blink صفر بود پین مربوط به LEDR خروجی شود و الی آخر که بستگی به نحوه ارتباط ledها با پورتB دارد.

        دستوراتی که با # شروع می شوند دستورات پیش پردازنده هستند یعنی پیش از کامپایل این دستورات اجرا می شوند مانند ماکروها و . . . و در این کد چون در مقابل if# مقدار 0 قرار دارد این قسمت از کد تا endif# کامپایل نمی شود. از این دستور در نوشتن کتابخانه ها برای ایجاد تنظیمات و یا در هنگام تست و دیباگ کردن برنامه استفاده می شود.
        گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

        دیدگاه


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

          نوشته اصلی توسط Hamed Gh
          قسمت هایی که علامتگذاری کردید ماکروهایی هستند که هنگام کامپایل توسط کامپایلر معادلشان قرار داده می شود
          در تابع setled در خط اول پین های مربوط به LEDR, LEDG و LEDB ورودی و سایر پین ها روی PORTB خروجی تعریف شده اند. در خط بعدی اگر مقدار l برابر LED_R یعنی 1 و بیت سوم متغیر blink صفر بود پین مربوط به LEDR خروجی شود و الی آخر که بستگی به نحوه ارتباط ledها با پورتB دارد.

          دستوراتی که با # شروع می شوند دستورات پیش پردازنده هستند یعنی پیش از کامپایل این دستورات اجرا می شوند مانند ماکروها و . . . و در این کد چون در مقابل if# مقدار 0 قرار دارد این قسمت از کد تا endif# کامپایل نمی شود. از این دستور در نوشتن کتابخانه ها برای ایجاد تنظیمات و یا در هنگام تست و دیباگ کردن برنامه استفاده می شود.
          با تشکر از توجه شما
          از پاسخ شما اینطور متوجه میشوم که خطوط بینif# وendif# بی تاثیرند . و در مورد خط های مربوط به بعد از تابع setled مثل setled(LED_OFF); و l=LED_OFF;
          if ((fanpos)==pos_blue) l=LED_B;
          if ((fanpos)==pos_green) l=LED_G;
          if ((fanpos)==pos_red) l=LED_R;
          کمی سردرگم هستم.جرا که در یک ماکرو در اول برنامه داریم #define LED_OFF 0 وبعد درادامه برنامه l=LED_OFF;(یعنی یکبار LED_OFF رو صفر تعریف وبعد یک قرار میدیم) اینجاهای برنامه وهمین طور نحوه عملکرد تابع setled وخط هایی که این تابع توشون نقش داره رو دوست داشتم مفصل و بازتر بحث کنیم.
          به اضافه خروجیها برنامه pb5 تا pb7 هستند که صفر شدنشان باعث روشن شدن ledها میشه .همون طور که اول گفتم میخوام با دادن تغییرات لازم در تابع setled ویا هر جای دیگه در برنامه بتونم ledها رو با یک کردن پورت(+5 ولت مثلا) روشن کنم

          دیدگاه


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

            در کد حاضر در روتین وقفه متغیر l همیشه برابر با مقدار LED_OFF یعنی 0 است مگر اینکه در خطوط بعدی در صورت برقرار بودن شرط یکی از ifها مقدار آن تغییر کند و در پایان تابع setled فراخوانی می شود.

            همانطور که قبلا هم اشاره کردم عملکرد تابع setled بستگی به نحوه اتصال ledها دارد. به عنوان مثال با فرض اینکه کاتد led قرمز به PB6 متصل است اگر این پین ورودی و صفر باشد یک شدن پین متصل به آند باعث روشن شدن led می شود.

            در رابطه با if# درست متوجه شدید.
            در رابطه با کدی که قرار دادید هم به نظر دستور if قبل از روتین وقفه اضافه هست.

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

            دیدگاه


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

              در if دوم LED_OFF برابر با مقدار عدد یک قرار گرفته ونه برابر با متغیر i برای همین باعث سردرگمی است(چرا که اول 0 دیفاین شده وبعد در اینجا 1 قرار داده میشود)

              .همانطور عرض کردم pb5 تا pb7 خروجی هستند وطراح برنامه هنگامی که میخواهد آنها را صفر کند (این خروجیها را که در حالت عادی در وضعیت تری استیت یا به قول شما ورودی هستند) با توجه به صفر بودن portb با یک کردن بیت مربوطه در ddrb که در تابع setled انجام میشود آن بیت را خروجی با وضعیت صفر میکند وled های مربوطه هم که آندشان به + وصل است روشن میشوند.

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

              وموضوع دیگه اینکه این char 1 در تعریف تابع setled این شکل( void setled(char1)) یعنی چه و بعد در ادامه برنامه setled(l) و setled(LED_OFF) قرار گرفتن مقدار 1 و LED_OFF بجای آن چطور توجیه میشود؟

              از طرف دیگر در ابتدای وقفه تعریف char1; برای چیه؟

              دیدگاه


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

                خب به نظر مشکل پیدا شد. در روتین وقفه و در اولین خط متغیری به نام l (ال یا L) نه 1 یا i یا I ، از نوع char تعریف شده و در ادامه مقدار آن برابر LED_OFF که معادل 0 است قرار داده شده. همینطور در آرگومان تابع setled .
                برای ledها هم باید جهتشان برعکس و به زمین متصل شوند و با خروجی و یک کردن پایه مربوطه led را روشن می کنیم.

                در ضمن در ارسال قبلی خودم اعلام کرده بودم که تابع با آرگومان متغیر نمی تواند ورودی ماکرو داشته باشد (منظور فراخوانی ;(setled(LED_OFF هست) که ضمن عذرخواهی تصحیح می کنم که این عمل امکانپذیر هست.
                گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

                دیدگاه


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

                  سلام دوستان عزیز خسته نباشین
                  یه سوالی داشتم که میدونم جاش اینجا نیست ولی شرمنده
                  وقتی میگیم این تابع یه مقداری رو بر میگردونه کجا برمیگردونه؟؟؟؟ به cpu اعلام میکنه؟؟؟؟
                  تکاور شدن جرات افزون کند.....هراس از دل مرد بیرون کند....


                  تا تکاور به تن زخمی خود جان دارد....مرز اسلام در این ملک نگهبان دارد.........

                  دیدگاه


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

                    خیر. تابع مقدار را به محلی که از آنجا فراخوانده شده برمی گرداند.
                    به کد زیر دقت کنید:
                    کد:
                    uint16_t multiply (uint8_t a, uint8_t b)
                    {
                    	return a*b;
                    }
                    این تابع دو آرگومان یا ورودی 8 بیتی a و b دارد. این تابع یک مقدار 16 بیتی که حاصل ضرب a در b هست را بر می گرداند. برای دسترسی به مقدار برگردانده شده به صورت زیر می نویسیم:
                    کد:
                    uint16_t c;
                    c = multiply(128, 52);
                    گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

                    دیدگاه


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

                      نوشته اصلی توسط Hamed Gh
                      خب به نظر مشکل پیدا شد. در روتین وقفه و در اولین خط متغیری به نام l (ال یا L) نه 1 یا i یا I ، از نوع char تعریف شده و در ادامه مقدار آن برابر LED_OFF که معادل 0 است قرار داده شده. همینطور در آرگومان تابع setled .
                      برای ledها هم باید جهتشان برعکس و به زمین متصل شوند و با خروجی و یک کردن پایه مربوطه led را روشن می کنیم.

                      در ضمن در ارسال قبلی خودم اعلام کرده بودم که تابع با آرگومان متغیر نمی تواند ورودی ماکرو داشته باشد (منظور فراخوانی ;(setled(LED_OFF هست) که ضمن عذرخواهی تصحیح می کنم که این عمل امکانپذیر هست.
                      مهندس متشکرم .واقعا که به نظر مشکل پیدا شد و تمام این فتنه ها زیر سر تصور کردن عدد 1 بجای حرف l (ال) بود.
                      فقط لطف کنید ودر برنامه ارائه شده بفرمایید که به نظر شما کجاها 1 وکجاها l (ال) هست . مثلا من فکر میکنم در تعریف تابع setled تمام شیفت به چپ ها باید 1 باشد یعنی اینجا:void setled(char l) {
                      DDRB&=~((1<<LEDR)|(1<<LEDG)|(1< <LEDB));
                      if ((l==LED_R) && ((blink&4)==0)) DDRB=(1<<LEDR);
                      if ((l==LED_G) && ((blink&2)==0)) DDRB=(1<<LEDG);
                      if ((l==LED_B) && ((blink&1)==0)) DDRB=(1<<LEDB);
                      و لی اینجاl==LED_R و اینجا l==LED_G و اینجا l==LED_B
                      و در اینجا:
                      l=LED_OFF;
                      if ((fanpos)==pos_blue) l=LED_B;
                      if ((fanpos)==pos_green) l=LED_G;
                      if ((fanpos)==pos_red) l=LED_R;
                      باید L باشد

                      دیدگاه


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

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

                        دیدگاه


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

                          سلام همگی خسته نباشید

                          میخواستم بدونم کد ویژن یا اتمل استدیو، هیچ کدوم محیط کنسولی دارن؟ که بشه یه برنامه رو کامپایل کرد و خروجی ها رو نشون بده(مثل ویژوال استدیو)

                          دیدگاه


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

                            نوشته اصلی توسط amirrenjer
                            سلام همگی خسته نباشید

                            میخواستم بدونم کدویژن یا اتمل استدیو، هیچ کدوم محیط کنسولی دارن؟ که بشه یه برنامه رو کامپایل کرد و خروجی ها رو نشون بده(مثل ویژوال استدیو)
                            سلام
                            خیر
                            ولی اتمل استودیو سیمولاتور داره
                            [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
                            معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
                            معرفی نرم افزار Codewizard PWM
                            با من بیشتر آشنا شوید

                            دیدگاه


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

                              سلام
                              دوستان چطور میتونم یه متغییر رو در حافظه فلش ذخیره کنم که در طول برنامه بتونم تغییرش بدم؟
                              مثل متغیر eram در بسکام!

                              دیدگاه


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

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

                                دیدگاه

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