NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 4392 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 16 از 16

موضوع: مشکل با خواندن یک کلید ساده + عکس+ برنامه

  1. #1
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض مشکل با خواندن یک کلید ساده + عکس+ برنامه

    سلام

    سریع میرم سر اصل مطلب..
    میخوام تو LCD کاراکتری خط اول کلمه HAMID نمایش داده بشه و با زدن کلید که در پورت B.0 هست در خط دوم کلمه answer right نمایش داده بشه ...

    کلمه HAMID رو میتونم نمایش بدم ولی اون دکمه کار نمیکنه...

    اینم عکسش که اگر روش کلید کنید بزرگتر میشه


    اینهم برنامه:

    کد:
    #include <mega16.h>
    
    // Alphanumeric LCD Module functions
    #asm
       .equ __lcd_port=0x15 ;PORTA
    #endasm
    #include <lcd.h> 
    #include <delay.h>
    void main (void)
    {
    PORTB=0x00;
    DDRB=0x00;
    lcd_init(16);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_puts("HAMID");
    delay_ms(200);
    if(PINB.0==0){
    lcd_gotoxy(1,0);
    lcd_puts("answer right!!") ;
    }
    while(1);
    }

  2. تشکرها از این نوشته :


  3. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  4. #2
    کاربر فعال mihman آواتار ها
    تاریخ عضویت
    Jul 2011
    نوشته ها
    288
    تشکر
    159
    تشکر شده 164 بار در 121 پست

    پیش فرض

    سلام.تغییر زیر را اعمال کنید ببینید درست میشه یا نه.
    Portb=255;

  5. تشکرها از این نوشته :


  6. #3
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mihman نمایش پست ها
    سلام.تغییر زیر را اعمال کنید ببینید درست میشه یا نه.
    Portb=255;
    ممنون....نشد...!!

  7. تشکرها از این نوشته :


  8. #4
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    سلام دوست عزيز
    شما بايد دستوري كه فشرده شده كليد رو بررسي ميكنه تو حلقه While بذاريد. به اين صورت:
    [PHP]#include <mega16.h>

    // Alphanumeric LCD Module functions
    #asm
    .equ __lcd_port=0x15 ;PORTA
    #endasm
    #include <lcd.h>
    #include <delay.h>
    void main (void)
    {
    PORTB=0x00;
    DDRB=0x00;
    lcd_init(16);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_puts("HAMID");
    delay_ms(200);


    while(1)
    {
    if(PINB.0==0)
    {
    lcd_gotoxy(1,0);
    lcd_puts("answer right!!");
    }
    }

    }
    [/PHP]
    _____________________________________
    _____________________________________

  9. کاربران : 4 تشکر کرده اند از شما sadmonew برای ارسال این پست سودمند:


  10. #5
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    ممنون

    روشی که شما گفتید رو امتحان کردم.... درست شد..!!

  11. تشکرها از این نوشته :


  12. #6
    مدیر کل انجمن ها morteza_rk آواتار ها
    تاریخ عضویت
    Apr 2009
    نام
    مرتضی رحیمی کردمحله
    نوشته ها
    2,071
    تشکر
    2,376
    تشکر شده 2,899 بار در 1,263 پست

    پیش فرض

    شما بايد دستوري كه فشرده شده كليد رو بررسي ميكنه تو حلقه While بذاريد.
    درسته ، قبلا که شما شرط بررسی کلید رو داخل حلقه While نگذاشته بودید برنامه فقط یکبار این شرط رو بررسی می کرد و بعدش می افتاد توی حلقه ی بینهایت While و چون توی این حلقه ی بینهایت هیچ دستوری وجود نداشت بنابراین میکرو هم کاری نمی کرد. اما الان که شرط بررسی کلید رو داخل حلقه ی بینهایت While قرار دادید CPU هر لحظه داره اونو چک می کنه.

    اما فکر می کنم برنامه باز هم یه اشکال جزئی داره! ببینید الان اگه شما کلید رو فشار بدید از لحظه ی فشار دادن کلید تا رها کردنش ممکنه یه مدت خیلی کم مثلا 100 میلی ثانیه طول بکشه ، حالا در این مدت 100 میلی ثانیه ، چندین بار (مثلا 100 بار ، بستگی به میزان کلاک AVR داره) نوشته روی LCD ظاهر میشه ، البته چون هر دفعه نوشته همون جای قبلی ظاهر میشه مشکلی پیش نمیاد ولی در برنامه های دیگه ممکنه این اثر جالب نباشه.

    برای مثال در نظر بگیرید که می خواید با هر بار فشار دادن کلید نوشته ی روی LCD یک واحد به سمت راست بره ، اونوقته که کار خراب میشه! برای رفع این مشکل کافیه که در انتهای حلقه ی if یک تاخیر کوچیک مثلا در حد 150 الی 250 میلی ثانیه بذارید.
    .
    اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم


    وبلاگ شخصی من

  13. کاربران : 3 تشکر کرده اند از شما morteza_rk برای ارسال این پست سودمند:


  14. #7
    مدیر انجمن M.ABDOLLAHI آواتار ها
    تاریخ عضویت
    Dec 2008
    نام
    مهدی عبدالهی
    نوشته ها
    976
    تشکر
    1,567
    تشکر شده 2,677 بار در 667 پست

    پیش فرض

    حق با شماست بهتره یک زمان دیبانس(لرزش گیری) در نظر بگیرید و بعد از اینکه فرمانها اجرا شد صبر کنیسد تا طرف دستش را از روی کلید بردارد
    [PHP]#include <mega16.h>

    // Alphanumeric LCD Module functions
    #asm
    .equ __lcd_port=0x15 ;PORTA
    #endasm
    #include <lcd.h>
    #include <delay.h>
    void main (void)
    {
    PORTB=0x00;
    DDRB=0x00;
    lcd_init(16);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_puts("HAMID");
    delay_ms(200);


    while(1)
    {
    if(!PINB.0)
    {
    delay_ms(20);
    if(!PINB.0)
    {
    lcd_gotoxy(1,0);
    lcd_puts("answer right!!");
    while(!PINB.0);
    }
    }
    }

    }[/PHP]
    در ضمن بهتره برای ساده تر کردن سخت افزارت از پول آپ داخلی استفاده کنی من خودم ههمیشه همینکار رو میکنم با این فرمان
    [PHP]PORTB.0=1;[/PHP]
    ویرایش توسط M.ABDOLLAHI : 05-03-2012 در ساعت 21:19
    و هر كس از ياد [خداى‏] رحمان دل بگرداند، بر او شيطانى مى‏گماريم تا براى وى دمسازى باشد. (36)و مسلّماً آنها ايشان را از راه باز مى‏دارند و [آنها] مى‏پندارند كه راه يافتگانند. (37)تا آن گاه كه او [با دمسازش‏] به حضور ما آيد، [خطاب به شيطان‏] گويد: «اى كاش ميان من و تو، فاصله خاور و باختر بود، كه چه بد دمسازى هستى!» (38)(سوره زخرف)بگو: «پليد و پاك يكسان نيستند، هر چند كثرت پليد [ها] تو را به شگفت آوَرَد. پس اى خردمندان، از خدا پروا كنيد، باشد كه رستگار شويد.» (100)(سوره مائده(

  15. تشکرها از این نوشته :


  16. #8
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    بازهم سلام...

    احساس کردم طرز نوشتنم در پست قبلی یه خورده پیچیده بود لذا حذفش کردم...

    سوالم رو خیلی ساده تر میکنم...

    ببینید... من سه تا کلید رو تو مدارم گذاشتم و اونها رو اینطوری بستم...



    دیگه مهم نیست که این نوع بستن درست هست یا نه...چون مدارم یه PCB هست که دیگه تولید شده وتموم شده...

    من میخوام با این کلید ها چه به روش pullup و چه pull down سه تا تابع F1 و F2 و F3 رو اجرا کنم... به طوری که اگر کلید اولی رو زدم تابع اولی و اگر دومی رو زدم تابع دومی و اگر سومی رو زدم تابع سومی اجرا بشه...

    همین...!!

    چیکار باید بکنم...؟ فقط یه تیکه کد برای همون تابع F1 که با شماتیک نشون داده شده سازگار باشه برام بذارید محبت بزرگی انجام داده اید.

    سپاسگذارم از محبتتون.

  17. #9
    ناظم انجمن Ma3ood آواتار ها
    تاریخ عضویت
    Aug 2011
    نام
    مسعود
    نوشته ها
    2,248
    تشکر
    1,912
    تشکر شده 3,087 بار در 1,509 پست

    پیش فرض

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

  18. #10
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    نقل قول نوشته اصلی توسط masoud70 نمایش پست ها
    دوست عزیز الان شما با توجه به شماتیکی که دارید سه تا از کلید ها را به اینتراپت متصل کردید منظورتون اینه که تابع ها با اینتراپت اجرا بشه یا این پایه ها به طور تصادفی انتخاب شده.؟؟؟؟؟
    در مورد کلید خوانی که دوستان راهنمایی کاملی کردند حتی در مورد لرزش گیری از کلید و.....
    مشکل شما دقیقا چیه؟
    سپاس از شما مسعود جان که وقت گذاشتید و بمن پاسخ دادید....

    خیر.... اینتراپتی در کار نیست...در حقیقت هشت تا پوش باتن هست که من برای سادگی سوال و مفهوم بودن آن سه تا پوش باتن در شماتیک پروتئوس گذاشتم...

    مشکل اینه:

    یه نگاه به شماتیک پروتئوس بندازید....برای اینکه بخوام میکرو بطوردائم منتظر این پوش باتن ها باشه باید
    صفر شدن پورتهای مربوطه رو چک کنم یا یک شدن آنها رو...؟

    یعنی اگربخوام با زدن کلید اولی تابع F1 اجرا بشه اولا مقدار PORTB.0 و DDRB.0 رو چی باید بذارم ثانیا در شرط if چی رو باید چک کنم که میکرو بفهمه کلید زده شده و تابع باید اجرا بشه...؟

    الان من میخوام با زدن دکمه اول رو glcd عبارت SEL CH1 چاپ بشه... آیا این تیکه برنامه با توجه به شماتیک داده شده درسته...؟
    کد:
    if(PINB.0) 
       { 
        delay_ms(20);   
        if(PINB.0) 
        { 
        glcd_outtextxyf (2,5,"SEL CH1");
        
           while(PINB.0);   
        } 
       }
    بازهم از محبت شما سپاسگذارم که بمن پاسخ میدهید.
    ویرایش توسط roberty : 13-05-2012 در ساعت 14:25

  19. #11
    ناظم انجمن Ma3ood آواتار ها
    تاریخ عضویت
    Aug 2011
    نام
    مسعود
    نوشته ها
    2,248
    تشکر
    1,912
    تشکر شده 3,087 بار در 1,509 پست

    پیش فرض

    دوست عزیز باید بگم که شماتیک شما اشتباه رسم شده الان کلید های شما نه پول اپ هستش و نه پول دون
    اینو هم بگم اگه این دو مورد نباشه در عمل مشکل پیش میاد و برنامه خطا خواهد داشت پس شما به صورت تصویری که در زیر میگذارم انجام بده(توضیح اینکه الان در شکل ورودی به صورت پول اپ خارجی استفاده شده و همیشه 1 به ورودی میرسه به جز زمانهایی که کلید رو فشار میدهید)
    در مورد برنامه نویسی هم که کار نداره یه شرط بگذار به این صورت
    کد:
    ِِDDRB=0x00;
    
    if(PINB.0==0)
    
        { 
        glcd_outtextxyf (2,5,"SEL CH1");
        
           while(!PINB.0);   
        } 
       }
    موفق باشید
    تصاوير کوچک فايل پيوست تصاوير کوچک فايل پيوست برای دیدن سایز بزرگ روی عکس کلیک کنید

نام: qq.JPG
مشاهده: 35
حجم: 31.0 کیلو بایت  
    ویرایش توسط Ma3ood : 13-05-2012 در ساعت 21:27

  20. #12
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    ای داد بیداد...!!

    یعنی دوباره باید برم 100 تومن بدم و چهار روز صبر کنم تا با PCB جدید کار کنم..؟

    آخه کلید ها رو روی این PCB فعلی اینجوری بسته بودم... یعنی همون روش اشتباه..!!

    PCB رو هم راه انداختم...



    هیچ راهی نداره که بشه با این کلید ها در حالتی که گفته شده کار کرد...؟

  21. #13
    ناظم انجمن Ma3ood آواتار ها
    تاریخ عضویت
    Aug 2011
    نام
    مسعود
    نوشته ها
    2,248
    تشکر
    1,912
    تشکر شده 3,087 بار در 1,509 پست

    پیش فرض

    چرا راه نداره
    شما میتونید از پول اپ داخلی استفاده کنید و اون طرفشو بدی به زمین
    دقت کنی میشه با یه نمه سیم بندی راحت این کار رو کرد.

  22. #14
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    نقل قول نوشته اصلی توسط masoud70 نمایش پست ها
    چرا راه نداره
    شما میتونید از پول اپ داخلی استفاده کنید و اون طرفشو بدی به زمین
    دقت کنی میشه با یه نمه سیم بندی راحت این کار رو کرد.
    ممنون...

    آخه مشکل اینجاست که تو PCB اون طرف کلید ها رو دادم به VCC

    یعنی اینجوری شده...:


  23. #15
    ناظم انجمن Ma3ood آواتار ها
    تاریخ عضویت
    Aug 2011
    نام
    مسعود
    نوشته ها
    2,248
    تشکر
    1,912
    تشکر شده 3,087 بار در 1,509 پست

    پیش فرض

    مشکلی نداره من خودم کلی از این کارا کردم
    اون طرف کلید ها رامقاومتش رو حذف کن و سه تا شو بهم وصل کن با یه سیمی به نزدیک ترین زمین از زیر وصل کن
    به همین راحتی

  24. #16
    کاربر علاقه مند
    تاریخ عضویت
    Aug 2011
    نوشته ها
    77
    تشکر
    46
    تشکر شده 29 بار در 26 پست

    پیش فرض

    بازهم سلام...

    نظربه اینکه برد pcb علاوه بر مشکل کلید مشکلات دیگری (( مثل smd بودن محل پتانسیومتر و ....)) داشت تصمیم به طراحی برد جدید گرفتم اما....

    چیزی که اصلا نمیفهمم اینه... تو پروتئوس شماتیک رو بصورت درست درآوردم ولی کلید ها بازهم فرمان نمیگیرند.... برنامه رو ببینید:

    کد:
    #include <delay.h> 
    #include <mega32.h>
    // Graphic LCD functions
    #include <glcd.h>
    // Font used for displaying text
    // on the graphic LCD
    #include <font5x7.h>
       GLCDINIT_t glcd_init_data;
      int i,j,p,a2d;
      int k=0;
    int data[128];
    // ADC interrupt service routine
    interrupt [ADC_INT] void adc_isr(void)
    {
    if (k<128)
        {
          k++;
         data[k]=ADCW;
          glcd_setpixel (k,data[k]); 
         ADCSRA|=1<<ADSC;
         }
    }
    void selectch(void);
    void main(void)
    {
    PORTB=0x00;
    DDRB=0x00;
    // Graphic LCD initialization
    // The KS0108 connections are specified in the
    // Project|Configure|C Compiler|Libraries|Graphic LCD menu:
    // DB0 - PORTC Bit 0
    // DB1 - PORTC Bit 1
    // DB2 - PORTC Bit 2
    // DB3 - PORTC Bit 3
    // DB4 - PORTC Bit 4
    // DB5 - PORTC Bit 5
    // DB6 - PORTC Bit 6
    // DB7 - PORTC Bit 7
    // E - PORTD Bit 0
    // RD /WR - PORTB Bit 1
    // RS - PORTB Bit 2
    // /RST - PORTB Bit 3
    // CS1 - PORTD Bit 4
    // CS2 - PORTD Bit 5
    // Specify the current font for displaying text
    glcd_init_data.font=font5x7;
    // No function is used for reading
    // image data from external memory
    glcd_init_data.readxmem=NULL;
    // No function is used for writing
    // image data to external memory
    glcd_init_data.writexmem=NULL;
    
    glcd_init(&glcd_init_data);
    
    
    
    while (1)
          {  
    glcd_outtextxyf(0,0,"DIGITAL OSILLOSCOPE");
    glcd_outtextxyf (0,22,"BY AVR MICOCTRL");
    glcd_outtextxyf (0,45,"HAMID REZA RABET" ); 
    delay_ms(80);
            glcd_clear();
          for (i=0;i<128;i+=2){
          glcd_setpixel (64,i);
          }
          for (j=0;j<128;j+=2){
          glcd_setpixel (j,32);
          } 
          glcd_putcharxy( 1, 56, 'v'); 
          glcd_putcharxy( 66, 56, 't');
          glcd_putcharxy( 6, 56, '='); 
          glcd_putcharxy( 71, 56, '=');
          selectch();
          ADCSRA = 0b11100111;
          ADMUX = 0b01100000;
          SFIOR = 0x00;
          a2d = ADCW; 
          p =  (1024 - (a2d))/16;
          for( i=0;i<1024;i++){
          for(j=0;j<=a2d ; j++)
          glcd_setpixel (p,i);
          }
    /////////////////// namayesh noghat bedast amadeh az tabdil bar roye 128 pixel ofoghi.
    for (i=0;i<127;i++){
    do{
    i=0;
    glcd_setpixel(i,p);
    delay_us(100);
    i++;
    if(i==128)
    i=0;
    }
    while(1);
    }
    }
    }
    ///////////// defination of selechch.
    void selectch (void)
    {
    //// first key for first channel
    if(!PINB.0) 
       {
       delay_ms(20);   
        if(!PINB.0) 
        {  
        glcd_outtextxyf (2,5,"SEL CH1");
        ADMUX = 0b01100000; 
        delay_ms(300); 
        while(!PINB.0);
        } 
       }   
    }
    مشکل من با این تابع هست و بقیه برنامه هیچ مشکلی نداره:
    کد:
    void selectch (void)
    {
    //// first key for first channel
    if(!PINB.0) 
       {
       delay_ms(20);   
        if(!PINB.0) 
        {  
        glcd_outtextxyf (2,5,"SEL CH1");
        ADMUX = 0b01100000; 
        delay_ms(300); 
        while(!PINB.0);
        } 
       }   
    }
    کلیدی که قراره در تابع selectch خونده بشه با فشرده شدن در محیط پروتئوس هیچ چیزی رو glcd نمایش نمیده... در حالیکه قرار بود عبارت SEL CH1 رو نمایش بده....




    نکته اینجاست که وقتی بجای دستور PINB! از دستور PINB استفاده میکنم اصلا نیازی به زدن کلید نیست و عبارت گفته شده بلافاصله رو glcd نمایش داده میشه ولی وقتی مینویسم PINB! هزار بار هم که پوش باتن رو میزنم چیزی نمایش داده نمیشه...

    فایل برنامه به همراه پروتئوس اون را آپلود کردم... حجمش 350 کیلو هست:

    Download osciloscope_program.rar

    شما رو به جان هرکسی دوست دارید جواب بدید....
    ویرایش توسط roberty : 16-05-2012 در ساعت 15:02

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •