اطلاعیه

Collapse
No announcement yet.

چند برنامه به زبان C برای اسکن صفحه کلید!

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

    چند برنامه به زبان C برای اسکن صفحه کلید!

    سلام به همه دوستان :mrgreen:
    موضوع اینه که من مدت ها پیش برنامه اسکن صفحه کلید 4*4 رو با ورژن قدیمی تر کدویژن نوشتم و خیلی هم خوب جواب گرفتم
    حالا همون خطوط رو با ورژن 2.05 نوشتم و در کمال ناباوری بسیار افتضاح جواب میداد (به طور همزمان کدهای یکسان رو با هر دو ورژن کامپایل کردم ورژن قدیمی جواب میده ولی جدیده نه! البته فهمیدن این موضوع یک هفته ای بیشتر وقتمو گرفت!!! )
    برای جواب گرفتن ار ورژن جدید کدها رو طوری تغییر دادم که 100% غلطه ولی همین کدهای غلط روی میکرو درست جواب میده!! روی چند کدویژن v2.05 این موضوع رو تست کردم و همه همینطور بود!!! :surprised:
    البته یادآوری کنم این مشکل فقط با قسمت کیپد برنامه است بقیه قسمت ها تک تک خوب جواب دادند.
    حالا موندم به این کدهای غلط که رو میکرو درست جواب میده اعتماد کنم؟ به نظر شما مشکل از چیه؟ در ضمن مجبورم از v2.05 استفاده کنم چون می خوام sd کارت هم داشته باشم و همونطور که میدونید ورژن های قدیمی تر کدویژن کتابخانه های لازم رو ندارند و احتمالا کمی درد سر ....
    دوستان اگر براتون زحمتی نیست و کدویژن V2.05 رو دارید و تا حالا باهاش مشکلی نداشتید لطف کنید این برنامه من رو یه کامپایل کنید و برام بذارید تا میکرو را پروگرام کنم و ببینم مشکل از کدویژن منه یا... :mrgreen:
    http://www.persiangig.com/pages/down...keypadtest.rar
    سپاس سپاس سپاس! :mrgreen:
    همیشه بزرگوار تر از آن باشید که برنجید
    و نجیب تر از آن باشید که برنجانید!

    #2
    پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

    با سلام
    بفرمایید من کامپایل کردم : keypadtest.rar

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

    دیدگاه


      #3
      پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

      آقا مجتبی سپاس گزارم :mrgreen:
      مث اینکه مشکل همچنان باقی است!! :mrgreen:
      به چشم به محض اینکه در پروتئوس شبیه سازیش کردم میزارم ببینید :mrgreen:
      پس تا ساعتی دیگر و تلاشی دوباره........
      همیشه بزرگوار تر از آن باشید که برنجید
      و نجیب تر از آن باشید که برنجانید!

      دیدگاه


        #4
        پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

        باز هم سلام
        اینم فایل پروتئوس و کدویژن، کدویژن رو دوباره گذاشتم چون یه تغییر کوچولو توش دادم:
        http://www.persiangig.com/pages/down...com/keypad.rar
        خب نتیجه اینکه در شبیه سازی سطرهای 0و 3 هر دو به عنوان سطر صفر شناخته می شوند و در عمل هر چهار سطر به عنوان سطر صفر!!! :surprised:
        به کاراکتر هایی که رو lcd نمایش داده می شوند توجه نداشته باشید و فقط سطرها و ستون ها رو ببینید علت این تفاوت، تفاوت ظاهری کیپدی که در عمل استفاده کرده ام با کی پد پروتئوس است ...
        دیگه نمی دونم!!! :sad:
        همیشه بزرگوار تر از آن باشید که برنجید
        و نجیب تر از آن باشید که برنجانید!

        دیدگاه


          #5
          پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

          ببخشید من برنامتون رو بالا پایین کردم اما چیزی متوجه نشدم البته واقعیتش رو بخواهید روزه امونم بریده اصلا مخم کار نمیکنه
          اما جسارتا من دقیقا همچین چیزی با iar نوشتم فایل هاش رو همراه با شماتیک پرتئوسش میزارم ببینید کمکتون میکنه : keypad_with_mega16_v3.rar

          راستی اگر iar نصب ندارید این هم برنامه اش هست ، چیز خاصی نداره همچی توی روتین وقفه انجام میشه :


          #include<ioavr.h>
          #include<intrinsics.h>
          #include "lcd.h"
          #include "delay.h"
          #include "stdio.h"
          unsigned char key;
          __C_task void main(void)
          {
          char str[16];
          GICR|=0x40;
          MCUCR=0x03;
          MCUCSR=0x00;
          GIFR=0x40;
          DDRA=0X0F;
          PORTA=0X0F;
          __enable_interrupt();
          lcd_init(LCD_DISP_ON);
          lcd_clrscr();
          lcd_home();
          lcd_puts("Enter your pass"
          _delay_ms(2000);
          while(1){
          sprintf(str,"key=%d",key);
          lcd_clrscr();
          lcd_gotoxy(0,0);
          lcd_puts(str);
          _delay_ms(100);
          };
          }
          /***********INT0*******************/
          #pragma vector= INT0_vect
          __interrupt void EXT_INT0(void)
          {
          PORTA=0X01;
          unsigned char count=4;
          key=0;
          for(count=1;count<5;count++){
          if(PINA&(1<<PINA4))key=(count*4-3);
          if(PINA&(1<<PINA5))key=(count*4-2);
          if(PINA&(1<<PINA6))key=(count*4-1);
          if(PINA&(1<<PINA7))key=(count*4);
          if(PORTA<0X80)PORTA<<=1;
          }
          PORTA=0X0F;
          }


          اگر در مورد این برنامه سوالی داشتید من در خدمتم

          دیدگاه


            #6
            پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

            سلام و خدا قوت
            آقا مجتبی نماز و روزه اتون قبول درگاه حق :mrgreen: آقا راضی به زحمت نبودم که کد برنامه ای که نوشتم رو پیگیری کنید و بگید ایراد کجاست! خدایی برنامه ای رو که یکی دیگه نوشته باشه حوصله می خواد بفهمی چی به چیه. این برنامه ای که کدشو دادم خدمتتون رو قبلا نوشتم و چندین بار هم ازش استفاده کردم البته همونطور که گفتم با ورژن های قدیمی تره کدیژن :mrgreen: حالا نمی دونم این طوریش شده یا من
            ممنون به خاطر کدی که گذاشتید فهمیدم چی به چیه حالا یکی باکدویژن طبق الگوریتم شما می نویسم ببینم چی در میاد ازش! فقط یه سوال چرا ستون ها رو با یه مقاومت 10k زمین کردید؟ سطرهای متصل به میکرو خروجی با مقدار یک تعریف شدند و ستون ها ورودی و در حالت high امپدانس درسته؟پس با این کار ورودیها رو pull down کردید تا تغییر وضعیت از 0 به 1 تشخیص داده بشه درسته؟
            و اما بد نیست بگم طرز کار مدارم چیه شاید بدرد یکی خورد!!(البته گمون نکنم :mrgreen:

            خب دوستان توی این مدار پایه های صفر تا 3 پورت A به صورت ورودی و پول پ تعریف شده اند و پایه های 4 تا 7 خروجی و با مقدار صفر و پایه اینتراپت صفر نیز به صورت ورودی و پول پ، حالا به مدار خوب دقت کنید اگر یکی از کلیدها فشرده شود یک سطر به یک ستون وصل می شود بدین ترتیب در کاتد یکی از دیودها ولتاژ صفر قرار می گیرد و روتین وقفه صفر که حساس به سطح صفر تنظیم شده اجرا می شود، ضمن اینکه همزمان ولتاژ یکی از سه پایه 0 تا 3 پورت A نیز صفر می شود. برنامه نوشته شده بر اساس همین قضیه سطر و ستون را تشخیص می دهد. اگر یه موقع کسی سوالی در مورد برنامه داشت بپرسه.

            و اما وقتی که می خواستم عکس مدار رو پلود کنم متوجه شدم در فایل شماتیک سطر اول و چهارم به هم وصل شده؟(ببخشید به گمونم به خاطر همون ماه رمضونه!) با این حساب برنامه و شبیه سازی پروتئوس کاملا درست است!
            به نظر شما از این چه نتیجه ای می توان گرفت: اینکه کدویژن هیچ مشکلی نداره و کد کاملا درسته و باید در سخت افزار دنبال عیب بگردم!) هر چند که از بس کلافه شدم شاید مدارشو بیشتر از 6_7 بار بسته باشم!
            پس عزمی جزم تلاشی دوباره(هر که ندونه فکر می کنه حالا می خوام چیکار کنم!).....
            سپاس فراوان
            همیشه بزرگوار تر از آن باشید که برنجید
            و نجیب تر از آن باشید که برنجانید!

            دیدگاه


              #7
              پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

              سلام
              هدف از راه اندازی وقفه تو کارتون چی بوده که اگه یه روزی ما هم کاری خواستیم انجام بدیم بدونیم :agree:
              خدایا مرا آن ده که آن به

              دیدگاه


                #8
                پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

                سلام دوست عزیز
                خب وقتی یه برنامه مینویسی به احتمال زیاد تنها یه قسمت کوجولوی اوون کیپد هست و میکرو باید به کارهای دیگه هم برسه، اگه از وقفه استفاده نکنی در برنامه ای که مینویسی باید مدام وضعیت سطرها و ستون ها رو چک کنی تا اگه کلیدی فشرده شد پیداش کنی، ولی وقتی از وقفه استفاده میکنی میکرو میره به کاراش میرسه اگه کلیدی فشرده شد توی روتین وقفه می فهمه که اوون کلید چی بوده :mrgreen:
                واضحه چی میگم؟
                همیشه بزرگوار تر از آن باشید که برنجید
                و نجیب تر از آن باشید که برنجانید!

                دیدگاه


                  #9
                  پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

                  بله کاملا درسته
                  از بس برنامه های ما کوچیکه که هنوز به فکره این چیزا نیفتادم
                  البته فکر کنم به نوع میکرو هم بستگی داشته مثلا تو مگا 128 این چیزا احساس میشه؟لازمه؟
                  خدایا مرا آن ده که آن به

                  دیدگاه


                    #10
                    پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

                    سلام و خدا قوت
                    آقا مجتبی نماز و روزه اتون قبول درگاه حق آقا راضی به زحمت نبودم که کد برنامه ای که نوشتم رو پیگیری کنید و بگید ایراد کجاست! خدایی برنامه ای رو که یکی دیگه نوشته باشه حوصله می خواد بفهمی چی به چیه. این برنامه ای که کدشو دادم خدمتتون رو قبلا نوشتم و چندین بار هم ازش استفاده کردم البته
                    ممنون ، همچنین ؛
                    خواهش میکنم اما من که نتونستم در مورد برنامه تون کمک کنم کما اینکه گفتید مشکل از سخت افزاره !
                    فقط یه سوال چرا ستون ها رو با یه مقاومت 10k زمین کردید؟
                    از اونجا که پایه های میکرو وقتی که به صورت ورودی تعریف میشن یا پول دان هستند یا های امپدانس از طرفی باید حالت دیفالت ما برای خوندن کی پد 0 منطقی باشه به خاطر همین امدم پول دانش کردم
                    سطرهای متصل به میکرو خروجی با مقدار یک تعریف شدند و ستون ها ورودی و در حالت high امپدانس درسته؟
                    بله
                    پس با این کار ورودیها رو pull down کردید تا تغییر وضعیت از 0 به 1 تشخیص داده بشه درسته؟
                    بله

                    دیدگاه


                      #11
                      پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

                      نوشته اصلی توسط arashdj
                      البته فکر کنم به نوع میکرو هم بستگی داشته مثلا تو مگا 128 این چیزا احساس میشه؟لازمه؟
                      خب دوست عزیز منظورت چیه که به نوع میکرو بستگی داشته باشه؟ به میکرو بستگس نداره به برنامه ای که شما می خوای میکرو اجرا کنه بستگی داره اگر میکرو کارهای زیادی واسه انجام دادن نداشته باشه شما شاید بتونی بدون وقفه بنویسی ولی اگر میکرو باید به خیلی چیزا رسیدگی کنه انوقت استفاده از وقفه ها نه تنها برای برنامه کیپد بلکه برای سایر موارد هم اهمیت پیدا می کنه.
                      شاد و سلامت باشی :mrgreen:
                      همیشه بزرگوار تر از آن باشید که برنجید
                      و نجیب تر از آن باشید که برنجانید!

                      دیدگاه


                        #12
                        پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

                        باز هم سلام
                        :mrgreen:
                        و باز هم سپاس آقا مجتبی :mrgreen: طبق سخت افزار و الگوریتم شما برنامه کیپد رو با کدویژن نوشتم و هم شبیه سازی و هم در عمل جواب داد فقط یه نکته ای دیدم که گفتم به شما هم گفته باشم: اول اینکه بین کاتد و اینتراپت 0 یک مقاومت 220 اهم گذاشتم گفتم شاید یه موقع جریان زیادی از دیودها و پورت میکرو عبور کنه،محض احتیاط! شایدم لازم نباشه.
                        و اما نکته اصلی این بود که پایه ی اینتراپت هم باید با یک مقاومت پول دان بشه و الا انگار که مدام وقفه اتفاق میفته! البته این موضوع در عمل اتفاق میفته و در شبیه سازی پروتئوس نبود این مقاومت مشکلی ایجاد نمی کنه.

                        با سپاس :mrgreen:
                        همیشه بزرگوار تر از آن باشید که برنجید
                        و نجیب تر از آن باشید که برنجانید!

                        دیدگاه


                          #13
                          پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

                          :redface: :redface:
                          منو قایم کنید :sad:
                          ببخشید آقا مجتبی یه سوال: شما وقفه رو حساس به چی تنظیم کردید؟ لبه بالا رونده؟ در عمل این مدار بستید جواب داده؟
                          من وقفه رو به لبه بالا رونده حساس کردم ، چون در بدنه وقفه خارجی از دستور lcd_clear استفاده کرده بودم فکر می کردم مدار پایدار شده ولی حالا که بر حسب نیاز این دستور رو پاک می کنم مدار ناپایدار میشه و پشت سر هم کلید فشرده شده چاپ میشه (دستور چاپ در بدنه وقفه نوشته شده!) به طوری که باید خیلی دقیق به lcd نگاه کنی تا متوجه بشی که عدد داره به سرعت چاپ میشه و گرنه به نظر میاد lcd پاک میشه.
                          این کدی است که نوشتم:
                          char keycode[16]={'1','2','3',' A','4','5','6', 'B','7','8','9& #039;,'C','Q','0',&# 039;S','E'};
                          char keynum;

                          // External Interrupt 0 service routine
                          interrupt [EXT_INT2] void ext_int2_isr(void)
                          {
                          // Place your code here
                          int x;
                          PORTA=0x01;
                          for(x=0;x<4;x++)
                          {
                          if(PINA&0x10) keynum=x*4;
                          else if (PINA&0x20) keynum=x*4+1;
                          else if (PINA&0x40) keynum=x*4+2;
                          else if (PINA&0X80) keynum=x*4+3;
                          if(PORTA<0x80) PORTA=PORTA<<1;
                          };

                          PORTA=0x0F;

                          lcd_putchar(keycode[keynum]);
                          }

                          void main (void)
                          {
                          ....
                          ...
                          ...
                          }
                          مشکل اصلی از همین حساس به لبه بودن وقفه است! :cry:
                          بعد از کلی خوشحالی ببینید چه بر سرم امده :cry2:
                          سپاس
                          همیشه بزرگوار تر از آن باشید که برنجید
                          و نجیب تر از آن باشید که برنجانید!

                          دیدگاه


                            #14
                            پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

                            :wow: :applause:
                            درست شد ببخشید ناراحتتون کردم :redface:
                            خب همونطور که گفتم مشکل از حساس به لبه بودنه علی رغم اینکه مدار و برنامه فوق در پروتئوس خیلی خوب جواب میده اما در عمل به خاطر لرزش کلید فشرده شده بارها وقفه اجرا میشه!
                            اما راه چاره اینه که اول روتین وقفه وقفه غیر فعال شود، بعد از پیدا کردن کلید مورد نطر تا زمانی که کلید در حالت فشرده شده است تاخیر زمانی داشته باشیم تا کلید فشرده شده رها شود(حلقه while ) و بعد از رها شدن کلید دوباره یه تاخیر ایجاد کنیم تا لرزش تمام شود( در عمل 60 میلی در مدار من خوب بود کمتر کمی نوسان داشت) و در آخر قبل از خروج از روتین وقفه دوباره وقفه فعال شود.

                            interrupt [EXT_INT2] void ext_int2_isr(void)
                            {
                            // Place your code here
                            int x;

                            EIMSK=0x00;
                            EIFR=0x00;

                            PORTA=0x01;
                            for(x=0;x<4;x++)
                            {
                            if(PINA&0x10) keynum=x*4;
                            else if (PINA&0x20) keynum=x*4+1;
                            else if (PINA&0x40) keynum=x*4+2;
                            else if (PINA&0X80) keynum=x*4+3;
                            if(PORTA<0x80) PORTA=PORTA<<1;
                            };

                            PORTA=0x0F;
                            while((PINA&0xF0)!=0x00)
                            {
                            delay_ms(50);
                            };
                            delay_ms(60);

                            EIMSK=0x04;
                            EIFR=0x04;

                            //lcd_clear();
                            lcd_putchar(keycode[keynum]);
                            }
                            امیدوارم که دیگه مشکلی نباشه :redface:
                            با سپاس
                            همیشه بزرگوار تر از آن باشید که برنجید
                            و نجیب تر از آن باشید که برنجانید!

                            دیدگاه


                              #15
                              پاسخ : تفاوت پاسخ کد هگز ساخته شده با کدیژن v2.05 و v2.03.4 روی میکرو و با برنامه یکسان

                              شما وقفه رو حساس به چی تنظیم کردید؟ لبه بالا رونده؟ در عمل این مدار بستید جواب داده؟
                              حساس به لبه بالا رونده ، نه متاسفانه نبستم راستش رو بخواید من اکثر برنامه هایی که مینویسم چون اول روی کاغذ مینویسم و روی همون تستش میکنم بعد میام توی نرم افزار مینویسم اگر بشه با پرتئوس تستش کرد با پرتئوس هم تستش میکنم البته می دونم این یه کار کاملا اشتباه اما از اونجا که من اصلا کارم الکترونیک نیست و بیشتر بر حسب علاقه برنامه مینویسم وقت نمیکنم که بیشتر برنامه هام رو توی عمل هم تستشون کنم مگه اینکه قرار باشه برای کسی دیگه ای بنویسمش و بابتش پول بگیرم
                              من وقفه رو به لبه بالا رونده حساس کردم ، چون در بدنه وقفه خارجی از دستور lcd_clear استفاده کرده بودم فکر می کردم مدار پایدار شده ولی حالا که بر حسب نیاز این دستور رو پاک می کنم مدار ناپایدار میشه و پشت سر هم کلید فشرده شده چاپ میشه (دستور چاپ در بدنه وقفه نوشته شده!) به طوری که باید خیلی دقیق به lcd نگاه کنی تا متوجه بشی که عدد داره به سرعت چاپ میشه و گرنه به نظر میاد lcd پاک میشه.
                              خوب ببینید این یه امر کاملا طبیعیه که میشه اون رو با دیبانس نرم افزاری و حتی سخت افزاری حلش کرد مثلا برای ایجاد یک دیبانس نرم افزاری از اون جا که اسکن صفحه کلید توی روتین وقفه انجام میشه و نمیشه از تاخیری مثل delay برای انجام همچین کاری استفاده کرد یکیش دقیقا همین کاری که خودتون بهش اشاره کردید یعنی بیابم توی روتین وقفه ، وقفه رو غیر فعال کنیم صفحه کلید رو اسکن کنیم بعد یک delay بزاریم بعد از روتین وقفه خارخ بشیم اما اینکار نمیتونه کار درستس باشه چون شما اگر قراره یک بار رو از دوش میکرو بر دارید تادستورات با سرعت بیشتری اجرا بشن دوباره همون مشکل قبلی رو براش ایجاد کردین
                              اما پیشنهاد من برای رفع این موضوع اینه که شما احتمالا توی برنامتون از تایمر و روتین وقفه سریز اون استفاده میکنید یا حداقل اگر نکردید یک تایمر رو برای اینکار اختصاص بدین حالا بیان توی روتین وقفه سر ریز یک متغیر تعریف کنید و بعد یک شرطی رو برمبنای اون متغیر بنویسید به اینصورت که افزایش پله پله اون رو در برداشته باشه و مقدار اون رو چک کنه که مثلا اگر برابر شد با 20(با توجه به مدت زمان اجرای هر وقفه سریز تایمرتون ) بیاد وقفه خارجی صفر رو فعال کنه و مقدار اون متغییر رو هم برابر با صفر کنه حالا بیان توی روتین وقفه خارجی صفر در ابتدای روتین وقفه خارجی صفر رو غیر فعال و اون متغیر رو که به صورت گلوبال تعریف کرده بودید رو برابر با صفر کنید همین ! و البته روش های دیگه که من الان به ذهنم نمیرسه
                              در مورد دیبانس سخت افزاری می تونید از یک فیلتر پایین گذر استفاده کنید

                              و البته یک پیشنهاد برادرانه : سعی کنید توی روتین وقفه هیچ وقت از توابع استفاده نکنید چرا که اینجوری کامپایلر برای حفظ کردن مقدار رجیستر ها میاد تمومشون رو توی دیتا استک پوش میکنه و این باعث افزایش کد و حجم برنامه و کاهش سرعت اجرای وقفه میشه

                              دیدگاه

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