اطلاعیه

Collapse
No announcement yet.

مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

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

    مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

    سلام به دوستان

    دیشب داشتم رو یه پروژه کار میکردم که به یه اتفاق خیلی عجیب برخوردم . . .
    کد ساده ی زیر رو در نظر بگیرید ( این کد در کدویژن 3.12 نوشته شده )
    کد:
    [FONT=Yekan]while (1)[/FONT][FONT=Yekan]      {  [/FONT]
    [FONT=Yekan] ; (delay_ms( 1000[/FONT]
    [FONT=Yekan]             ;DDRD = 1<<DDRD[/FONT]
    
    [FONT=Yekan]     }[/FONT]
    اول برنامه PORTD=0 شده
    کاری که میکرو با این کد انجام میده

    اول از قبل DDD0 در برنامه 1 شده و مابقی 0 هستند
    دوم DDD1 رو 1 میکنه مابقی 0 هستند
    سوم DDD2 رو 1 میکنه مابقی 0 هستند
    چهارم DDD4 رو 1 میکنه مابقی 0 هستند
    و همین چهار مرحله همینطور پشت سر هم تکرار میشه

    یعنی ابتدا پایه اول یک میشه مابقی 0
    بعد پایه دوم
    یک میشه مابقی 0
    بعد پایه سوم
    یک میشهمابقی 0
    بعد پایه پنجم
    یک میشهمابقی 0

    دوباره بر میگرده از اول و همین 4 مرحله همینطور تکرار میشند
    هم در عمل با میکرو مگا 8 تست کردم و هم در پروتیوس با مگا 8 و مگا32 تست کردم نتیجه کاملا مشابه و به قرار ذکر شده بود
    کد اصلی رو قرار میدم
    شما دوستان لطف کنید این کد رو به میکرو وارد کنید ببینید چه عکس العملی نشون میده . . .
    کد:
    [FONT=Yekan]#include <mega8.h>[/FONT]
    
    #include <delay.h>
    
    
    #define delay_time 1000 
    
    
    
    
    
    
    
    
    void main(void)
    {
    
    
    
    
    DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
    PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
    
    
    
    
    DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
    PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
    
    
    
    
    DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (1<<DDD0);
    PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
    
    
    
    
    // Analog Comparator initialization
    // Analog Comparator: Off
    // The Analog Comparator's positive input is
    // connected to the AIN0 pin
    // The Analog Comparator's negative input is
    // connected to the AIN1 pin
    ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
    
    
    
    
    
    
    while (1)
          {  
                delay_ms( delay_time ); 
                DDRD = (1<<DDRD);
            
          }
    }
    جدیدترین ویرایش توسط rezamajdi; ۱۳:۰۵ ۱۳۹۷/۰۲/۰۶.
    آرزوی سرافرازی برای ایران عزیز . . .



    #2
    پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

    سلام
    الان مشکل چیه؟؟؟
    اگه مسئله تکرارشه باید از حلقه ی بی نهایت در بیاری هر وقت کد توی حلقه بی نهایت while باشه همیشه تکرار میشه
    موفق باشی
    Proudly @real_ahmadi
    #real_ahmadi

    واسه اسمت بجنگ

    دیدگاه


      #3
      پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

      نوشته اصلی توسط مهندس احمدی نمایش پست ها
      سلام
      الان مشکل چیه؟؟؟
      اگه مسئله تکرارشه باید از حلقه ی بی نهایت در بیاری هر وقت کد توی حلقه بی نهایت while باشه همیشه تکرار میشه
      موفق باشی
      دوست عزیز خیلی ساده به مسئله نگاه میکنید !!!!
      بنده بعد از این همه کار در این حوزه این چیزای ساده رو که دیگه باید بدونم

      نوشته بنده رو با دقت بیشتری بخونید و به جزیات توجه کنید تا متوجه منظور بنده بشید
      آرزوی سرافرازی برای ایران عزیز . . .


      دیدگاه


        #4
        پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

        نوشته اصلی توسط rezamajdi نمایش پست ها
        دوست عزیز خیلی ساده به مسئله نگاه میکنید !!!!
        بنده بعد از این همه کار در این حوزه این چیزای ساده رو که دیگه باید بدونم

        نوشته بنده رو با دقت بیشتری بخونید و به جزیات توجه کنید تا متوجه منظور بنده بشید
        دادا ddr توی حلقه بی نهایت نزار میخوای وقتی میخوای وضعیت پورت رو عوض کنی از PORTD= 0b00000000استفاده کن

        اگه بازم این نیست دقیقا مشکلو بگو
        بدرود
        Proudly @real_ahmadi
        #real_ahmadi

        واسه اسمت بجنگ

        دیدگاه


          #5
          پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

          جناب مهندس احمدی عزیز شما ما رو با یه نفر که تازه اومد تو این کار اشتباهی گرفتی

          مسئله از این چیزی که فکر میکنید کمی پیچیده تر هست
          در صورتی که میخواید مسئله رو بررسی کنید خواهش میکنم به نوشته ی بنده دقت فرمایید تا متوجه اصل مطلب بشید

          بنده برای انجام یه پروژه که خیلی مهم نیست
          لازم دارم که در یک پورت از میکرو در هر لحظه تنها یک پایه 0 و سایر پایه های امپدانس بالا بشه و این امکان 0 بودن به صورت یکی پس از دیگری باترتیب برای پایه های یک پورت اجرا بشه ( میشه همون شیفت خودمون تو برنامه نویسی )

          در حال حاضر هم جواب گرفتم و کد مربوطه رو نوشتم و مشکلی نیست


          در واقع مسئله بنده کدی هست که به ظاهر مشکلی نداره اما در عمل کار نمیکنه
          !!!!!!
          بنده کد اصلی رو همون پست اول قرار دادم

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

          بازم ازتون میخوام که بیشتر به مسئله دقت کنید . . .



          با تشکر
          جدیدترین ویرایش توسط rezamajdi; ۱۶:۴۱ ۱۳۹۷/۰۲/۰۶.
          آرزوی سرافرازی برای ایران عزیز . . .


          دیدگاه


            #6
            پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

            نوشته اصلی توسط rezamajdi نمایش پست ها
            سلام به دوستان

            دیشب داشتم رو یه پروژه کار میکردم که به یه اتفاق خیلی عجیب برخوردم . . .
            کد ساده ی زیر رو در نظر بگیرید ( این کد در کدویژن 3.12 نوشته شده )
            کد:
            [FONT=Yekan]while (1)[/FONT][FONT=Yekan]      {  [/FONT]
            [FONT=Yekan] ; (delay_ms( 1000[/FONT]
            [FONT=Yekan]             ;DDRD = 1<<DDRD[/FONT]
            
            [FONT=Yekan]     }[/FONT]
            اول برنامه PORTD=0 شده
            کاری که میکرو با این کد انجام میده

            اول از قبل DDD0 در برنامه 1 شده و مابقی 0 هستند
            دوم DDD1 رو 1 میکنه مابقی 0 هستند
            سوم DDD2 رو 1 میکنه مابقی 0 هستند
            چهارم DDD4 رو 1 میکنه مابقی 0 هستند
            و همین چهار مرحله همینطور پشت سر هم تکرار میشه

            یعنی ابتدا پایه اول یک میشه مابقی 0
            بعد پایه دوم
            یک میشه مابقی 0
            بعد پایه سوم
            یک میشهمابقی 0
            بعد پایه پنجم
            یک میشهمابقی 0

            دوباره بر میگرده از اول و همین 4 مرحله همینطور تکرار میشند
            هم در عمل با میکرو مگا 8 تست کردم و هم در پروتیوس با مگا 8 و مگا32 تست کردم نتیجه کاملا مشابه و به قرار ذکر شده بود
            کد اصلی رو قرار میدم
            شما دوستان لطف کنید این کد رو به میکرو وارد کنید ببینید چه عکس العملی نشون میده . . .
            کد:
            [FONT=Yekan]#include <mega8.h>[/FONT]
            
            #include <delay.h>
            
            
            #define delay_time 1000 
            
            
            
            
            
            
            
            
            void main(void)
            {
            
            
            
            
            DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
            PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);
            
            
            
            
            DDRC=(0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
            PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);
            
            
            
            
            DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (1<<DDD0);
            PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);
            
            
            
            
            // Analog Comparator initialization
            // Analog Comparator: Off
            // The Analog Comparator's positive input is
            // connected to the AIN0 pin
            // The Analog Comparator's negative input is
            // connected to the AIN1 pin
            ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
            
            
            
            
            
            
            while (1)
                  {  
                        delay_ms( delay_time ); 
                        DDRD = (1<<DDRD);
                    
                  }
            }
            سلام داداش امکان داره کدویژن DDRD رو به عنوان یه متغییر که قابل شیفت دادن باشه نشناسه اول ِDDRD داخل یک متغییر بریزین بعد شیفت بدین ببینین مشکل حل میشه یا نه که درست یا غلط بودن این نظریه بنده مشخص بشه من کدویژن ندارم وگرنه خودم تست میکردم
            جدیدترین ویرایش توسط سید سجاد احدزاده; ۱۷:۰۸ ۱۳۹۷/۰۲/۰۶.
            سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

            دیدگاه


              #7
              پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

              عملکرد کد شما به همان ترتیبی است که توضیح دادید و انتظار دیگری نباید داشته باشید. با این تصحیح که بعد از قرار گرفتن 1 و 2 و4و16 در DDRD در صورت عملکرد درست کامپایلر در مرحله بعدی 0 در آن قرار می گیرد و دوباره همین روال ادامه می یابد. اگر در این مورد ابهامی دارید توجه کنید که با توجه به 8 بیتی بودن DDRD :

              در مرحله اول برابر 1 است.
              در مرحله دوم برابر یک بار شیفت به چپ عدد 1 یا همان 2 است.
              در مرحله سوم برابر دو بار شیفت به چپ عدد 1 یا همان4 است.
              در مرحله چهارم برابر چهار بار شیفت به چپ عدد 1 یا همان 16 است.
              در مرحله پنجم برابر شانزده بار شیفت به چپ عدد 1 یا همان 0 است (با توجه به 8 بیتی بودن).
              در مرحله ششم برابر صفر بار شیفت به چپ عدد 1 یا همان 1 است.
              و به همین ترتیب دوباره ادامه می یابد.
              اوژن: به معنای افکننده و شکست دهنده است
              دانایی، توانایی است-Knowledge is POWER
              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

              دیدگاه


                #8
                پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

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

                اول از قبل DDD0 در برنامه 1 شده و مابقی 0 هستند
                دوم DDD1 رو 1 میکنه مابقی 0 هستند
                سوم DDD2 رو 1 میکنه مابقی 0 هستند
                چهارم DDD4 رو 1 میکنه مابقی 0 هستند
                و همین چهار مرحله همینطور پشت سر هم تکرار میشه

                یک سوال ِDDD3,وDDD5,وِِِDDD6وِDDD7 چی میشه؟
                مگه نباید یک بار شیفت داده بشه بعد از متغییر خارج بشه
                یعنی
                اول از قبل DDD0 در برنامه 1 شده و مابقی 0 هستند
                دوم DDD1 رو 1 میکنه مابقی 0 هستند
                دوم DDD2 رو 1 میکنه مابقی 0 هستند
                دوم DDD3 رو 1 میکنه مابقی 0 هستند
                دوم DDD4 رو 1 میکنه مابقی 0 هستند
                دوم DDD5 رو 1 میکنه مابقی 0 هستند
                دوم DDD6 رو 1 میکنه مابقی 0 هستند
                دوم DDD7 رو 1 میکنه مابقی 0 هستند
                بعد دیگه همه صفر چون دیگه بیت 1 نیست که شیفت داده بشه
                پس چه طوریه که واسه شما خروجی بالا رو داره شاید کمپایلر مشکل داره
                سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

                دیدگاه


                  #9
                  پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

                  این مورد اصلا عجیب نیست شما در هر مرحله دارید ddrd رو یک بیت به سمت چپ شیفت میدید

                  دیدگاه


                    #10
                    پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

                    نوشته اصلی توسط طراح نمایش پست ها
                    عملکرد کد شما به همان ترتیبی است که توضیح دادید و انتظار دیگری نباید داشته باشید. با این تصحیح که بعد از قرار گرفتن 1 و 2 و4و16 در DDRD در صورت عملکرد درست کامپایلر در مرحله بعدی 0 در آن قرار می گیرد و دوباره همین روال ادامه می یابد. اگر در این مورد ابهامی دارید توجه کنید که با توجه به 8 بیتی بودن DDRD :

                    در مرحله اول برابر 1 است.
                    در مرحله دوم برابر یک بار شیفت به چپ عدد 1 یا همان 2 است.
                    در مرحله سوم برابر دو بار شیفت به چپ عدد 1 یا همان4 است.
                    در مرحله چهارم برابر چهار بار شیفت به چپ عدد 1 یا همان 16 است.
                    در مرحله پنجم برابر شانزده بار شیفت به چپ عدد 1 یا همان 0 است (با توجه به 8 بیتی بودن).
                    در مرحله ششم برابر صفر بار شیفت به چپ عدد 1 یا همان 1 است.
                    و به همین ترتیب دوباره ادامه می یابد.
                    با سلام و درود خدمت استاد عزیز جناب آقای مهندس اوژن کی نژاد
                    ابتدا از توجه و راهنمایی شما و همینطور وقتی که گذاشتید تشکر میکنم . . .
                    من بار ها توضیح شما رو خوندم اما جسارتا فکر میکنم اشتباه میکنید !

                    بزارید من توضیح بدم :
                    نحوه ی اجرای کد باید به این صورت باشه

                    1_ در ابتدا DDRD برابر 0B 0000 0001
                    2_ یکبار شیفت به چپ برابر 0B 0000 0010
                    3_ یکبار دیگه شیفت به چپ برابر
                    0B 0000 0100
                    4_
                    یکبار دیگه شیفت به چپ برابر 0B 0000 1000
                    5_یکبار دیگه شیفت به چپ برابر 0B 0001 0000

                    و به همین ترتیب هر بار یک واحد به چپ شیفت میدیم و باید پایه های پورت D از اولین پایه تا آخرین پایه به ترتیب صفر بشند در حالی که مابقی پایه ها حالت امپدانس بالا باشند .
                    اگه اشتباه میکنم لطفا متذکر شوید

                    باز هم تشکر میکنم

                    دلیل: ادغام دو پست برای جلوگیری از اسپم

                    نوشته اصلی توسط سید سجاد احدزاده نمایش پست ها
                    یک سوال ِDDD3,وDDD5,وِِِDDD6وِDDD7 چی میشه؟
                    مگه نباید یک بار شیفت داده بشه بعد از متغییر خارج بشه
                    یعنی
                    اول از قبل DDD0 در برنامه 1 شده و مابقی 0 هستند
                    دوم DDD1 رو 1 میکنه مابقی 0 هستند
                    دوم DDD2 رو 1 میکنه مابقی 0 هستند
                    دوم DDD3 رو 1 میکنه مابقی 0 هستند
                    دوم DDD4 رو 1 میکنه مابقی 0 هستند
                    دوم DDD5 رو 1 میکنه مابقی 0 هستند
                    دوم DDD6 رو 1 میکنه مابقی 0 هستند
                    دوم DDD7 رو 1 میکنه مابقی 0 هستند
                    بعد دیگه همه صفر چون دیگه بیت 1 نیست که شیفت داده بشه
                    پس چه طوریه که واسه شما خروجی بالا رو داره شاید کمپایلر مشکل داره
                    با تشکر از توجه شما

                    دوستان الان خودشون کدی که من گذاشتم رو کپی کنند ( تاکید میکنم کپی کنید نه این که خودتون بنویسید ) و تست کنند ببینند چی میشه !!!
                    فکر کنم این یکی از باگ های کدویژن 3.12 باشه

                    از این که وقت میزارید سپاس
                    آرزوی سرافرازی برای ایران عزیز . . .


                    دیدگاه


                      #11
                      پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

                      توضیح صحیح همان بود که در بالا نوشتم. برای درک بهتر اگر بخواهیم کدی را که در بالا نوشته اید به زبان فارسی توضیح دهیم:
                      کد:
                      DDRD = (1<<DDRD);
                      به این صورت می شود که: DDRD برابر است با عدد 1 که به میزان محتوای DDRD به چپ شیفت داده شده باشد. با این توضیح تکمیلی مطلبی را که در بالا نوشتم یک بار دیگر بخوانید.
                      اوژن: به معنای افکننده و شکست دهنده است
                      دانایی، توانایی است-Knowledge is POWER
                      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                      دیدگاه


                        #12
                        پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

                        با تشکر از راهنمایی خوب شما

                        با توجه به توضیحاتتون و آزمایشی که انجام شد
                        بین دو دستور زیر فرق وجود داره
                        کد:
                        [FONT=Yekan]DDRD = DDRD<<1; 
                        [/FONT][FONT=Yekan]            DDRD = 1<<DDRD;[/FONT]
                        بنابراین اگه بخوایم پایه ها یکی پس از دیگری به ترتیب 0 بشن باید از این دستور استفاده بشه
                        1>>DDRD = DDRD


                        اما یه سوال اگر 0 = DDRD باشه
                        کد:
                          DDRD = 1<<DDD0;          
                        DDRD = 1<<DDD0;
                        توضیح دقیق کد بالا چی میشه ؟؟

                        با توجه به راهنمایی شما آیا این درسته
                        ابتدا DDRD برابر 1 میشه که به اندازه ی مقدار DDD0 یعنی 0 تا به چپ شیفت پیدا کرده که در نهایت میشه 1
                        سپس DDRD برابر با 1 میشه که به اندازه ی مقدار DDD0 یعنی 1 واحد به چپ شیفت پیدا کرده که در نهایت میشه 0 ( عدد 1 رو که 1 واحد شیفت بدیم باید بشه 0 درسته ؟)

                        درسته ؟؟
                        جدیدترین ویرایش توسط rezamajdi; ۱۸:۳۸ ۱۳۹۷/۰۲/۰۶.
                        آرزوی سرافرازی برای ایران عزیز . . .


                        دیدگاه


                          #13
                          پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

                          داداش من متوجه شدم
                          شما داری یک متغییر هم زمان به چپ شیفت میدی به صورت زیر
                          0001 0000>>1= 0010 0000
                          0010 0000>>1= 0100 0000
                          0100 0000>>1= 0000 0001
                          تو شبیه ساز تک تک شیفت بده اعداد بالا رو جدا جدا بعد نتیجه رو ببین من تو شبیه ساز اتمل استدیو تست کردم یه زره گیج کنندس منم کامل نتونستم درکش کنم
                          اون توضیحی که تو پست قبلیم زدم این کد انجام میده:
                          کد:
                          
                          
                          کد:
                          DDRD=(DDRD<<1);[FONT=Yekan]
                          [/FONT]

                          جدیدترین ویرایش توسط سید سجاد احدزاده; ۱۸:۵۴ ۱۳۹۷/۰۲/۰۶.
                          سقراط : دانش من بدانجایی رسید که فهمیدم هیچ نمیدانم.

                          دیدگاه


                            #14
                            پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

                            سلام.
                            از این برنامه استفاده کن.

                            کد:
                            /*******************************************************
                            This program was created by the
                            CodeWizardAVR V3.12 Advanced
                            Automatic Program Generator
                            © Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
                            http://www.hpinfotech.com
                            
                            Project : 
                            Version : 
                            Date    : 04/26/2018
                            Author  : 
                            Company : 
                            Comments: 
                            
                            
                            Chip type               : ATmega32
                            Program type            : Application
                            AVR Core Clock frequency: 8.000000 MHz
                            Memory model            : Small
                            External RAM size       : 0
                            Data Stack size         : 512
                            *******************************************************/
                            
                            #include <mega32.h>
                            #include <delay.h>
                            // Declare your global variables here
                            char A[8]={1,2,4,8,16,32,64,128},B;
                            void main(void)
                            {
                            // Declare your local variables here
                            
                            // Input/Output Ports initialization
                            // Port A initialization
                            // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
                            DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (1<<DDA0);
                            // State: Bit7=P Bit6=P Bit5=P Bit4=P Bit3=P Bit2=P Bit1=P Bit0=T 
                            PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);
                            
                            
                            
                            while (1)
                                  { 
                                  DDRA=A[B];
                                PORTA=(A[B] & (~(1<<B))) ;
                                delay_ms(500); 
                                B++;
                                if(B>7) B=0;
                                 
                            
                                  }
                            }

                            دیدگاه


                              #15
                              پاسخ : مشکل عجیب در برنامه نویسی به زبان C با میکرو AVR

                              سلام خدمت شما

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

                              با تشکر
                              آرزوی سرافرازی برای ایران عزیز . . .


                              دیدگاه

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