اطلاعیه

Collapse
No announcement yet.

مشکل در برنامه نویسی

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

    #16
    پاسخ : مشکل در برنامه نویسی

    نوشته اصلی توسط BAMDAD 86
    همچنان منتظر توضیحات شما اساتید محترم هستم
    سلام بامداد عزیز :bye

    اگر منظورت کدشه، من کد زیر رو پیشنهاد میکنم ( البته تغییرات کوچکی توی کد خودت دادم )

    #include<mega32.h>
    #include<delay.h>

    flash unsigned char display[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6 f};

    int main(void)
    {
    unsigned char i = 0
    unsigned char yek, dah;

    PORTA = display[0];
    DDRA = 0XFF;

    PORTC = display[0];
    DDRC = 0XFF;

    PORTB = 0X03;
    DDRB = 0X00;

    while(1) //main loop
    {
    while(PINB.0 && PINB.1); //wait until any key pressed

    if (PINB.0==0 && i<99) //KEY+ pressed
    {
    i++;

    while(PINB.0==0);
    }//if PINB.0

    if(PINB.1==0 && i>0) //KEY- pressed
    {
    i--;

    while(PINB.1==0);
    }//if PINB.1

    yek = i%10;
    dah = i/10;

    PORTA = display[yek];
    PORTC = display[dah];
    }//while
    } //main

    با فرض اینکه یه سون سگمنت هم روی پورت C نصب کردی ( عینا مثل پورت A ) ، اگر واقعا این کار رو کردی، یادت نره که JTAG رو غیر فعال کنی ( از طریق فیوز بیت های مربوطه )
    مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

    Sh_Nourbakhsh@Yahoo.com

    http://s2.picofile.com/file/7170362468/_Wall_e_.jp

    دیدگاه


      #17
      پاسخ : مشکل در برنامه نویسی

      با تشکر از شما جناب aivhl میشه لطف کنید راجع به برنامتون توضیح بدین

      دیدگاه


        #18
        پاسخ : مشکل در برنامه نویسی

        نوشته اصلی توسط BAMDAD 86
        با تشکر از شما جناب aivhl میشه لطف کنید راجع به برنامتون توضیح بدین
        با سلام،

        بامداد جان عزیز، این همون برنامه خودته که من برات تغییرش دادم تا هم بهینه بشه و هم اینکه اون کاری که خواستی رو انجام بده و چند تا توضیح هم توی برنامه اضافه کردم.
        فقط یه نکته که در برنامه نویسی به ذهنم میرسه برات بگم، اگر خواستی استفاده کن و اون اینه که سعی کن با ایجاد فاصله های مناسب و سطر بندی های خوب که امکانش توی سی از همه بیشتره و نوشتن کامنت های مناسب در حین برنامه نویسی، درک برنامه رو برای دیگران راحت تر کنی و ایضا برای خودت، چون برای خودم پیش اومده که بعد از یکی دو سال که به برنامه ای که حتی خودم نوشتم نگاه کردم، ازش سر در نمیارم! و باید یکی دو ساعت براندازش کنم تا بفهمم چی به چیه!!! :eek:

        و اما برنامه بالا، یه متغیر i هستش که با کلید های مثبت و منفی از 0 به 99 و بالعکس امکان تغییر دادنش هست و دو تا متغیر yek و dah هم هستن که مغادیر یکان و دهگان عدد i رو محاسبه و در اونها ذخیره میکنیم. یا به عبارتی باقیمانده تقسیم عدد i بر 10 رو در yek و حاصل تقسیم اون رو در dah میریزیم و چونکه تمام متغیرها از نوع unsigned char هستند، اعشارها خود به خود از بین میرن که مد نظر ما هم هست! و در نهایت هم که ثابت آرایه ای display رو متناسب با اعداد بدست اومده در yek و dah ، میریزیم روی پورت های A و C که سون سگمنت ها رو روشون نصب کردیم و الی آخر..... ( البته من نسخه کامل و اصلی برنامه شما رو هم نداشتم! )
        این خط while(PINB.0 && PINB.1); //wait until any key pressed هم برای این اضافه شده تا برنامه الکی چرخ نزنه که خدای نکرده سرش گیج بره :biggrin:

        اگر بازم سوالی بود در خدمتیم

        مرسی و خوش گذشت ....
        مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

        Sh_Nourbakhsh@Yahoo.com

        http://s2.picofile.com/file/7170362468/_Wall_e_.jp

        دیدگاه


          #19
          پاسخ : مشکل در برنامه نویسی

          با تشکر از ز شما وممنون که پیگیری می کنید
          لطفا بفرمایید که تفاوت VOID MAIN و INT MAIN چیه وقتی VOID داخل پرانتز قرار میگیره معنیش چیه

          دیدگاه


            #20
            پاسخ : مشکل در برنامه نویسی

            نوشته اصلی توسط BAMDAD 86
            با تشکر از ز شما وممنون که پیگیری می کنید
            لطفا بفرمایید که تفاوت VOID MAIN و INT MAIN چیه وقتی VOID داخل پرانتز قرار میگیره معنیش چیه
            با سلام،

            تابع اصلی C یا همون main بهتره که از نوع int باشه و در آخرین سطر یه return 0 هم داشته باشه، این ساختار برنامه نویسی C هستش و اون قدیما اگر غیر این میشد، کامپایلرها Error میدادن و من هم طبق عادت این کار رو میکنم و درستش هم اینه، چون برنامه ابتدا و انتهاش بعد از کامپایل معلوم و بسته میشه.
            و اما void ، هر تابعی که هیچ نوع متغیری رد و بدل نمیکنه باید جلوش (void) باشه و بازم پرانتز خالی اشتباه ساختاریه و اگر متغیری return نمیکنه هم باید حتما قبلش void باشه. اینطوری بین فراخوانی تابع و تعریفش فرقی وجود خواهد داشت و در ساختار استاندارد برنامه نویسی، تعریف هدر فایل هم ممکن میشه.
            متاسفانه CV از این نظرها اصلا استاندارد عمل نمیکنه و با عرض معذرت و شرمندگی، برنامه نویس هارو به سمت شلختگی سوق میده
            مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

            Sh_Nourbakhsh@Yahoo.com

            http://s2.picofile.com/file/7170362468/_Wall_e_.jp

            دیدگاه


              #21
              پاسخ : مشکل در برنامه نویسی

              نوشته اصلی توسط aivhl
              با سلام،

              تابع اصلی C یا همون main بهتره که از نوع int باشه و در آخرین سطر یه return 0 هم داشته باشه، این ساختار برنامه نویسی C هستش و اون قدیما اگر غیر این میشد، کامپایلرها Error میدادن و من هم طبق عادت این کار رو میکنم و درستش هم اینه، چون برنامه ابتدا و انتهاش بعد از کامپایل معلوم و بسته میشه.
              و اما void ، هر تابعی که هیچ نوع متغیری رد و بدل نمیکنه باید جلوش (void) باشه و بازم پرانتز خالی اشتباه ساختاریه و اگر متغیری return نمیکنه هم باید حتما قبلش void باشه. اینطوری بین فراخوانی تابع و تعریفش فرقی وجود خواهد داشت و در ساختار استاندارد برنامه نویسی، تعریف هدر فایل هم ممکن میشه.
              متاسفانه CV از این نظرها اصلا استاندارد عمل نمیکنه و با عرض معذرت و شرمندگی، برنامه نویس هارو به سمت شلختگی سوق میده
              یه چیز دیگه هم اضافه کنم در مورد main این طوره که ;return 0 یعنی برنامه درست اجرا شده و غیر از 0 یعنی مشکل پیدا کرده
              در کل return یعنی مقدار خروجی تابع که جلوش میاد مثل 0 یا هر چیز دیگه که اون متغیر اولیه به جای void براش تعریف شده
              حالا که دارم با IAR کار میکنم میفهمم C چیه ! کدویژن چی بود ! اسباب بازی ؟
              برای شروع همین خوبه ولی برای کارای پیشرفته و AVR های قوی تر مثل XMEGA بدرد نمیخوره

              دیدگاه


                #22
                پاسخ : مشکل در برنامه نویسی

                سلام من به کمک شما تونستم سه رقم را را روی 7segment نمایش بدم برنامه طوری که با هربار فشار دادن میکروسوئیچ یک رقم افزایش می ده ولی
                وقتی که میکروسوئیچ را دائم نگه می دارم ارقام تغییر نمی کنند حالا سوالم اینه اگه بخوام برنامه طوری باشه که با نگه داشتن میکروسوئیچ اعداد سریع تغییر کنه باید چه کار کنم مثلا بعضی از دستگاه های دیجتال با نگه داشتن میکروسوئیچ اعداد با سرعت بالاتر تغییر میکنند یعنی در مدت یک ثانیه 10رقم تغییر میکنه
                با تشکر

                #include<mega32.h>
                #include<delay.h>

                flash unsigned char display[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6 f};

                void main()
                {
                int i = 0;
                int yek, dah,sad,ba;

                PORTA = display[0];
                DDRA = 0XFF;
                PORTD = display[0];
                PORTC = display[0];
                DDRC = 0XFF;
                DDRD = 0XFF;

                PORTB = 0X03;
                DDRB = 0X00;

                while(1) //main loop
                {
                while(PINB.0 && PINB.1); //wait until any key pressed

                if (PINB.0==0 && i<999) //KEY+ pressed
                {
                i++;

                while(PINB.0==0);
                }//if PINB.0

                if(PINB.1==0 && i>0) //KEY- pressed
                {
                i--;

                while(PINB.1==0);
                }//if PINB.1
                sad= i/100;
                ba= i%100;
                dah=ba/10;
                yek=ba%10 ;
                PORTA = display[sad];
                PORTC = display[dah];
                PORTD = display[yek];
                }//while
                } //
                main

                دیدگاه


                  #23
                  پاسخ : مشکل در برنامه نویسی

                  با سلام،

                  تبریک میگم که تونستی برنامه ات رو تکمیل کنی... :biggrin:

                  توی هر کدوم از این دوتا شرط زیر که شما فشرده شدن کلیدهای مثبت و منفی رو چک میکنید یک حلقه وجود داره که تا شما دستتون رو از روی کلید برندارین ازش رد نمیشه! اول اون دوتا رو حذف کنید. ( قرمزش کردم :mrgreen: )

                  if (PINB.0==0 && i<999) //KEY+ pressed
                  {
                  i++;

                  [glow=red,2,300]// while(PINB.0==0);[/glow]
                  }//if PINB.0

                  if(PINB.1==0 && i>0) //KEY- pressed
                  {
                  i--;

                  [glow=red,2,300]// while(PINB.1==0);[/glow]
                  }//if PINB.1

                  و بعد هم در انتهای حلقه اصلی یک delay حدودا 200 الی 300 میلی ثانیه ای بزارین ( دستورش رو توی CV بلد نبودم، همینطوری نوشتم، خودتون درستش رو بنویسید oo: )

                  .
                  .
                  .
                  PORTC = display[dah];
                  PORTD = display[yek];

                  [glow=red,2,300]delay(200); //200ms delay[/glow]
                  }//while
                  .
                  .

                  کلا خوش گذشت...
                  مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

                  Sh_Nourbakhsh@Yahoo.com

                  http://s2.picofile.com/file/7170362468/_Wall_e_.jp

                  دیدگاه


                    #24
                    پاسخ : مشکل در برنامه نویسی

                    سلام به دوستان
                    من مشکلم اینه که میخوام از یک پورت استفاده کنم ولی بدجوری به مشکل بر خوردم نمیدونم دیگه چیکار کنم؟ فایلها را میگذارم
                    http://www.4shared.com/file/EuW8TTUd/7segment.html برنامه
                    http://www.4shared.com/file/4Sj9XVUK/7segment1.html فایل پروتئوس

                    دیدگاه


                      #25
                      پاسخ : مشکل در برنامه نویسی

                      نوشته اصلی توسط محمد مینائیان
                      سلام به دوستان
                      من مشکلم اینه که میخوام از یک پورت استفاده کنم ولی بدجوری به مشکل بر خوردم نمیدونم دیگه چیکار کنم؟ فایلها را میگذارم
                      http://www.4shared.com/file/EuW8TTUd/7segment.html برنامه
                      http://www.4shared.com/file/4Sj9XVUK/7segment1.html فایل پروتئوس
                      با سلام،

                      برادر شما از این استفاده کن، کارت رو راه میندازه :

                      http://s3.picofile.com/file/7438536341/7segment.rar.html

                      البته توی پروتئوس بازی در میاره و عملا مشکلی نداره.....
                      مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

                      Sh_Nourbakhsh@Yahoo.com

                      http://s2.picofile.com/file/7170362468/_Wall_e_.jp

                      دیدگاه


                        #26
                        پاسخ : مشکل در برنامه نویسی

                        سلام
                        درمورد آیسی 4009میشه توضیح بدهید

                        درمورد7سگمنت های2تایی به به بالا از تابع استفاده کنید :eek:
                        اینم چندتا پروژه مشکلاتتون حل بشه

                        7سگمنت 4تایی ثانیه شمار(البته کمی باید زمانشو زیاد کرد چون تو پروتئوس یک ثانیه خییلییه شاید برایم من oo


                        نوشته اصلی توسط BAMDAD 86
                        سلام من به کمک شما تونستم سه رقم را را روی 7segment نمایش بدم برنامه طوری که با هربار فشار دادن میکروسوئیچ یک رقم افزایش می ده ولی
                        وقتی که میکروسوئیچ را دائم نگه می دارم ارقام تغییر نمی کنند حالا سوالم اینه اگه بخوام برنامه طوری باشه که با نگه داشتن میکروسوئیچ اعداد سریع تغییر کنه باید چه کار کنم مثلا بعضی از دستگاه های دیجتال با نگه داشتن میکروسوئیچ اعداد با سرعت بالاتر تغییر میکنند یعنی در مدت یک ثانیه 10رقم تغییر میکنه
                        با تشکر
                        eft]main
                        پروژه مورد نظر دوستمون
                        وچند پروژه دیگر
                        الان حجم مصرفی هاستم تمام شده بعدا میگذارم
                        در دریای طوفانی با خدا بودن بهتر از ناخدا بودن است

                        دیدگاه


                          #27
                          پاسخ : مشکل در برنامه نویسی

                          با سلام،

                          این برادر محمد گیر داده بود که روی یک پورت دو تا سون سگمنت رو راه بندازه، خوب ما هم اطاعت امر کردیم :biggrin: و روی سخت افزار محمد عزیز اقدام شد ( گفتم شاید سخت افزارش الزاما باید اینطوری باشه، مثلا پورت کم داره و یک گیت 4009 هم روی بردش اضافیه! )، در نتیجه فقط نرم افزار نوشته شده و اون هم بر اساس کد خود برادر محمد. در غیر اینصورت منطقی اینه که از تایمر ها برای رفرش سون سگمنت ها استفاده بشه ( که اولش هم همینطوری نوشتم، ولی بعدش تغییرش دادم، تا شبیه به کد این برادر بزرگوار باشه! )

                          استفاده از 4009 اصلا منطقی و به صرفه نیست و بهتره که از یک پین دیگه هم استفاده بشه و یا در نهایت یکی - دوتا ترانزیستور این کار رو انجام بده.

                          در کل، این فقط جنبه آموزشی داره و جهت استفاده عملی اصلا منطقی نیست :mrgreen:
                          مادامی که از شخصی یاد میشود، او و افکارش زنده اند ....

                          Sh_Nourbakhsh@Yahoo.com

                          http://s2.picofile.com/file/7170362468/_Wall_e_.jp

                          دیدگاه


                            #28
                            پاسخ : مشکل در برنامه نویسی

                            سلام

                            پروژه هارو الان پلود کردم درباره سوال دوستمون
                            http://wdl.persiangig.com/pages/download/?dl=http://amirmasoud11.persiangig.com/7segment%20up.zip

                            نوشته اصلی توسط BAMDAD 86
                            [size=12pt]سلام من به کمک شما تونستم سه رقم را را روی 7segment نمایش بدم برنامه طوری که با هربار فشار دادن میکروسوئیچ یک رقم افزایش می ده ولی
                            وقتی که میکروسوئیچ را دائم نگه می دارم ارقام تغییر نمی کنند حالا سوالم اینه اگه بخوام برنامه طوری باشه که با نگه داشتن میکروسوئیچ اعداد سریع تغییر کنه باید چه کار کنم مثلا بعضی از دستگاه های دیجتال با نگه داشتن میکروسوئیچ اعداد با سرعت بالاتر تغییر میکنند یعنی در مدت یک ثانیه 10رقم تغییر میکنه
                            بهتره از حلقه forاستفاده کنید
                            مثال:
                            if(PIND==0)}
                            [++or(i=0;i<=10;i){
                            if(i==11){
                            i=0;
                            portb=seg[0];
                            {
                            portb=seg[i];
                            {
                            کهsegآرایه است وچون حلقه forتاشرط برقرار باشد اجرا میشود برای اینکار خوبه
                            {
                            ببخشید بار اولمه پیام میدم
                            در دریای طوفانی با خدا بودن بهتر از ناخدا بودن است

                            دیدگاه


                              #29
                              پاسخ : مشکل در برنامه نویسی

                              سلام
                              دوستان برنامم درست بود فقط کدویژنم مشکل داشت
                              اگه از تایمر استفاده کنیم cpu میکرو دائما در حال کاره و توان بالای مصرف میکنه اینطور نیست؟

                              دیدگاه

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