اطلاعیه

Collapse
No announcement yet.

این سوالات برای کانتر 1 رقمی 7 سگمنت برای من ایجاد شده؟

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

    این سوالات برای کانتر 1 رقمی 7 سگمنت برای من ایجاد شده؟

    دوستان سلام
    من در این کد کانتر یک رقمی 7سگمنت این سوالات برای من ایجاد شده لطفا راهنمایی کنید ممنون.
    کد:
    #include <mega16.h>
    #define xtal 4000000
    flash char digits[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,
    0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71} ;
    unsigned char p_state;
    unsigned char key;
    unsigned char i;
    void main(void)
    {
    DDRD = 0xFF;
    PORTD = digits[0];
    DDRC = 0x00;
    PORTC = 0xFF;
    while(1)
    {
    key = PINC & 0b00000001;

    delay_ms(10);
    if(key==0)
    {
    if(key!=p_state)
    {
    if(i==15)
    {
    i=0;
    PORTD=digits[i];
    }
    else
    i++;
    PORTD = digits[i];
    p_state=0;
    };
    }
    else
    p_state=1;
    }
    }
    -----------------------------------------------------
    مشکلات من:
    1- خط سبز اولی: 0x3f به باینری 6 تا 1 میشه پس اگر به یک پورت که 8 تا پین داره بدیم 2 تا پین دیگه چی می شه؟
    2- خط سبز دومی: P_state چیه؟
    3- خط سبز سومی: اگر i از نوع کارکتری هست پس چرا با 15 که عدد صحیح هست مقایسه شده؟
    فعلا سوالام همینه اگر کمکی کنید ممنون می شم.
    با تشکر از کمکتون

    #2
    پاسخ : این سوالات برای کانتر 1 رقمی 7 سگمنت برای من ایجاد شده؟

    1. منظورتون کدوم خط هست؟
    2. حالت قبلی کلید هست. برنامه وقتی کلیدی فشار بدی تا زمانی که رها نشه شروع به شمارش میکنه
    3. نوع کارکتری انتخاب شده چون 8 بیتی هست و حافظه کمتری انتخاب میشه. 15 هم حداکثر شمارش برای یک عدد 4 بیتی هست.
    [glow=red,2,300]تاپيک هاي ايجاد شده[/glow]

    دیدگاه


      #3
      پاسخ : این سوالات برای کانتر 1 رقمی 7 سگمنت برای من ایجاد شده؟

      ممنون
      منظورم خط سبز اولی هست؟
      ولی حالا این 15 که i باهاش مقایسه شده چی هست؟ یعنی برای چی مقایسه شده؟ مگه چیکار می خواد انجام بده؟

      دیدگاه


        #4
        پاسخ : این سوالات برای کانتر 1 رقمی 7 سگمنت برای من ایجاد شده؟

        نوشته اصلی توسط complexcoding
        ممنون
        منظورم خط سبز اولی هست؟
        منظورت اینه؟

        PORTD = digits[0];

        خب مشکل چیه؟
        [glow=red,2,300]تاپيک هاي ايجاد شده[/glow]

        دیدگاه


          #5
          پاسخ : این سوالات برای کانتر 1 رقمی 7 سگمنت برای من ایجاد شده؟

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

          دیدگاه


            #6
            پاسخ : این سوالات برای کانتر 1 رقمی 7 سگمنت برای من ایجاد شده؟

            شمارنده شما I هست و از 0 تا 15 میشماره
            اون شرط باعث میشه هر وقت به 15 رسید از 0 شروع کنه
            البته بهتره بجای اون از دستور i &= 0x0F استفاده بشه
            تو اصل کار که فرقی نداره ولی هم کد ساده تری هست و هم نسبت به دستور IF سریع تر اجرا میشه
            [glow=red,2,300]تاپيک هاي ايجاد شده[/glow]

            دیدگاه


              #7
              پاسخ : این سوالات برای کانتر 1 رقمی 7 سگمنت برای من ایجاد شده؟

              مگه یک سون سگمنت از 0 تا 9 که بیشتر نمی تونه بشمره ؟ دو تا سون سگمنت مگه 2 رقمی نمی شمره یعنی از 0 تا 15 و ...؟

              دیدگاه


                #8
                پاسخ : این سوالات برای کانتر 1 رقمی 7 سگمنت برای من ایجاد شده؟

                سون سگمنت فقط جهت نمایش هست نه شمردن
                اعدادی که شمرده میشه بدین صورت نشون داده میشه

                flash char digits[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6 F,0x77,0x7C,0x39,0x5E,0x79,0x71};

                که در سون سگمنت بصورت زیر نمایش داده میشه
                0 ... 9 F E D C B A
                [glow=red,2,300]تاپيک هاي ايجاد شده[/glow]

                دیدگاه


                  #9
                  پاسخ : این سوالات برای کانتر 1 رقمی 7 سگمنت برای من ایجاد شده؟

                  ممنون
                  اما شما گفته بودی p_state برای زمانی هست که کاربر همچنان کلید را نگه می دارد اما در بالای کدها این رو بصورت یک متغیر تعریف کرده به این صورت:
                  unsigned char p_state; مگه p_state تابع نیست و فراخوانی شده پس چطوری بصورت یک متغیر تعریف شده؟
                  بازم تشکر

                  دیدگاه


                    #10
                    پاسخ : این سوالات برای کانتر 1 رقمی 7 سگمنت برا&#16

                    توضیحات برنامه داخل کد قرار دادم
                    یه قسمت برنامه هم اشتباه بود که با رنگ قرمز درست کردم


                    کد:
                     
                    while(1)
                    {
                       key = PINC & 0b00000001;
                      delay_ms(10);
                      if(key==0)                          //   اگه کلید فشرده نشد این قسمت اجرا میشه
                      {
                         if(key!=p_state)                   //    اگه کلید فشرده شده پردازش نشد اجرا بشه
                                                       //     اینکار باعث میشه فقط یک بار عمل پردازش صورت بگیره
                        {
                           if(i==15)                      //     اگه شمارش به انتها رسید از اول شروع کنه 
                          {
                             i=0;
                             PORTD=digits[i];              //     مقدار شمارش شده نمایش بده
                          }
                          else                         //    اگه شمارش به انتها نرسید یکی اضافه کنه
                            i++;
                          PORTD = digits[i];               //     مقدار شمارش شده نمایش بده
                          p_state=0;                    //     با صفر کردن میفهمیم پردازش انجام شده و فقط یکبار شرط قبلی تگرار میشه
                        }
                      }
                      else                             //   اگه کلید فشرده شد این قسمت اجرا میشه
                        p_state=1;                      //    نشون میده که کلیدی فشرده شد و تا زمانی که P_state متغیر
                                                     //    پردازش روی اون صورت نگیره 1 باقی میمونه 
                    }
                    [glow=red,2,300]تاپيک هاي ايجاد شده[/glow]

                    دیدگاه


                      #11
                      پاسخ : این سوالات برای کانتر 1 رقمی 7 سگمنت برای من ایجاد شده؟

                      با توجه به توضیحات مفصل شما تا حدودی نزدیک به همش برام قابل درک شد اما شما خودتون یک کدی گفتید به نام
                      i &= 0x0F که این علامت& نباید قبل از i بیاد؟ چرا بعدش اومده؟ و اینکه هر گاه بخواییم یک متغیر رو بصورت هگزی مقدار دهی کنیم باید از علامت & استفاده کنیم؟
                      و دیگه اینکه Xtal = 4000000 فرکانس نوسان سازی کریستال هست؟ که میشه 4 گیگاهرتز
                      و در این قسمتkey = PINC & 0b00000001;
                      در واقع همان گاهی ما از فشرده شدن کلید هست؟ چون کاملا پورت سی به صورت ورودی مقدار دهی شده؟
                      من یک پروژه دارم که کنترل دور موتور DC با PWM هست که دور موتورش رو باید با ولوم تغییر بدم و سرعتش رو از 0 تا 9 روی یک سون سگمنت نمایش بده ...
                      تازه 2 یا 3 روزه نشستم سر میکرو؟ کلی سردرد گرفتم همش وسطاش سرم گیج می ره؟ مثلا نمی دونم چرا پایه های سون سگمنت کاملا به پایه های پورت D وصل نشده؟ و یک پایه آزاده و در کدها در مرحله اول 0x3F, مقداردهی شده که فقط 6 پایه مقدار می گیره؟ یکی از دوستان گفت دو پایه ای که مقداردهی نشده صفر هست؟ آیا درست گفت؟ اینم عکسه پایه های سون سگمنت وصل شده به میکرو:
                      http://www.niloblog.com/files/images/ddbtvdphgus45t3wubh.png

                      دیدگاه


                        #12
                        پاسخ : این سوالات برای کانتر 1 رقمی 7 سگمنت برای من ایجاد شده؟

                        نوشته اصلی توسط complexcoding
                        با توجه به توضیحات مفصل شما تا حدودی نزدیک به همش برام قابل درک شد اما شما خودتون یک کدی گفتید به نام
                        i &= 0x0F که این علامت& نباید قبل از i بیاد؟ چرا بعدش اومده؟ و اینکه هر گاه بخواییم یک متغیر رو بصورت هگزی مقدار دهی کنیم باید از علامت & استفاده کنیم؟
                        و دیگه اینکه Xtal = 4000000 فرکانس نوسان سازی کریستال هست؟ که میشه 4 گیگاهرتز
                        و در این قسمتkey = PINC & 0b00000001;
                        در واقع همان گاهی ما از فشرده شدن کلید هست؟ چون کاملا پورت سی به صورت ورودی مقدار دهی شده؟
                        من یک پروژه دارم که کنترل دور موتور DC با PWM هست که دور موتورش رو باید با ولوم تغییر بدم و سرعتش رو از 0 تا 9 روی یک سون سگمنت نمایش بده ...
                        تازه 2 یا 3 روزه نشستم سر میکرو؟ کلی سردرد گرفتم همش وسطاش سرم گیج می ره؟ مثلا نمی دونم چرا پایه های سون سگمنت کاملا به پایه های پورت D وصل نشده؟ و یک پایه آزاده و در کدها در مرحله اول 0x3F, مقداردهی شده که فقط 6 پایه مقدار می گیره؟ یکی از دوستان گفت دو پایه ای که مقداردهی نشده صفر هست؟ آیا درست گفت؟ اینم عکسه پایه های سون سگمنت وصل شده به میکرو:
                        http://www.niloblog.com/files/images...us45t3wubh.png

                        i = i & 0x0F <=> i &= 0x0F
                        با اینکار عدد شما بین 0 تا 15 محدود میشه و مثلا اگه i 16 بشه به 0 تغییر میکنه
                        خیر 4 مگاهرتز
                        وقتی PINC با عدد 1 ماسک میکنی یعنی فقط کلید روی پورت C.0 مقدارش خونده میشه و هر پایه دیگه اگه مقدارش تغییر کنه تو برنامه تاثیر نمیزاره
                        شما میتونید از هر پورتی استفاده کنین
                        تمام پایه ها مقدار دهی شدن 0x3F = b0011111111
                        سون سگمنت 7 پایه داره. برای روشن کردن هر خونه کافیه پایه اون 1 کنیم. این کد هم کد عدد 0 هست
                        [glow=red,2,300]تاپيک هاي ايجاد شده[/glow]

                        دیدگاه


                          #13
                          پاسخ : این سوالات برای کانتر 1 رقمی 7 سگمنت برای من ایجاد شده؟

                          سلام دوست من
                          این کد نویسی که شما گذاشتید از جزوه ایی که دانلود کردید
                          عبارت P-STATE برای اینه که اگه کلید رو زدید و همون پایین نگه داشتید به مقدار شمارنده یه واحد بشتر اضافه نشه البته من با این کدنویسی کاملا مخالفم چون هم طولانیه و هم سخت و غیر قابل فهم
                          کانتر رو میشه خیلی راهتر از اینا برنامه نویسی کرد

                          دیدگاه

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