اطلاعیه

Collapse
No announcement yet.

ایجاد گیت منطقی با میکرو کنترلر AVR

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

    ایجاد گیت منطقی با میکرو کنترلر AVR

    سلام بر شما دوستان گلم
    من می خواستم گیت And رو تو میکرو بیارم و دو سری کد نوشتم که اگه b0 &b1=C2 به شرح زیر
    کد:
    #include <stdio.h>
    #include <mega8.h>
    
    void main(void)
    {                  
     DDRB= (1>>DDB0)| (1>>DDB1);
      DDRC= (1<<DDC2);
    while (1)   {
    if ( PORTB == 0x03 ) {
    PORTC.2=1 ; } 
    else{
     PORTC.2 = 0 ;
    }
    }
    }
    و یکی دیگه
    کد:
    #include <stdio.h>
    #include <mega8.h>
    
    void main(void)
    {                  
     DDRB= (1>>DDB0)| (1>>DDB1) ;
     DDRC = (1<<DDC0) ;
    while (1)   {
    PORTC.2 = PORTB.1 && PORTB.0
    }
    }
    هیچ ارور هم نمیده تو پروتوئوس و عمل هم که میبندم کار نمیکنه :|
    از دوستان عزیز و با سوادم میخوام که بیان و بگن مشکل من کجای بزنامه نویسی هست و باید چجوری این برنامه رو مینوشتم @};-
    رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

    #2
    پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

    سلام
    قطعه کد دوم بهتره...اینکه کامپایلر ارور نمیده به این خاطره که اشتباه سینتکس ندارید ولی اگه دقت کنید شما بیت های 0 و 1 رجیستر DDRB رو ست کردید یعنی مقدار 1 دارند و این یعنی پین های 0و1 پورت B خروجی هستند درحالی که باید ورودی شوند...اون دو بیت رو صفر کنید برنامه تون درست کار میکنه...
    تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

    www.intelart.ir


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

    دیدگاه


      #3
      پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

      اول از همه یه سوالی دارم مگه DDR ورودی و خروجی رو مشخص نمی کنه؟ آخه یادمه قبلا میگفتن برای تعریف ورودی خروجی هست نه برای ست و ریست کردن....
      مورد دوم هم اینکه من کاری رو که شما فرمودین رو کلا روی تمام پین ها انجام دادم یعنی به جای DDB<<1 کردمش DDB>>1 اما بازم مدارم کار نکرد :sad:
      رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

      دیدگاه


        #4
        پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

        سلام هر پایه ای رو میخای ورودی کنی به رجیستر DDR اون پایه مقدار صفر بده و برای خروجی تعریف کردن 1 بده
        مثلا پایه D.1 ورودی باشد
        DDRD.1=0;

        دیدگاه


          #5
          پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

          چرا اینجا هرکسی میاد یه حرفی میزنه یکی میاد میگه با DDR ورودی خروجی میکنن یکی میاد میگه باهاش ست ریست میکنن
          نوشته اصلی توسط pouyaojaghi
          سلام هر پایه ای رو میخای ورودی کنی به رجیستر DDR اون پایه مقدار صفر بده و برای خروجی تعریف کردن 1 بده
          مثلا پایه D.1 ورودی باشد
          DDRD.1=0;
          اینکاری هم که شما فرمودین انجام دادم اما نشد! یعنی تمام پین هام رو به این صورت که شما فرمودید تعریف کردم اما باز هم همون آش و همون کاسه
          رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

          دیدگاه


            #6
            پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

            اگه بخام 2تا ورودی داشته باشم که اگه جفتشون یک بودن شرط اجرا شه مینویسم
            کد:
            if(pina.0 & pina.1)
            }
            دستورات خواسته شده
            {
            و در کل

            کد:
            #include <stdio.h>
            #include <mega8.h>
            
            void main(void)
            {                   
             DDRC = (1<<DDC0) ;
            while (1)   {
            PORTC.2 = PINB.1 & PINB.1
            }
            }


            کد:
            #include <stdio.h>
            #include <mega8.h>
            
            void main(void)
            {                  
               DDRC= (1<<DDC2);
            while (1)   {
            if ( PINA == 0x03 ) {
            PORTC.2=1 ; } 
            else{
             PORTC.2 = 0 ;
            }
            }
            }
            .The best question deserves a better answer
            =-=-=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=
            «پناه»می برم «به خدا»
            از عـیبی که ، «امروز» در خود می بینم، و «دیروز» «دیگران را» به خاطر، «هـمان عیـب» ملامت کرده ام.
            محتاط باشیم، در «سرزنش» و «قضاوت کردن دیگران». وقتی نه از «دیروز او» خبر داریم و نه از "فردای خودمان" .

            دیدگاه


              #7
              پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

              دوست عزیز ست شدن یک بیت از یک رجیستر یعنی اینکه مقدارش 1 باشه...نه اینکه اون پین 1 بشه!!!!!
              ببین تو میخوای 2تا ورودی داشته باشی و اون هارو And کنی و خروجی رو یک پین دیگه نشون بدی...پس باید دوتای اولی ورودی و آخری خروجی تعریف بشن...

              مورد دوم هم اینکه من کاری رو که شما فرمودین رو کلا روی تمام پین ها انجام دادم یعنی به جای DDB<<1 کردمش DDB>>1 اما بازم مدارم کار نکرد
              DDB<<1 : یعنی اینکه DDB را به اندازه 1 به چپ شیفت بده!....این معنی داره؟
              DDB>>1 :این یعنی اینکه 1 را به اندازه DDB به راست شیفت بده...

              اصولا اگه میخوای یک بیت از یک رجیستر رو 1 کنی و از شیفت استفاده کنی باید اینطور بنویسی:
              کد:
              PORTB = (1<<PB0) | (1<<PB3) | (1<<PB5);
              این یعنی عدد یک رو به اندازه PB0,PB3,PB5 به چپ شیفت بده و بایت های حاصل رو با هم Or کن...
              اگه هم میخوای که صفر بشه باید اینطور بنویسی :

              کد:
              PORTB&= ~(1<<PB0) | (1<<PB3) | (1<<PB5);
              این کد بیت های PB0,PB3,PB5 رو 0 میکنه و بقیه هم دست نخورده میمانند..
              حالا اگه میخوای کلا پورت B ورودی باشه نیازی نیست اصلا به رجیستر DDRB مقدار بدی چون پیشفرضش 0x00 هست...

              در ضمن And منطقی(&&amp رو نباید با And انتسابی(&amp اشتباه بگیری
              این دیگه یاید درست کار کنه :

              کد:
              #include <stdio.h>
              #include <mega8.h>
              
              void main(void)
              {                  
               
               DDRC = (1<<DDC0) ;
              while (1) 
              {
              PORTC.2 = PORTB.1 & PORTB.0;
              }
              }
              تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

              www.intelart.ir


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

              دیدگاه


                #8
                پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

                جناب •.´™ مَسِِــــح`.• از بابت تصحیح کدتون ممنون و همچنین جناب punisher.x64 بابت توضحیاتتون واقعا ممنونم دید منو نسبت به میکرو عوض کردین فقط یه سوالی مونده اونم اینکه به ما توی دانشگاه جزوه گفتن هنگامی که DDX رو به سمت چپ شیفت بدی میشه خروجی و به سمت راست شیفت بدی میشه ورودی منتها با این توضیحات منطقی که شما فرمودین من فکر می کنم سخت در اشتباه باشم اگه ممکنه لطف بفرمایئد یه توضیحی در مورد این شیفت دادن DDx بدین یا یه لینک معرفی کنید من هرچی تو نت گشتم چیز مفیدی گیر نیاوردم
                @};-
                رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

                دیدگاه


                  #9
                  پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

                  خواهش میکنم دوست عزیز...خوشحالم که تونستم کمکی کرده باشم...
                  ببین کلا شیفت دادن یعنی حرکت دادن بیت های یک مقدار یه اندازه دلخواه ما به چپ یا راست...
                  درس دیجیتال دیزاین رو خوندین دیگه...حتما در مورد شیفت رجیستر هم مطالبی مطالعه کردین....
                  بزار خلاصه و مفید بگم
                  فرض کن یه متغیر داری (تعداد بیت هاش مهم نیست 8یا 16 یا ....) مثلا:
                  کد:
                  unsigned char a=0x59;
                  اگه بخوایم a رو باینری ببینیم اینطور میشه :

                  کد:
                  a=0b01011001;
                  حالا فرض کن که به ما میگن a رو 4تا به چپ و 3 تا به راست شیفت بدید
                  نتیجه این میشه :

                  کد:
                  b1=a<<4
                  
                  b2=3>>a
                  مقدار b1 و b2 میشه :
                  کد:
                  b1=0b10010000
                  
                  b2=0b00001011
                  حالا فرض کن یه رجیستر از قبل مقدار دهی شده و ما میخوایم یک یا چند بیت خاص از اون رو تغییر بدیم ولی بقیه بیت ها مقدار قبلیشون رو داشته باشن
                  مثلا:
                  کد:
                  ADMUX=0x23=0b00100011
                  میخوایم بیت اول و ششم رو 0 کنیم ولی بقیه سرجاشون باشن:
                  کد:
                  ADMUX&=~(1<<ADLAR|1<<MUX0)
                  دیدی؟باید اسم بیتهای داخل رجیستر رو بلد باشی...کد بالا میاد اول یه مقدار 0b00100001 میسازه بعد مکملش میکنه : 0b11011110 و مقدار مکمل شده رو با رجیستر AND انتسابی میکنه....به همین سادگی

                  حالا میخوایم بیت سوم و هشتم رو 1 کنیم :

                  کد:
                  ADMUX|=(1<<REFS1|1<<MUX2)
                  دوباره مثل قبل اول مقدار باینری 0b10000100 رو میسازیم و با رجیستر ذکر شده Or انتسابی میکنیم...
                  دقت کن عملگر انتسابی با منطقی فرق میکنه...

                  بازم سوالی بود هستم... :nice:

                  تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                  www.intelart.ir


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

                  دیدگاه


                    #10
                    پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

                    جناب punisher.x64 ضمن تشکر دوباره؛ اما الان من به یه تناقض خوردم
                    ببین مگه پین های میکرو بصورت دیفالت ورودی نیستند؟ یعنی ریجستر DDR اون با 0x00 پر شده حالا سوال اینه که وقتی اون یه بیت از این ریجستر رو شیفت می دیدم عملا نباید عدد صفر تغییری بکنه ((طبق قانون برنامه C که اگه یه بایت رو شیفت بدیم هر "1" که بیرون از بایت بیافته صفر میشه)) یعنی باید باز ورودی بمونه اما میبینیم که با شیفت دادن اون بیت میان پین رو خروجی میکنن یعنی مثلا با DDA<<1 میان اون پین رو بصورت خروجی تعریف میکنن درحالی که بیت اون ریجستر چون صفر هست نباید با شیفت تغییری بکنه، چرا اینجوری میشه ؟ @};-
                    رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

                    دیدگاه


                      #11
                      پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

                      شما میگید اگه یه رجیستر داریم که مقدارش 0x00 هست و میخوایم یکی از بیت هاش رو 1 کنیم...همچنین این رو هم میدونیم که شیفت دادن 0 کار بی نتیجه ای هست و آخرش همون 0 میمونه...درست متوجه شدم؟

                      ولی ما که نمیایم یکی از بیت ها رو شیفت بدیم...ما یه مقدار که تعداد بیت هاش با تعداد بیت های رجیسترمون (اینجا 8بیت) برابر باشه رو طوری که مد نظرمون هست میسازیم و مقدار رجیستر رو با عدد 8بیتی که ساختیم برابر میکنیم...هیچ وقت نمیایم یکی از بیت های خودشو شیفت بدیم....
                      نمیدونم منظور شما رو درست متوجه شدم یا نه...

                      مثلا با DDA<<1 میان اون پین رو بصورت خروجی تعریف میکنن
                      اینطوری که اصلا یه چیز بعنی هست و کامپایلر خطا میده...
                      اگه با این روش میخواین خروجی کنید باید اینطور بنویسید :

                      کد:
                      PORTA=DDA2<<1
                      شما فکر میکنید که در حالت پیشفرض DDA2=0 هست؟
                      اگه اینطور فکر میکنید باید بگم که اشتباهه...مقدار DDA2 همیشه و در همه حال 2 هست!
                      ببینید DDa2 مقدار 2 داره و آدرس بیت 2 از رجیستر DDRA هست...
                      یعنی وقتی میگید PORTA=DDA2<<1 به کامپایلر میگید که DDA2 ( که مقدار عددیش 2 هست )رو یکی به چپ شبفت بده...نتیجه چی میشه؟تو ذهنت تصور کن متوجه میشی...
                      عدد 2 که به باینری 0b10 میشه رو یکی به چپ شیفت میده...نتیجه : DDRA=0b00000100
                      تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                      www.intelart.ir


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

                      دیدگاه


                        #12
                        پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

                        نوشته اصلی توسط punisher.x64

                        شما فکر میکنید که در حالت پیشفرض DDA2=0 هست؟
                        اگه اینطور فکر میکنید باید بگم که اشتباهه...مقدار DDA2 همیشه و در همه حال 2 هست!
                        DDA مگه یه بیت نیست، آخه چطور ممکنه توی یدونه بیت مبنای 2 عدد 2 رو بنویسیم ؛ در حالی که کری نداریم؟
                        نوشته اصلی توسط punisher.x64

                        ببینید DDa2 مقدار 2 داره و آدرس بیت 2 از رجیستر DDRA هست...
                        یعنی وقتی میگید PORTA=DDA2<<1 به کامپایلر میگید که DDA2 ( که مقدار عددیش 2 هست )رو یکی به چپ شبفت بده...نتیجه چی میشه؟تو ذهنت تصور کن متوجه میشی...
                        عدد 2 که به باینری 0b10 میشه رو یکی به چپ شیفت میده...نتیجه : DDRA=0b00000100
                        با این منوال وقتی یه بیت رو به سمت چپ شیفت بدی باید بره روی بیت بعدی، درست میگم؟ مثلا WMG00 رو وقتی بنویسم 1>>WMG00 یعنی در اصل ما داریم WMG01 رو خروجی میکنیم؟ امیدوارم درست منظورتون رو فهمیده باشم...
                        رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

                        دیدگاه


                          #13
                          پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

                          کد:
                          /* DDRB */
                          #define DDB7	7
                          #define DDB6	6
                          #define DDB5	5
                          #define DDB4	4
                          #define DDB3	3
                          #define DDB2	2
                          #define DDB1	1
                          #define DDB0	0
                          اینایی که گذاشتم رو عینا از داخل فایل کانفیگ مگا8 برداشتم....
                          میبینی؟تمام رجیسترها و بیت های داخلشون با یه عدد تعریف میشن...تو اصلا میتونی با دستکاری فایل کانفیگ اسم DDRA رو حذف کنی و به جاش یه چیز دلخواه بذاری...
                          مثلا نوشته :
                          کد:
                          #define DDB1	1
                          اینا به دستورات پیش پردازنده معروف اند...یعنی آقای کامپایلر(شایدم خانومه) هر جا دیدی نوشتن DDB1 به جاش عدد 1 بذار....

                          با این منوال وقتی یه بیت رو به سمت چپ شیفت بدی باید بره روی بیت بعدی، درست میگم؟ مثلا WMG00 رو وقتی بنویسم 1>>WMG00 یعنی در اصل ما داریم WMG01 رو خروجی میکنیم؟ امیدوارم درست منظورتون رو فهمیده باشم...
                          اشتباهه!..چرا؟
                          چون که ما نمیایم خود عدد رو دوباره بذاریم به اندازه 1 به چپ شیفت میدیم دیگه...تو همین دیفاین های بالا رو نگاه کن ....مثلا میخوایم پین شماره 1(پین دوم) از پورت B رو خروجی کنیم...
                          اگه اینطور بنویسیم :
                          کد:
                          DDRB=DDB1<<1
                          مقدار باینری 8بیتی DDB! میشه 0b00000001
                          حالا به اندازه یکی به چپ شیفت بده....میشه : 0b00000010
                          نتیجه چی شد؟...اگه مقدار بالا رو بریزی داخل رجیستر DDRB پورت 1(پین دوم) رو خروجی میکنه...
                          فک کنم حله :rolleyes:
                          تولید کننده تجهیزات برنامه پذیر اتوماسیون صنعتی

                          www.intelart.ir


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

                          دیدگاه


                            #14
                            پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

                            خیلی ممنون کاملا متوجه شدم
                            رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

                            دیدگاه


                              #15
                              پاسخ : ایجاد گیت منطقی با میکرو کنترلر AVR

                              اگه اجازه بدید دوتا سوال دارم البته اگه جسارت نباشه
                              ببنید الان وقتی می نویسم 1<<DDA1 یعنی اینکه ما یه عدد یک ساختیم یعنی 0x01 بعد اون رو به اندازه DDA1 در بایت DDRA مربوطه شیفیت میدیم تا خود بیت (در اینجا پین شماره 1 ) برابر یک بشه ؛ درسته؟
                              سوال دوم اینکه کانفیگ میکرو چیه؟ از کجا میشه بهش دسترسی داشت چون تا جایی که یادمه در زبان بیسیک برای تعریف ورودی خروجی مینویسن کانفینگ (منو ببخشید اینقدر سوال میکنم )
                              رفقا مهم نیست چطوری بازی می کنید؛ اگه شروع نکنید، قطعا بازنده هستید.

                              دیدگاه

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