اطلاعیه

Collapse
No announcement yet.

آموزش winavr و avrlib

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

    پاسخ : آموزش winavr و avrlib

    برای کار با ادیتور WinAVR به این پست مراجعه کنید:

    http://www.eca.ir/forum2/index.php?topic=54475.45

    دیدگاه


      پاسخ : آموزش winavr و avrlib

      سلام
      من تو سی تازه کارم.دوستان میتونند این خط برنامه رو برام توضیح بدن.
      DDRD |= (1<<PD0);
      این
      |=
      یعنی چی و این
      1<<PD0
      چه معنی میده؟

      شاد باشید و پیروز

      دیدگاه


        پاسخ : آموزش winavr و avrlib

        نوشته اصلی توسط nanocycle
        سلام
        من تو سی تازه کارم.دوستان میتونند این خط برنامه رو برام توضیح بدن.
        کد:
        DDRD |= (1<<PD0);
        این
        کد:
        |=
        یعنی چی و این
        کد:
         1<<PD0
        چه معنی میده؟
        شاد باشید و پیروز
        سلام
        کد:
        DDRD |= (1<<PD0);
        این دستور معادل دستور زیر است
        کد:
        DDRD = DDRD | (1<<PD0);
        یعنی رجیستر DDRD رو بخوان و OR کن با
        کد:
        (1<<PD0)
        برای سادگی برنامه نویسی به صورت زیر مینویسنش
        کد:
        DDRD |= (1<<PD0);
        ==================================
        کد زیر یعنی
        کد:
        (1<<PD0)
        یک رو به اندازه مقدار PD0 به سمت چپ شیفتش بده
        در اینجا مقدار PD0 صفر است ...
        ==================
        موفق باشید
        [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
        معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
        معرفی نرم افزار Codewizard PWM
        با من بیشتر آشنا شوید

        دیدگاه


          پاسخ : آموزش winavr و avrlib

          سلام
          من یک ماژول hc-srf04 آلراسونیک دارم می خوام تو winavr با تایمر 0 مقدار روشن بودن پایه 1 پورت c را اندازه گیری کنم از کد زیر استفاده می کنم اما جواب نمیگیرم . کد زیر از یک برنامه codevision نوشتم .اشکالش چیه؟
          #include <avr/io.h>
          #include <avr/pgmspace.h>
          #include <avr/interrupt.h>
          #include <util/delay.h>
          #include "timer.h"
          int d=0,i=0;
          float t=0;
          void myovf(void);
          int main(void)
          {
          DDRC=0b0001101;
          PORTC =0b0000000;
          timer0Init();

          timer0SetPrescaler(0);

          timerAttach(TIMER0OVERFLOW_INT,myovf);

          while(1)
          {
          PORTC |=_BV(0);
          _delay_us(20);
          PORTC &=~_BV(0);
          i=0;
          while(PORTC==0b0000000);
          TCNT0=0;
          timer0SetPrescaler(TIMER_CLK_DIV8);
          while(PORTC==0b0000010){}
          timer0SetPrescaler(0);
          t=((i*256)+TCNT0)/2000;
          d=t*170;
          if(d>200)
          {PORTC|=_BV(2);
          _delay_ms(1000);
          }else{
          PORTC|=_BV(3);
          _delay_ms(1000);
          }
          }
          return 0;
          }
          void myovf(void)
          {i++;}
          با تشکر

          دیدگاه


            پاسخ : آموزش winavr و avrlib

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

            http://www.eca.ir/forum2/index.php?t...2770#msg202770




            بعد که دابل کلیک میکنم میره سراغ این:



            دوستان لطفا کمک کنند باید چیکار کنم؟

            دیدگاه


              پاسخ : آموزش winavr و avrlib

              نوشته اصلی توسط alireza_14755
              با سلام
              من میخواستم راه اندازی LCD یاد بگیرم. تمام تنظیمات مطابق اولین پست راه اندازی LCD در همین تایپیک است.ولی ERROR زیر میده.

              http://www.eca.ir/forum2/index.php?t...2770#msg202770




              بعد که دابل کلیک میکنم میره سراغ این:



              دوستان لطفا کمک کنند باید چیکار کنم؟
              کسی توی انجمن نیست به من کمک کنه؟

              دیدگاه


                پاسخ : آموزش winavr و avrlib

                نوشته اصلی توسط alireza_14755
                با سلام
                من میخواستم راه اندازی LCD یاد بگیرم. تمام تنظیمات مطابق اولین پست راه اندازی LCD در همین تایپیک است.ولی ERROR زیر میده.

                http://www.eca.ir/forum2/index.php?t...2770#msg202770




                بعد که دابل کلیک میکنم میره سراغ این:



                دوستان لطفا کمک کنند باید چیکار کنم؟
                کسی توی انجمن نیست به من کمک کنه؟

                دیدگاه


                  پاسخ : پاسخ : آموزش winavr و avrlib - مهاجرت از codevision به winavr avr gcc

                  نوشته اصلی توسط محمد حسینی
                  یه برنامه با adc ینویسیم :
                  #include <avr/io.h>
                  #include <util/delay.h>
                  #include <stdlib.h>
                  #include <string.h>
                  #include "lcd.c"
                  #include "a2d.c"
                  int num;
                  char str[10];
                  int main()
                  {
                  cbi(DDRA, 3); //input
                  cbi(PORTA, 3); //disable pullup
                  lcdInit();
                  a2dInit();
                  a2dSetPrescaler(ADC_PRESCALE_DIV8);
                  a2dSetReference(ADC_REFERENCE_AREF);
                  while(1)
                  {
                  lcdClear();
                  num = a2dConvert8bit(ADC_CH_ADC3); //num = a2dConvert8bit(3);
                  itoa(num, str, 10);
                  lcdPrintData(str,strlen(str));
                  _delay_ms(100);
                  }
                  return 0;
                  }

                  در این برنامه (برای atmega16) از کانال 3 adc برای تبدیل آنالوگ به دیجیتال استفاده شده. بنابراین این پایه رو ورودی و مقاومت پول پ رو هم غیر فعال می کنیم. برای پایه های کنترلی ال سی دی از پایه های 0 و 1 و2 پورت A استفاده شده و چهار پایه 4تا7 پورتA هم خطوط داده ال سی دی رو تشکیل میدن. دیگه معلومه برنامه چیکار میکنه. هر 100 میلی ثانیه ورودی کانال 3 رو می خونه و رو ال سی دی نمایش میده. برای اونایی که c کار نکردن بگم که تابع itoa از هدر stdlib.h (از winavr) یه عدد integer رو به رشته تبدیل میکنه. برای این هدر winavr یه پارامتر سوم هم میخواد که انگار مبنا هست! باید 10 باشه. strlen هم که تو هدر string.h هست، یه رشته میگیره و طول تعداد کاراکترهای اون رو برمیگردونه. بد نیست این دو تا هدر که الان گفتم رو باز کنید و توابع شون رو ببینید.
                  در ادامه میخوایم از وقفه adc استفاده کنیم.
                  دیدیم که a2dConvert8bit همه کارها رو میکنه. یعنی کانال ورودی رو میگیره. عمل تبدیل رو شروع میکنه. منتظر میمونه تا تبدیل انجام بشه. بعد نتیجه رو خروجی میده. اما اگه بخوایم از وقفه استفاده کنیم چی؟
                  a2d.c زو باز کنید و includeها رو ببینین. یه فایل از winavr به نام interrupt.h رو include کرده. دو تابع مهم این فایل sei و cei هست که اولی وقفه ها رو فعال و دومی غیرفعال میکنه. آخرین خط تابع a2dInit رو ببینید که با تابع sei() وقفه سراسری فعال شده.
                  میدونیم که توابع وقفه خروجی ندارن (حتی بصورت void) و ورودیشون هم یه بردار وقفه خاص هست. تابع وقفه مربوط به a2d رو می تونین آخر همین فایل a2d.c پیدا کنید.
                  //! Interrupt handler for ADC complete interrupt.
                  SIGNAL(SIG_ADC)
                  {
                  // set the a2d conversion flag to indicate "complete"
                  a2dCompleteFlag = TRUE;
                  }

                  SIG_ADC بردار وقفه adc است. یه توضیحی بدم که از کجا اومده. گفته بودیم ما تو هر برنامه هدر io.h رو include می کنیم. این هدر هم با توجه به mfile تشخیص میده که از چه آی سی میخوایم استفاده کنیم و هدر مربوط به اون رو فراخوانی میکنه. (مثلا iom16.h برای atmega16). و تو هدر مربوط به اون آی سی خاص، این بردارهای وقفه و رجیسترها و آدرس ها و... وجود داره.
                  اطلاعات ما از adc اینه که بعد از فعال کردن بیت مربوط به شروع عملیات تبدیل (تابع a2dStartConvert رو ببینین) ، مقدار آنالوگ به دیجیتال تبدیل میشه و در پایان تبدیل، وقفه فعال میشه. فعلا تو این وقفه فقط یه خط کد هست که پایان عملیات تبدیل رو اعلام میکنه. تغییرش میدیم :
                  SIGNAL(SIG_ADC)
                  {
                  // set the a2d conversion flag to indicate "complete"
                  num = inb(ADCL) | (inb(ADCH)<<8);
                  num = num>>2;
                  a2dCompleteFlag = TRUE;
                  a2dStartConvert();
                  }

                  خط اول مقدار تبدیل یافته رو از رجیسترها می خونه و تو متغیر num مینویسه (رجوع کنید به خط آخر تابع a2dStartConvert10bit). در خط یعد، 2 بیت شیفت دادیم به راست که 2 بیت کم ارزش حذف بشه (میخوایم 8 بیت بشه). خط آخر هم دوباره عملیات تبدیل رو شروع میکنه. منظور اینه که عملیات تبدیل بدون دخالت ما توسط وقفه انجام میشه. یعنی اگه یه برنامه پیچیده ای داشتیم، adc رو میدیم به وقفه خودش و هرموقع که خواستیم متغیر num رو میخونیم. ضمنا متغیر num رو هم باید تو همون فایل lcd.c تعریف کنید (بعد از includeها).
                  کد برنامه مون اینطوری میشه :
                  #include <avr/io.h>
                  #include <util/delay.h>
                  #include <stdlib.h>
                  #include <string.h>
                  #include "lcd.c"
                  #include "a2d.c"

                  char str[10];

                  int main()
                  {
                  cbi(DDRA, 3);
                  cbi(PORTA, 3);
                  lcdInit();
                  a2dInit();
                  a2dSetPrescaler(ADC_PRESCALE_DIV8);
                  a2dSetReference(ADC_REFERENCE_AREF);
                  a2dSetChannel(ADC_CH_ADC3);
                  a2dStartConvert();
                  while(1)
                  {
                  lcdClear();
                  itoa(num, str, 10);
                  lcdPrintData(str,strlen(str));
                  _delay_ms(100);
                  }
                  return 0;
                  }

                  همینطور که می بینید باید از دو تابع a2dSetChannel و a2dStartConvert استفاده کنیم و اینا رو بی دلیل تعریف نکرده.
                  رسیدیم به پایان قسمت سوم. امیدوارم مفید بوده باشه. موفق باشید. منم دعا کنید ...
                  من همه این کدها رو نوشتم اما هنگام کامپایل برنامه یک error داد و اون این بود :

                  error a2d.h:140: error: expected '=', ',', ';', 'asm' or 'attribute' before ' a2dIsComplete'1

                  ! return TRUE if conversion is complete//
                  u08 a2dIsComplete(void) ; .f



                  و خدا را شکر مشکل با اضافه کردن فایل هدر global.h به ابتدای کدها حل شد اینجوری:


                  <#include <avr/io.h>
                  #include "global.h"
                  #include <util/delay.h>
                  #include <stdlib.h>
                  #include <string.h>
                  #include "lcd.c"
                  #include "a2d.c

                  دیدگاه

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