اطلاعیه

Collapse
No announcement yet.

[آموزش] فیلم های آموزش AVR

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

    پاسخ : [آموزش] فیلمآ‌های آموزش AVR

    با سلام خدمت استاد کی نژاد من برنامه جلسه 14 رو تو محیط codevision و IAR نوشتم ولی تو هر دو محیط این خطا رو میده :sad:
    Error[Pe020]: identifier "DDB3" is undefined
    Error[Pe020]: identifier "PORTB0" is undefined
    Error[Pe020]: identifier "COM00" is undefined
    Error[Pe020]: identifier "CS02" is undefined
    Error[Pe020]: identifier "CS01" is undefined
    Error while running C/C++ Compiler
    متن برنامه اینه مشکل از چیه من تمام موارد رو چک کردم نمی دونم دیگه چی کار کنم
    در IAR:
    کد:
    #include <ioavr.h>
    void main()
    {
      DDRB=(1<<DDB3);
      PORTB=(1<<PORTB0);
      OCR0=100;
      TCCR0=(1<<COM00)|(1<<CS02)|(1<<CS01); 
      while(1);
    }
    در کدویژن :
    کد:
    #include <mega32.h>
    void main()
    {
      DDRB=(1<<DDB3);
      PORTB=(1<<PORTB0);
      OCR0=100;
      TCCR0=(1<<COM00)|(1<<CS02)|(1<<CS01); 
      while(1);
    }
    [hr]
    دوستان من برای برطرف کردن خطا در کدویژن با توصیه دوستان کدویژن با ورژن بالاتر رو نصب کردم و خطا ها از بین رفت ، اما مشکل با IAR همچنان پا برجاست :sad: برای استفاده دوستان نیز لینک رفع مشکل این خطا رو در زیر می تونید ببینید :
    http://www.eca.ir/forum2/index.php?topic=92010.0
    خداوند بی نهایت است اما به قدر نیاز تو فرود می آید ، به قدر آرزوی تو گسترده می شود و به قدر ایمان تو کارگشاست.
    [hr]

    دیدگاه


      پاسخ : [آموزش] فیلمآ‌های آموزش AVR

      امین جان دوست من هم همین مشکلو داشت
      این ورژن کد وِیژن رو دانلود کن CodeVisionAVR V2.05.3
      .The best question deserves a better answer
      =-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=
      «پناه»می برم «به خدا»
      از عـیبی که ، «امروز» در خود می بینم، و «دیروز» «دیگران را» به خاطر، «هـمان عیـب» ملامت کرده ام.
      محتاط باشیم، در «سرزنش» و «قضاوت کردن دیگران». وقتی نه از «دیروز او» خبر داریم و نه از "فردای خودمان" .

      دیدگاه


        پاسخ : [آموزش] فیلمآ‌های آموزش AVR

        سلام حضور مهندس کی نژاد و دیگر دوستان
        یک سوال دارم که حتی مطرح کردنش هم آسون نیست . امیدوارم بتونم منظورمو درست انتقال بدم:
        در مثالی که در مورد وقفه داخلی هست(در جلسه 29) در قسمتی از برنامه که وقفه تایمر 0 اتفاق میفته خطی از برنامه به این شکل هست
        کد:
         static unsigned char select=0;
         static unsigned char x20=0;
         unsigned char temp , i;
        
         #asm("sei");
        
         PORTA|=(1<<PORTA6)|(1<<PORTA5)|(1<<PORTA4)|(1<<PORTA3)|(1<<PORTA2)|(1<<PORTA1)|(1<<PORTA0);
        
         if (select)PORTC =display_codes[digits[select-1]];
        
         else PORTC=leds;
        
         PORTA &=~(1<<select);
        
         if(++select==7)select=0;

        همونطور که در این کد مشخصه در صورتی که شرط select برقرار باشه عددی که مکانه اون عدد توسط select تعیین میشه در آرایه digits قرار میگیره و روی پورت c نمایش داده میشه

        از طرف دیگه در حلقه اصلی برنامه این کد هست :

        کد:
         while(1)
         {
         if (key_code!=nokey_code)
         {
          leds=1; // Turn on LED if any key pressed
          counter=0; // Reset counter
         }
         else leds=0;
        
         counter_copy=counter;
         for (i=0;i<6;i++)
         {
          digits[i]=counter_copy%10;
          counter_copy/=10;
         }
         }


        خوب در این حلقه for هم آرایه digits مقدار دهی میشه

        فرض کنیم عدد 5 توسط حلقه اصلی در آرایه 0 digits به این شکل قرار میگیره

        digits[0 =5

        از طرف دیگه در زیر روتین وقفه مقدار select در وقفه اول 1 خواهد شد با توجه به اینکه مقدار select آرایه digits رو تغییر میده به digits{0 که خود اون همه عدد درون آرایه display _dodes که 0 هست تغییر خواهد داد

        سوال من این هست:
        با توجه به اینکه آرایه digits دو مقدار در دو سطح از برنامه داره چطور قابل توجیه هست ؟ چون قرار بوده مقدار 5 از راست به چپ نمایش داده بشه نه مقدار 0 در آرایه display_codes[]


        امیدوارم درست مشکل رو منتقل کرده باشم :smile:

        لینک دانلود برنامه counter_0 بطور کامل برای بقیه دوستان :

        http://s5.picofile.com/file/8121807850/AVR_Counter0.rar.html


        دیدگاه


          پاسخ : [آموزش] فیلمآ‌های آموزش AVR

          در روتین نمایش تغییری در آرایه []display ایجاد نمی شود و به اعضای آن فقط دسترسی ایجاد می شود (تعیین و تغییر اعضای آرایه در حلقه while انجام می شود). بنابراین ممکن است در لحظه جاری مثلا عضو 0 آرایه در حال نمایش باشد، اما عضو 4 آرایه در حال تعیین وضعیت باشد که این مسئله مشکل خاصی را در نمایش ایجاد نمی کند.
          اوژن: به معنای افکننده و شکست دهنده است
          دانایی، توانایی است-Knowledge is POWER
          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

          دیدگاه


            پاسخ : [آموزش] فیلمآ‌های آموزش AVR

            جناب مهندس اگه امکان داره در جلسه ای نحوه نوشتن صحیح کتابخانه در محیط کد ویژن و اتمل استودیو رو توضیح بدید.
            تشکر فراوان از استاد.
            .The best question deserves a better answer
            =-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=
            «پناه»می برم «به خدا»
            از عـیبی که ، «امروز» در خود می بینم، و «دیروز» «دیگران را» به خاطر، «هـمان عیـب» ملامت کرده ام.
            محتاط باشیم، در «سرزنش» و «قضاوت کردن دیگران». وقتی نه از «دیروز او» خبر داریم و نه از "فردای خودمان" .

            دیدگاه


              پاسخ : [آموزش] فیلمآ‌های آموزش AVR

              با سلام
              ابهامی که برای بنده در رابطه با نمونه کدی که در رابطه با at24c04 قرار دادین این هستش.
              کد:
              unsigned char eeprom_write_address8(unsigned char address, unsigned char data)
              {
               TWI_start();
               if (status() != 0x08) return 0;
               TWI_write(0xA0|(EEPROM_ADDRESS<<1));
              ...
              }
              همنطور که گفتین علت شیفت به چپ برای قرار گرفتن ادرس eeprom در محل مناسب خودش هست که بیت اول که رید رایت بار هست برای عملیات نوشتن در این تابع صفر بمونه.
              کد:
              unsigned char eeprom_read_address8(unsigned char address, unsigned char *data)
              {
               TWI_start();
               if (status() != 0x08) return 0;
               TWI_write(0xA0|(EEPROM_ADDRESS>>1));
               }
              اما در این تابع برای وارد کردن ادرس at24c04 ایپرام ادرس رو شیفت به راست کردین(فرض کنیم ادرس epprom بنده 0xa2 باشه)...
              علت تفاوت این دو خط چیه؟
              تشکر./
              .The best question deserves a better answer
              =-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=
              «پناه»می برم «به خدا»
              از عـیبی که ، «امروز» در خود می بینم، و «دیروز» «دیگران را» به خاطر، «هـمان عیـب» ملامت کرده ام.
              محتاط باشیم، در «سرزنش» و «قضاوت کردن دیگران». وقتی نه از «دیروز او» خبر داریم و نه از "فردای خودمان" .

              دیدگاه


                پاسخ : [آموزش] فیلمآ‌های آموزش AVR

                EEPROM_ADDRESS وضعیت پین های آدرس است که در این صورت مسئله مقدار آن صفر است و به دلیل قرار داشتن در محل بیت های 1 تا 3 در هر دو تابع خواندن و نوشتن باید به چپ شیفت داده شود. بناراین همان اپراتور شیفت به چپ صحیح است که در تابع خواندن از حافظه باید تصحیح شود و سهوا به این صورت نوشته شده است. البته در این مثال به دلیل صفر بودن این مقدار در عمل مشکلی ایجاد نشده است. برنامه تصحیح شده در لینک زیر قرار دارد:

                knowledgeplus.ir/userfiles/CV_TWI_24c02_0_.rar

                اما در مورد سوال شما، آدرس حافظه ربطی به EEPROM_ADDRESS که مربوط به وضعیت پین های آدرس است ندارد و آدرس مورد نظر به عنوان یکی از ورودی های توابع خواندن و نوشتن به تابع ارسال می شود.
                اوژن: به معنای افکننده و شکست دهنده است
                دانایی، توانایی است-Knowledge is POWER
                برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                دیدگاه


                  پاسخ : [آموزش] فیلمآ‌های آموزش AVR

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

                  سوال اول- در مورد این خط از برنامه لطفا یک توضیحی داده بشه اینکه چطور با این روش چک کردن پرچم وقفه از ارسال مطمئن میشیم . ایا باید کلا" این خط از برنامه حفظ بشه و هرجا نیاز به چک کردن یک پرچم بود استفاده بشه یا اینکه یک فرمول مشخصی برای این موارد هست (که البته هست)

                  کد:
                  while(!(UCSRA & (1<<TXC)));
                  من اموزش های زیادی در مورد کد نویسی c و آموزش کدویژن خوندم متاسفانه خیلی کلی در مورد دستورات توضیح دادن و بخصوص در مورد این نوع کد نویسی توضیحی داده نشده . لطفا" اگر منبعی وجود داره معرفی کنید .

                  سوال دوم - در مورد خود دستور while ; در آموزش ها گفته شده که برنامه منتظر می مونه هر زمان که ارسال usart انجام بشه دستورات بعد از while اجرا خواهند شد . اما در جزوه های آموزشی توضیحی که در مورد دستور while دادند این هست که اگر شرط while درست بود دستورات بعد اجرا و اگر نبود از حلقه خارج میشه . در این مورد هم لطفا" یک توضیح بدید . با سپاس از شما

                  دیدگاه


                    پاسخ : [آموزش] فیلمآ‌های آموزش AVR

                    سوال اول - اگر از داخلی ترین پرانتز شروع کنیم 1 رو به اندازه مقدار TXC (مثلا 6) به چپ شیفت داده (01000000) و با مقدار UCSRA اند (and) می شود. اگر نتیجه 0 شد بیت مورد نظر در رجیستر 0 است در غیر این صورت بیت مورد نظر 1 است. در ادامه یک ! (not) وجود دارد که نتیجه عملیات را معکوس می کند یعنی اگر بیت 0 بود داریم ;(while(1 و برنامه در حلقه می ماند تا بیت مورد نظر 1 شود.

                    برای راحتی در استفاده می توان از ماکرو استفاده کرد:
                    کد:
                    #define Wait_bit_is_clear(port,bit) while(!(port & (1<<bit)))
                    #define Wait_bit_is_set(port,bit)  while(port & (1<<bit))
                    این کدها در نمونه کدهای داخل دیتاشیت وجود دارد و بهترین منبع مطالعه کتابخانه ها و سورس کدهاست.

                    سوال دوم -
                    کد:
                    while(x);
                    تا زمانی که شرط غیر صفر باشد خط تکرار می شود
                    while(x)
                    {
                    }
                    تا زمانی که شرط غیر صفر باشد حلقه تکرار می شود
                    do
                    {
                    }while(x);
                    دستورات حداقل یکبار اجرا می شوند و تا زمانی که شرط غیر صفر باشد حلقه تکرار می شود
                    گاهی افرادی به موفقیت های بزرگ می رسند، تنها به این دلیل ساده که نمی دانند کاری که به آن دست زده اند بسیار دشوار، بلکه غیر ممکن است.

                    دیدگاه


                      پاسخ : [آموزش] فیلمآ‌های آموزش AVR

                      مرسی آقا حامد خیلی خوب توضیح دادید

                      دیدگاه


                        پاسخ : [آموزش] فیلمآ‌های آموزش AVR

                        جناب مهندس کی نژاد گرامی
                        سوالی که از شما داشتم و همچنین پیشنهادم این هست که چرا در تهیه فیلم های آموزشی که همه ما قبول داریم بسیار پرزحمت هست از تکنیک های ادیت فیلم استفاده نمیکنید . من در تمام این هفتاد قسمت ندیدم که جایی از فیلم قطع بشه . به نظر من اگر به هر دلیلی در قسمتی از 10- 20 دقیقه هر جلسه اشکالی در ضبط بوجود میاد اشکالی نداره که همون قسمت بریده و دوباره ضبط بشه . بخصوص در موارردی که اموزش از طریق صفحه مونیتور هست .مهم محتوای اموزش هاست که واقعا" ارزشمند هستن. به نظر من هم ضبط 400 قسمت فیلم برای 70 قسمت واقعا" سخت هست . فکر میکنم همونطور که گفتم اگر بشه هر قسمت فقط یک یا دو بار ضبط بشه و قسمت های مشکل دار حذف و فیلم مونتاژ بشه هم درد سر های شما کم میشه و هم فرصت یشتری دارید که بتونید ادامه بدید
                        دلیل ین ارسالم این هست که مدتی هست که این ویدیو ها متوقف شدن . من از اونجایی که بعد از پایان دانشگاه و فارغ شدن از پاس کردن درس ها از طریق این فیلم های آموزشی و مابع دیگه شروع به یادگیری الکترونیم کردم کاملا" پیگیر هستم . همینجا ضمن تشکر بی اندازه از شما میخوام بگم که اگر لازم هست که کیفیت فدای کمیت بشه( از نظر من و احتمالا" خیلی ها)بدون اشکال هست

                        دیدگاه


                          پاسخ : [آموزش] فیلمآ‌های آموزش AVR

                          در قسمت هایی عملیات edit برای چسباندن دو بخش و یا حذف یک کلمه و مانند آن انجام شد. اما این روش هم در عمل به همان نسبت ضبط مجدد فیلم وقت گیر بود. در مورد توقف قرار دادن فیلم ها، علت آن گرفتاری کاری متمرکزی بود که از ابتدای سال داشتم و اکنون زمان بیشتری در اختیار است که بر مبنای آن بزودی بخش های جدید فیلم ها قرار داده خواهد شد.
                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


                            پاسخ : [آموزش] فیلمآ‌های آموزش AVR

                            سلام به همه اساتید
                            یک سوال درباره این خط از برنامه نمونه TWI دارم
                            در این خط از برنامه
                            ;(((while (!(TWCR & (1<<TWINT
                            نتیجه پرانتز 01111111 است،معنی این مقدار برقراری شرط while هست یا عدم برقراری اون؟
                            و اینکه چه لزومی به نوشتن این خط برنامه است زیرا در هر صورت این خط از برنامه مانعی رو برای رسیدن یا نرسیدن به خط های بعد ایجاد نمی کند!!!

                            دیدگاه


                              پاسخ : [آموزش] فیلمآ‌های آموزش AVR

                              در صورت صفر بودن بیت TWINT، حاصل and شدن یک کپی از رجیستر TWCR با مقدار دوم برابر صفر می شود و علامت ! سبب می شود مقدار کلی داخل while غیر صفر شود. بنابراین تا زمان یک شدن TWINT مقدار داخل while غیر صفر باقی می ماند و برنامه در اجرای while متوقف می ماند و از آن عبور نمی کند.
                              اوژن: به معنای افکننده و شکست دهنده است
                              دانایی، توانایی است-Knowledge is POWER
                              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                              دیدگاه


                                پاسخ : [آموزش] فیلمآ‌های آموزش AVR

                                با سلام
                                راستش مطمئن نیستم جای مطرح کردن سوال درست باشه
                                مثال مربوط به بحث TWI رو با کمک یک MEGA32A مطابق با این میکروکنترلر اجرا کردم اما مشکلی که وجود داره این هست که دریافت اطلاعات صفحه کلید خیلی خیلی دیر انجام میشه به عبارت دیگه بار ها کلید ها رو فشار میدم تادر یک لحظه نامعلوم یک عدد نمایش داده بشه
                                این رو هم بگم که همه تنظیمات مطابق با این آی سی انجام شده(ازنظر فرکانس و...) ولی برای نمایش از کتابخانه alcd استفاده شده و در نمایش اطلاعات مشکلی وجود نداره تنها مشکل کند بودن خیلی زیاد هست

                                سوال دوم این هست که دلیل استفاداه از کتابخانه lcd_v2 چی هست آیا امکانی در اون هست که در کتابخانه alcd نیست ؟ یا این کار تنها برای آموزش هست؟

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

                                در ابتدای حلقه WHILE (در برنامه تطبیق داده شده با مگا32 ) قبل از SWITCH و بعد از آخرین IF این خطوط اضافه شد

                                کد:
                                if (temp_key_code!=NOKEY_CODE)
                                  {
                                   PORTB^=(1<<PORTB0); 
                                   delay_ms(1000);
                                   PORTB^=(1<<PORTB0);
                                  switch (temp_key_code)
                                این کار برای تست توسط ال ای دی بود که مشخص شد در خیلی مواقع برنامه اصلا" به این نقطه نمیرسه به عبارت دیگه کد صفحه کلید با اختلال برگشت داده میشه

                                ضمنا: ذخیره در eeprom هم بدون مشکل هست .کلا" همه چیز ok هست بجز سرعت وااقعا" پایین

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

                                دیدگاه

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