اطلاعیه

Collapse
No announcement yet.

کمک در اسکن keypad با وقفه

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

    کمک در اسکن keypad با وقفه

    سلام
    خسته نباشید
    من میخوام توی پروژه چراغ راهنمایی keypad 4*4 رو با استفاده از وقفه اسکن کنم
    مثلا در هر ثانیه 2بار تایمر پر بشه
    ولی درباره وقفه ها اطلاعات زیادی ندارم
    میخواستم اگر ممکن هست کمکم کنید
    میخوام با استفاده از keypad دو حالت داشته باشم
    یکی که به صورت دیفالت زمانش رو دادم توی برنامه ، یکی هم با keypad عدد بدم
    برنامم هم اینجوری نوشتم :

    #include <mega16.h>
    #include <delay.h>

    // Declare your global variables here
    unsigned int gy,gd,i,j;
    unsigned int ry,rd;
    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port A initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
    PORTA=0x00;
    DDRA=0xFF;

    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTB=0x00;
    DDRB=0x00;

    // Port C initialization
    // Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
    // State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
    PORTC=0x00;
    DDRC=0xFF;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=0xFF
    // OC0 output: Disconnected
    TCCR0=0x00;
    TCNT0=0x00;
    OCR0=0x00;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: Timer1 Stopped
    // Mode: Normal top=0xFFFF
    // OC1A output: Discon.
    // OC1B output: Discon.
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: Off
    // Compare B Match Interrupt: Off
    TCCR1A=0x00;
    TCCR1B=0x00;
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x00;
    OCR1AL=0x00;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer/Counter 2 initialization
    // Clock source: System Clock
    // Clock value: Timer2 Stopped
    // Mode: Normal top=0xFF
    // OC2 output: Disconnected
    ASSR=0x00;
    TCCR2=0x00;
    TCNT2=0x00;
    OCR2=0x00;

    // External Interrupt(s) initialization
    // INT0: Off
    // INT1: Off
    // INT2: Off
    MCUCR=0x00;
    MCUCSR=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=0x00;

    // USART initialization
    // USART disabled
    UCSRB=0x00;

    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;

    // ADC initialization
    // ADC disabled
    ADCSRA=0x00;

    // SPI initialization
    // SPI disabled
    SPCR=0x00;

    // TWI initialization
    // TWI disabled
    TWCR=0x00;

    while (1)
    {
    // Place your code here
    for(i=23;i>0;i--)
    {for(j=0;j<50;j++){
    ry=i%10;
    rd=(i-ry)/10;
    gy=(i-3)%10;
    gd=(i-3-gy)/10;
    if(i<4)
    {gy=0x00;
    gd=0x00;}
    PORTA=PORTA&0x0f;
    PORTC=ry*16+0x0f;
    PORTA.6=1;
    delay_ms(5);
    PORTA=PORTA&0x0f;
    PORTC=gy+0xf0;
    PORTA.4=1;
    delay_ms(5);
    PORTA=PORTA&0x0f;
    PORTC=gd+0xf0;
    PORTA.5=1;
    delay_ms(5);
    PORTA=PORTA&0x0f;
    PORTC=rd*16+0x0f;
    PORTA.7=1;
    delay_ms(5);

    }
    }
    for(i=23;i>0;i--)
    {for(j=0;j<50;j++){
    ry=i%10;
    rd=(i-ry)/10;
    gy=(i-3)%10;
    gd=(i-3-gy)/10;
    if(i<4)
    {gy=0x00;
    gd=0x00;}
    PORTA=PORTA&0x0f;
    PORTC=ry*16+0x0f;
    PORTA.4=1;
    delay_ms(5);
    PORTA=PORTA&0x0f;
    PORTC=gy+0xf0;
    PORTA.6=1;
    delay_ms(5);
    PORTA=PORTA&0x0f;
    PORTC=gd+0xf0;
    PORTA.7=1;
    delay_ms(5);
    PORTA=PORTA&0x0f;
    PORTC=rd*16+0x0f;
    PORTA.5=1;
    delay_ms(5);

    }
    }
    }
    }


    منظورم از gy رقم یکان سبز و gd رقم دهگان سبز و به همین ترتیب برای قرمز هست
    ممنون میشم کمک کنید :smile:

    #2
    پاسخ : کمک در اسکن keypad با وقفه

    با سلام
    دوست عزیز یه سر به اینجا بزنید ببینید کمکتون میکنه :
    http://www.eca.ir/forum2/index.php?topic=54602.0

    دیدگاه


      #3
      پاسخ : کمک در اسکن keypad با وقفه

      نوشته اصلی توسط mojtaba_led
      با سلام
      دوست عزیز یه سر به اینجا بزنید ببینید کمکتون میکنه :
      http://www.eca.ir/forum2/index.php?topic=54602.0
      سلام
      ممنون از لطفتون
      ولی راستش درباره وقفه ها چیز خاصی نمیدونم ، ممکن هست براتون که توی همین برنامه راهنمایی کنید ؟ :redface:
      توی بردی که بستم کیپد رو به پورت d وصل کردم

      دیدگاه


        #4
        پاسخ : کمک در اسکن keypad با وقفه

        برنامه شما که اصلا اینتراپت نداره این یک نمونه کد که در اینتراپت نوشته شده
        سه یا چهار تا از پایه های keypad با استفاده از یک گیت and رفته به اینتراپت .. و بازدن هر دکمه اینتراپت رخ میده میکرو می ره و keypad رو اسکن میکنه...
        کد رو براتون میزارم ولی شما برای انجام یک پروژه باید مراحل رو یکی یکی طی کنید.. مثلا اول lcd بعد اینتراپت بعد کیپد.
        این کد قسمت اینتراپت ولی فکر نمی کنم که به دردتون بخوره:
        کد:
        
        if((PINA & 0x0F)==0x0E)  column=0;
        delay_us(10);
        if((PINA & 0x0F)==0x0D)  column=1;
        delay_us(10);
        if((PINA & 0x0F)==0x0B)  column=2;
        delay_us(10);
        if((PINA & 0x0F)==0x07)  column=3;
        delay_us(10);
        PORTA=0xEF;
        if((PINA & 0x0F)!=0x0F)   row=0;
        delay_us(10);
        PORTA=0xDF;
        if((PINA & 0x0F)!=0x0F)   row=1;
        delay_us(10);
        PORTA=0xBF;
        if((PINA & 0x0F)!=0x0F)   row=2;
        PORTA=0x7F;
        delay_us(100);
        if((PINA & 0x0F)!=0x0F)   row=3;
        key=keypad[row][column];
        PORTA=0x0F;
        DDRA=0xF0;
        delay_ms(100);
        while(PIND.0==0);
        keypad_done=1;

        دیدگاه


          #5
          پاسخ : کمک در اسکن keypad با وقفه

          نوشته اصلی توسط vala.v
          برنامه شما که اصلا اینتراپت نداره این یک نمونه کد که در اینتراپت نوشته شده
          سه یا چهار تا از پایه های keypad با استفاده از یک گیت and رفته به اینتراپت .. و بازدن هر دکمه اینتراپت رخ میده میکرو می ره و keypad رو اسکن میکنه...
          کد رو براتون میزارم ولی شما برای انجام یک پروژه باید مراحل رو یکی یکی طی کنید.. مثلا اول lcd بعد اینتراپت بعد کیپد.
          این کد قسمت اینتراپت ولی فکر نمی کنم که به دردتون بخوره:
          کد:
          
          if((PINA & 0x0F)==0x0E)  column=0;
          delay_us(10);
          if((PINA & 0x0F)==0x0D)  column=1;
          delay_us(10);
          if((PINA & 0x0F)==0x0B)  column=2;
          delay_us(10);
          if((PINA & 0x0F)==0x07)  column=3;
          delay_us(10);
          PORTA=0xEF;
          if((PINA & 0x0F)!=0x0F)   row=0;
          delay_us(10);
          PORTA=0xDF;
          if((PINA & 0x0F)!=0x0F)   row=1;
          delay_us(10);
          PORTA=0xBF;
          if((PINA & 0x0F)!=0x0F)   row=2;
          PORTA=0x7F;
          delay_us(100);
          if((PINA & 0x0F)!=0x0F)   row=3;
          key=keypad[row][column];
          PORTA=0x0F;
          DDRA=0xF0;
          delay_ms(100);
          while(PIND.0==0);
          keypad_done=1;
          ممنون
          یعنی به نظر شما بدونم اینتراپت و با همون روش چک کردن سطری و ستونی بهتره ؟

          دیدگاه


            #6
            پاسخ : کمک در اسکن keypad با وقفه

            سلام
            من برای اسکن کی پد 3*7 با وقفه از این روش استفاده کردم(البته با مگا128)
            1-7 سطر کی پد به یک پورت که خروجی تعریف شده و مقدار صفر نوشته شده در پورت
            2-3 ستون کی پد به وقفه های int0,int1,in2 با تعریف وقفه بصورت low level برای جلوگیری از نویز
            3-هر وقت وقفه ایجاد شد.در روتین وقفه مربوطه، همان وقفه غیر فعال گردیده و سپس بصورت خروجی تعریف شده و مقدار صهر در آن نوشته شده.البته قبلش پورت مربوط به سطرها که خروجی شده بود با مقدار صفر.ورودی شده با فعال شده مقاومت pull up
            4-حالا مقدار پورت مربوط به سطرهارو میخونیم
            5- و در انتها تمام پورتها و وقفه ها را به شرایط اولیه یرمیگردونیم.
            6-این کار ساده و توسط خودم انجام وتست شده. :bye
            همیشه به یاد خدا باش !

            دیدگاه


              #7
              پاسخ : کمک در اسکن keypad با وقفه

              سلام
              خسته نباشید
              ممنون از همه دوستان
              ببخشید من تازه کار هستم
              کدهای مربوط به اینتراپت valva.v عزیز لطف کردن رو کجای برنامه باید بذارم ( بعد از فعال کردن وقفه 0 )
              میخواستم از روش سطری استفاده کنم که دیدم زمان ها به هم میریزه

              دیدگاه


                #8
                پاسخ : کمک در اسکن keypad با وقفه

                :redface:

                دیدگاه


                  #9
                  پاسخ : کمک در اسکن keypad با وقفه

                  به نظرم شما اول باید بگید که از چه الگورتیمی میخوایید برای اسکن صفحه کلید استفاده کنید

                  الگوریتمی برای این کار مد نظرتون هست ؟

                  دیدگاه


                    #10
                    پاسخ : کمک در اسکن keypad با وقفه

                    کد:
                    interrupt [EXT_INT0] ext_int0_isr(void)
                    {
                    
                    }
                    این تابع را برنامه تون اضافه کنید و کد وقفه را داخل آن بنویسید.

                    دیدگاه


                      #11
                      پاسخ : کمک در اسکن keypad با وقفه

                      سلام
                      من میخوام این چراغ توی 3 حالت کار کنه
                      یکی حالت دیفالت هستش که قرمز 23 ثانیه هست و سبز 20 ثانیه ( همین کد بالا )
                      یکی چراغ زرد چشمک بزنه
                      یکی با کیپد عدد بدم به 7سگمنت ها
                      اولش میخوام روی lcd بگم که مثلا کلید 1 برای حالت دیفالت ، 2 برای حالت کیپد و 3 برای چشمک زن فشار داده بشه

                      دیدگاه


                        #12
                        پاسخ : کمک در اسکن keypad با وقفه

                        ببخشید اگر مدت طولانی نبودم...

                        نوشته اصلی توسط momad
                        ممنون
                        یعنی به نظر شما بدونم اینتراپت و با همون روش چک کردن سطری و ستونی بهتره ؟
                        بله دقیقا...شما اگر این کار رو بکنید پردازش میکروتون میاد پایین و فقط اگر دکمه ای زده اشد keypad رو اسکن می کند..من رو همه ی پروژه هام از همین الگوریت استفاده می کنم و فوق العاده ازش راضی ام..اول اینکه وقتی شما یکم پروژه تون پیچیده باشه دیگه نمی تونید keypad رو مدام اسکن کنید و دوم اینکه کم کردن پردازش میکرو خیلی مفیده ...
                        فقط یه اشکال در این روش به نظرم می رسه و اون اینه که مجبوریم که یک آی سی and برای keypad بذاریم البته که میشه با چند تا دیود هم این کارو کرد..ولی خلاصه به سخت افزارمون یکسری چیزها اضافه می شه...
                        از ستر ها یا ستون ها میدیم به and و از خروجی and میدیم به اینتراپت ....

                        نوشته اصلی توسط momad
                        سلام
                        خسته نباشید
                        ممنون از همه دوستان
                        ببخشید من تازه کار هستم
                        کدهای مربوط به اینتراپت valva.v عزیز لطف کردن رو کجای برنامه باید بذارم ( بعد از فعال کردن وقفه 0 )
                        میخواستم از روش سطری استفاده کنم که دیدم زمان ها به هم میریزه
                        دقیقا طبق فرمایش آقای نجفیان بعد از interrupt [EXT_INT0] ext_int0_isr(void) .... یعنی جایی که وقتی وقفه اتفاق می افتد باید اجرا شود..

                        دیدگاه


                          #13
                          یکی برنامه وقفه واسه کیپد ۴&۴ داره؟
                          جدیدترین ویرایش توسط fkmj; ۱۰:۲۸ ۱۳۹۵/۰۶/۲۹.

                          دیدگاه


                            #14
                            پاسخ : کمک در اسکن keypad با وقفه

                            سلام دوستان من می خواستم با 4 تا کلید بتونم متغیر های مختلف رو کنترل کنم
                            [menu] * [up] * [down] * [save]
                            می خاستم با بسکام برنامه اش رو بنویسم ولی اوایل راهم و به هیچ نتیجه ای نرسیدم
                            مثلا: اگر menu را 3 ثانیه نگه دارم بره تو تنظیمات ، با up و down برم رو متغیر ی که می خواهم و با فشار دادن menu بتونم با up و down مقادرش رو تعیین کنم و با save کل تغییرات ذخیره بشه
                            لطفا کمک کنید

                            دیدگاه

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