اطلاعیه

Collapse
No announcement yet.

کانتر AVR

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

    کانتر AVR


    سوال
    « ارسال به: hojat : دسامبر 10, 2006, 1144 pm »


    mobin_m گفته:
    --------------------------------------------------------------------------------
    با عرض سلام خدمت شما دوست عزیز و فعال.

    برای من یک مشکلی در کار با AVR پیش آمده که بسیار خوشحال میشوم کمکم کنید.

    من مداری طراحی کردم که با هر بار فشردن کلید یک شماره اضافه شود و روی lcd نشان دهد.

    حال مشکل من این است که من حتما میخواهم از کانتر avr استفاده بکنم.ولی هنگام تست مشاهده میکنم که پس از هر بار زدن کلید 7 یا گاهی 16 و... اضافه میشود.من خود میدانم که علت آن نویزی است که بر اثر فشردن کلید به وجود میاید.با علم بر این که از مقاومت بالا کش استفاده کردم و حتی در قسمت CONFIG TIMER1=COUNTER از دستور NOISE CANCEL=1 هم استفاده کردم باز هم درست نشد.آیا برای کانتر مانند کلید دستوری مثل Debounce pinx هست ؟

    خواهش میکنم کمکم کنید.
    پایان نقل قول



    لطفا اگر کسی میتونه ، این دوستمون رو راهنمائی کنه ، چون من با کانترها کار نکردم.

    پاینده باشید.
    گر جان عاشق دم زند آتش بر این عالم زند
    وین عالم بی اصل را چون ذره ها بر هم زند

    #2
    پاسخ : کانتر AVR

    سلام.خوبین؟
    البته من در حدی نیستم که راهکار بگم، ولی آنچه که به نظرم میرسه رو میگم.
    شما CLOCK SOURCE رو روی RISING EDGE تنظیم کنید و MODE رو حالت NORMAL. حالا وقتی کلید رو میزنین یه لبه بالا گذر میفرسته و فقط این لبه موجب تحریک تایمر میشه و یک شماره میشمره. بعدش میتونید با استفاده از رجیستر TCNT0 مقدار تایمر رو بخونید. البه اگر کلید تون در سطح صفر و یک کار کنه، یعنی خودش وقتی میزنینش تولیأ پالس نکنه. اگر با پالس داره کار میکنه، برنامه زیر رو هم یه بررسی بکنید.

    /************************************************** *******************/

    // A global which tells us if the button has been pressed and is being held
    unsigned char DebouncedState = 0;
    // A global which tells if the button has been pressed and then released
    unsigned char ButtonReleased = 0;
    void GeneralTimeOut(void)
    {
    static unsigned char OldDebouncedState = 0; //Holds the previous value of
    the buttons.
    static unsigned char CountA = 0; // Used in the debouncing routine
    static unsigned char CountB = 0; // Used in the debouncing routine
    unsigned char CurrentSample = 0;

    // We enter this interrupt every 20ms!

    // ********** DEBOUNCE BUTTONS **********
    // This code does the debouncing routine using a vertical stack
    // it's all based around logical functions.

    // The Debouncing Bit
    // Sample the buttons (from Port B)
    CurrentSample = ~PORTA; // Note that I invert the input, it depends on
    // the pull-ups on your circuit.

    // Decrement the vertical counter and reset if button state changes
    // The counter starts at 0 then counts 3, 2, 1 and back to zero at which
    point
    // it sets the appropriate debounced state bit.

    // These two lines implement a 2-bit vertical counter
    CountA ^= CountB;
    CountB = ~CountB;

    // These two lines reset the counter if the state changes
    CountB &= (CurrentSample ^ DebouncedState);
    CountA &= (CurrentSample ^ DebouncedState);

    // These two lines change the values of debounced state to current sample
    but
    // only if the vertical counter has rolled over.
    DebouncedState &= (CountA | CountB);
    DebouncedState |= (CurrentSample & ~(CountB | CountA));

    // The statement below reads thus:
    // If (OldDebouncedState = 1 AND DebouncedState = 0) OR ButtonReleased = 1
    // THEN ButtonReleased = 1
    // The purpose of this statement is to differentiate between pressing a
    button
    // and holding a button down. ButtonReleased is set when the a button has
    // been pressed and released. ButtonReleased should be cleared before use
    in
    // the main code
    ButtonReleased |= (OldDebouncedState & ~DebouncedState);

    // This updates the OldDebouncedState register
    OldDebouncedState = DebouncedState;
    }


    همچنین تو اسمبلی هم میتونید از برنامه زیر استفاده کنید:

    http://www.4shared.com/file/7289321/.../debounce.html

    برای استفاده از دستورات اسمبلی تو C هم میتونید از دستور

    #asm البته میدونید که مربع باید اول بیاد بعدش asm

    برنامه اسمبلی تونو اینجا وارد منید.

    #endasm (مربع اولشه)

    موفق باشید.
    BNTSTBNT

    دیدگاه


      #3
      پاسخ : کانتر AVR

      سلام. از لحاظ سخت افزاری هم یه نگاهی به مدار زیر بنمدازین.

      BNTSTBNT

      دیدگاه


        #4
        پاسخ : کانتر AVR

        به این حالت ((بانس))می گوییند و دلیلش هم اینه که وقتی تیغه های کلید به هم نزدیک می شوند بر روی هم عمل شارژ انجام می دهمند و خروجی به صورت چند پالس در میاید
        از مدار زیر استفاده کن ورودی تایمر رو هم به صورت پایین رونده تنظیم کنید
        VCC
        ____
        |
        -----\/\/-------
        |
        []-------------\/\/-------
        | |
        -- O
        |___| \
        | O
        | |
        -----------------
        |
        -----
        ---
        -
        ما زنده به آنیم که آرام نگیریم موجیم که آسودگی ما عدم ماست

        وقتی یک ملت برای فرهنگ و نژاد و ملیت خویش ارزشی قائل نشد و حقی را که طبیعت برای نگاهداری نژاد پاکش به او ارزانی داشته بود پایمال ساخت و به بیگانگان روی آورد و تسلیم شد دیگر حق ندارد از شکست و بدبختی سیاسی که خودش باعث آن شده است شکایت کند .ادولف هیتلر

        r.babazadeh@yahoo.com

        دیدگاه


          #5
          پاسخ : کانتر AVR

          سلام. :eek:
          این مکدار بالا به چه زبانی هستش؟
          Ladder ؟ یا Quick؟ یا ...؟ :question:
          BNTSTBNT

          دیدگاه


            #6
            پاسخ : کانتر AVR

            سلام یاشار جان
            به زبان خاصی نیست،یه شماتیک هست که آقای بابازاده به این صورت کشیدن،2 تا مقاومت و یه خازن،زمین و VCC
            در دیر مغان آمد یارم قدحی در دست
            مست از می می خواران از نرگس مستش مست

            دیدگاه


              #7
              پاسخ : کانتر AVR

              دوست عزیز سلام.

              من هم یه زمانی با این مشکل برخورد کردم، شما یه دستور تاخیر به اندازه ی 75 تا 150 میلی ثانیه بزار بعد از دستوری که مقدار کلید را میخونه ، حتما مشکلت حل میشه.

              موفق باشید.
              صلی الله علیک یا اباعبدالله الحسین.

              صلی الله علی الباکین علی الحسین(ع).

              دیدگاه


                #8
                پاسخ : کانتر AVR

                نوشته اصلی توسط hojat

                سوال
                « ارسال به: hojat : دسامبر 10, 2006, 1144 pm »


                mobin_m گفته:
                --------------------------------------------------------------------------------
                با عرض سلام خدمت شما دوست عزیز و فعال.

                برای من یک مشکلی در کار با AVR پیش آمده که بسیار خوشحال میشوم کمکم کنید.

                من مداری طراحی کردم که با هر بار فشردن کلید یک شماره اضافه شود و روی lcd نشان دهد.

                حال مشکل من این است که من حتما میخواهم از کانتر avr استفاده بکنم.ولی هنگام تست مشاهده میکنم که پس از هر بار زدن کلید 7 یا گاهی 16 و... اضافه میشود.من خود میدانم که علت آن نویزی است که بر اثر فشردن کلید به وجود میاید.با علم بر این که از مقاومت بالا کش استفاده کردم و حتی در قسمت CONFIG TIMER1=COUNTER از دستور NOISE CANCEL=1 هم استفاده کردم باز هم درست نشد.آیا برای کانتر مانند کلید دستوری مثل Debounce pinx هست ؟

                خواهش میکنم کمکم کنید.
                پایان نقل قول



                لطفا اگر کسی میتونه ، این دوستمون رو راهنمائی کنه ، چون من با کانترها کار نکردم.

                پاینده باشید.
                کافیست بعد از اینکه کانتر یک واحد افزایش یافت ، کانتر را متوقف کرده و تاخیر 15 تا 30 میلی ثانیه ای ایجاد کنید .مجددا کانتر را فعال کنید

                $regfile = "m16def.dat"
                $crystal = 8000000
                $sim
                Dim C As Word
                Config Timer0 = Counter , Edge = Raising
                Config Pinb.0 = Input
                Set Portb.0
                Counter0 = 0
                C = 0
                Do
                Tccr0 = &B111 ' external pin T0 , raising
                A1:
                If Counter0 = C Then Goto A1
                Tccr0 = 0 'stop counter
                Waitms 25
                A2:
                If Pinb.0 = 0 Then Goto A2
                Waitms 25
                Cls
                Lcd Counter0
                C = Counter0
                Loop

                موفق باشید

                دیدگاه


                  #9
                  پاسخ : کانتر AVR


                  کافیست بعد از اینکه کانتر یک واحد افزایش یافت ، کانتر را متوقف کرده و تاخیر 15 تا 30 میلی ثانیه ای ایجاد کنید .مجددا کانتر را فعال کنی



                  من هم با ایشون موافقم این مشکل برای منم پیش اومده بود با Dellay درست شدش
                  A-Hosseini

                  دیدگاه


                    #10
                    پاسخ : کانتر AVR

                    نوشته اصلی توسط electronet_ir
                    کافیست بعد از اینکه کانتر یک واحد افزایش یافت ، کانتر را متوقف کرده و تاخیر 15 تا 30 میلی ثانیه ای ایجاد کنید .مجددا کانتر را فعال کنی



                    من هم با ایشون موافقم این مشکل برای منم پیش اومده بود با Dellay درست شدش
                    سلام
                    من با codvision کارمیکنم میشه بگید چطور درون کار کرد کانتر تاخیر بدم
                    توی برنامه من مدام TCNT1 درون یک متغییر int ریخته میشود
                    یکی میگفت خدا چرا به حرفای ما گوش نمیده گفتم
                    هان ای صنما،دل یک دله کن
                    گر سر ندهم ،وانگه گله کن

                    دیدگاه


                      #11
                      پاسخ : کانتر AVR

                      سلام
                      دوستان کسی میدونه وقفه این کانتر کی سرریز میشه؟یعنی چند ثانیه طول میکشه؟
                      کلاک I/O ،16 مگاهرتز هست

                      TCCR1A=0x00;
                      TCCR1B=0x04;
                      TCNT1H=0x37;
                      TCNT1L=0xE1;
                      ICR1H=0x00;
                      ICR1L=0x00;
                      OCR1AH=0x00;
                      OCR1AL=0x00;
                      OCR1BH=0x00;
                      OCR1BL=0x00;

                      دیدگاه

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