NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3884 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
صفحه 1 از 2 12 آخرینآخرین
نمایش نتایج: از 1 به 20 از 22

موضوع: مشکل در استفاده از مد ورودی

  1. #1
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    Icon16 مشکل در استفاده از مد ورودی

    با سلام
    در صفحه 35 مجله شماره 9 درگاه های ورودی خروجی مدل فیلیپس شرح داده شده است. همین طور توضیحات و مثالی از آقای تروشه در دسترس است:
    http://etcelec.persiangig.com/ARM%20...%20routine.rar
    اینها شده موضوع را تبیین کرده ولی یک موردی وجود دارد و آن این است که مثالی نزده که از حالت ورودی استفاده کرده باشد. مثالهای مذکور همه حالت خروجی است.
    من می خواهم از مد ورودی استفاده کنم. ولی نمی دادم با یک شدن پایه ورودی مورد نظر، چه رجیستری یک شده و در برنامه از چه رجیستری برای اطلاع از یک شدن پایه استفاده کنیم؟
    طبق مطالب آموزشی گفته شده اگر بخواهیم پورت صفر ورودی باشد :
    SCS=SCS | 1; //for enabling Fast GPIO
    FIO0MASK = 0x00000000;
    FIO0DIR = 0x00000000; //set the direction of PORT1 as input
    فرضا می خواهیم چند تا از پایه ها را استفاده کنیم(مثلا P0.0 و P0.1) . و فرضا برنامه این است که اگر پایه P0.0 یک بود فلان کار را انجام بده و اگر پایه P0.1 یک شد فلان کار را. می خواستم ببینم این کار چگونه انجام می شود؟
    در آموزش های مذکور هم گفته شده FIO0PIN برای خواندن داده از روی پورت می باشد. ولی نحوه استفاده را نمی دانم!
    کسی می تونه سوال من را جواب بده که به این هدفم برسم؟
    البته در سایت ECA مطلبی تحت عنوان : مجموعه آموزش های میکروکنترولرهای ARM در فایل GPIO.rar به آدرس:
    ������ ����� ��ی �ی�����������ی ARM

    آورده است که ورودی خروجی ها را خیلی کامل توضیح داده و در انتها مثال هم زده است. در مثال گفته ورودی را بخوان:

    temp=FIO1PIN; //read PORT1

    ولی این قسمتش را نفهمیدم چیکار کرده:

    temp&=0x00000003; //????????!!!!!

    در ادامه هم گفته اگه temp یکی از این موارد بود روی آن سوییچ کن:
    switch(temp)
    من این برنامه را (که البته یه غلط کوچک هم داشت) ضمیمه کردم.
    با تشکر
    فايل هاي پيوست شده فايل هاي پيوست شده

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نام
    Advertising world
    نوشته ها
    Many
     

  3. #2
    مدیرکل سایت kavir آواتار ها
    تاریخ عضویت
    Jun 2007
    نام
    زارعی
    نوشته ها
    3,547
    تشکر
    1,218
    تشکر شده 5,684 بار در 1,801 پست

    پیش فرض

    سلام
    چون وقت نیست توضیح بدم خودتون این ÷ی دی اف بخونید
    فايل هاي پيوست شده فايل هاي پيوست شده
    کویر ویدئو راه اندازی شد

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

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


  5. #3
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    پیش فرض

    با سلام
    این فایل آقای تروشه است که من هم گفته ام مطالعه کرده ام! مثال گفته شده در حالت خروجی است نه ورودی. تنها مثالی که دیدم لینک داده ام و ضمیمه کرده ام که البته متوجه نشدم درست چیکار کرده. برای همین سوال مطرح کردم.
    اگه میشه یه مثال واضح بزنید که داده را از یک پورت ورودی (مثلا p0.0 ..)بخواند و اگر این پورت p0.0 یک شده بود فلان کار را انجام دهد. همین
    با تشکر

  6. #4
    مدیرکل سایت kavir آواتار ها
    تاریخ عضویت
    Jun 2007
    نام
    زارعی
    نوشته ها
    3,547
    تشکر
    1,218
    تشکر شده 5,684 بار در 1,801 پست

    پیش فرض

    سلام
    برای ورودی هم توضیحاتش هست و کاری نداره توی همون بخش مثال بوت لودر دانلود کنید یکی مثال برای ورودی گذاشتم
    نکته ای که داره چون مثال برای بوت لودر بوده یکی دیگه پروژه جدید ایجاد کنید و کد رو توش کپی کنید
    از اینجا دانلود کنید
    http://www.iranmicro.ir/forum/showthread.php?t=4766
    کویر ویدئو راه اندازی شد

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

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


  8. #5
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    پیش فرض

    با سلام و تشکر از راهنماییتان آقای زارعی
    با دقت در مثالی که لینک دادید(کلیه آموزش ها و نکات مهم برد eke2lpc v1.0 کویرالکترونیک : GPIO.zip) ظاهرا مشکل حل شد. حالا من این مثال ساده را که گفتم میارم برای دوستان دیگه اگه با این مورد مواجه شدند:
    برنامه ای که اگر پایه P2.0 یک شد در خروجی P1.21 پالس دهد و اگر این پایه صفر شد پاس قطع شود:
    #include "LPC23xx.h"
    #define pulse1 0x200000 //p1.21
    #define set_pulse1 (FIO1SET=pulse1)
    #define clr_pulse1 (FIO1CLR=pulse1)
    void delay(unsigned long i);
    int main(){
    SCS |=0x00000001;
    FIO1MASK=0x00000000;
    FIO1DIR=0xFFFFFFFF;
    FIO1CLR=0x00000000;
    FIO1DIR=0x00000000;
    while(1){
    while( (FIO2PIN & 0x00000001)==1 ){
    set_pulse1;
    delay(1000);
    clr_pulse1;
    delay(1000);
    }
    while( (FIO0PIN & 1) == 0 )
    clr_pulse1;
    }
    }
    void delay(unsigned long i){
    unsigned long j;
    for (j=0;j<i;j++);
    }
    وقتی داریم debug می کنیم از گزینه Peripherals قسمت GPIO Fast Interface گزینه Port2 را که انتخاب کنیم در حین اجرای برنامه با برداشتن تیک پایه صفر در Pins دیگر در خروجی پالس نداریم و با گذاشتن مجدد تیک پاس شروع می شود.
    ان شاءالله که درسته! نبود بگید.

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


  10. #6
    کاربر فعال
    تاریخ عضویت
    May 2011
    نام
    امین
    نوشته ها
    253
    تشکر
    91
    تشکر شده 123 بار در 101 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mzarkoob نمایش پست ها
    با سلام و تشکر از راهنماییتان آقای زارعی
    با دقت در مثالی که لینک دادید(کلیه آموزش ها و نکات مهم برد eke2lpc v1.0 کویرالکترونیک : GPIO.zip) ظاهرا مشکل حل شد. حالا من این مثال ساده را که گفتم میارم برای دوستان دیگه اگه با این مورد مواجه شدند:
    برنامه ای که اگر پایه P2.0 یک شد در خروجی P1.21 پالس دهد و اگر این پایه صفر شد پاس قطع شود:


    کد:
    
    
    کد:
      #include "LPC23xx.h"
      #define pulse1 0x200000        //p1.21
      #define set_pulse1 (FIO1SET=pulse1)
      #define clr_pulse1 (FIO1CLR=pulse1)
      void delay(unsigned long i);
      int main(){
      SCS |=0x00000001;
      FIO1MASK=0x00000000;  
      FIO1DIR=0xFFFFFFFF;  
      FIO1CLR=0x00000000;
      FIO1DIR=0x00000000;  
      while(1){
                      while( (FIO2PIN & 0x00000001)==1 ){
                                      set_pulse1;
                                        delay(1000);
                                      clr_pulse1;
                                      delay(1000);
                      }
         while( (FIO0PIN & 1) == 0 )
           clr_pulse1;
       }
      }
      void delay(unsigned long i){
      unsigned long j;
      for (j=0;j<i;j++);
      }
    اینطوری بزاری برنامتو بهتر نیست؟

  11. #7
    مدیر انجمن mzarkoob آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    مهدی زرکوب
    نوشته ها
    2,902
    تشکر
    1,202
    تشکر شده 2,317 بار در 1,273 پست

    پیش فرض

    نقل قول نوشته اصلی توسط amin1139 نمایش پست ها
    اینطوری بزاری برنامتو بهتر نیست؟
    اووه .. تاریخ این پست دیدید!!؟
    ۱۳-۰۴-۱۳۹۰

  12. #8
    کاربر فعال
    تاریخ عضویت
    May 2011
    نام
    امین
    نوشته ها
    253
    تشکر
    91
    تشکر شده 123 بار در 101 پست

    پیش فرض

    نه الان نگاه کردم راست میگی هاااااااااااااااااااااااا اااا

  13. #9
    عضو جدید
    تاریخ عضویت
    Aug 2013
    نوشته ها
    13
    تشکر
    5
    تشکر شده 0 بار در 0 پست

    پیش فرض سوال ؟؟؟؟؟؟؟؟؟؟؟

    سلام
    من یک کاربر صفر کیلومترم
    تازه با LPC1768 کارم رو شروع کرده
    مشکلم با کنترل ورودی
    می خواستم با یک کلید یک ال ای دی رو روشن کنم
    برنامه هایی که تست کردم شبیه برنامه شما بود
    می خواستم بدونم شما با این برنامه روی میکرو هم جواب گرفتید؟
    روی میکرو تنظیم خاصی باید انجام بدم تا جواب بگیرم؟
    برنامه ام اینه:
    LPC_GPIO0->FIODIR=0x00000001;
    while(1)
    {
    while((LPC_GPIO0->FIOPIN & 0x00000002)==1)
    {
    LPC_GPIO0->FIOSET=1;
    delay(1000);
    LPC_GPIO0->FIOSET=0;
    delay(1000);
    }
    while((LPC_GPIO0->FIOPIN & 0x00000002)==0) LPC_GPIO0->FIOSET=0;
    }
    شرمنده نمیدونم چطوری باید کد رو وارد کنم که درست نشون بده

  14. #10
    کاربر دائمی
    تاریخ عضویت
    Jun 2009
    نام
    روح الله خرم بخت
    نوشته ها
    403
    تشکر
    456
    تشکر شده 591 بار در 214 پست

    پیش فرض

    با پاک کردن fioset پین صفر نمیشه . شما باید بیت متناظر با پینی رو که میخواید صفر کنید از رجیستر fioclr یک کنید .

  15. کاربران : 2 تشکر کرده اند از شما roohlla برای ارسال این پست سودمند:


  16. #11
    عضو جدید
    تاریخ عضویت
    Aug 2013
    نوشته ها
    13
    تشکر
    5
    تشکر شده 0 بار در 0 پست

    پیش فرض

    خیلی ممنون
    البته تو تایپ برنامه اشتباه کردم
    من این برنامه رو بارها و با چند روش نوشتم ولی جواب نداده
    حتی مثال های کتاب رو که وارد میکنم جواب نمیده
    الان برنامه اینه:
    LPC_GPIO0->FIODIR=0x00000001;
    while(1)
    {
    while((LPC_GPIO0->FIOPIN & 0x00000002)==1)
    {
    LPC_GPIO0->FIOSET=1;
    delay(1000);
    LPC_GPIO0->FIOCLR=1;
    delay(1000);
    }
    while((LPC_GPIO0->FIOPIN & 0x00000002)==0) LPC_GPIO0->FIOCLR=0;
    }

  17. #12
    کاربر علاقه مند adibsp آواتار ها
    تاریخ عضویت
    Jul 2012
    نام
    ادیب صدری
    نوشته ها
    50
    تشکر
    50
    تشکر شده 39 بار در 25 پست

    پیش فرض

    سلام. این برنامه رو مهندس زرکوب برای تست led روی برد نوشتن. تست کنید و با برنامه خودتون مقایسه کنید.انشاءا... جواب سوالتون پیدا میشه توسط خودتون...، در ضمن برای کد نویسی در محیط پیام نویسی، از گزینه ای با آیکون # میتونید استفاده کنید(wrap code).مثل این:
    کد:
    delay(1000);
    LPC_GPIO0->FIOCLR=1;
    delay(1000);

  18. #13
    عضو جدید
    تاریخ عضویت
    Aug 2013
    نوشته ها
    13
    تشکر
    5
    تشکر شده 0 بار در 0 پست

    پیش فرض

    ممنون آقا ادیب
    البته منظور از کدی که نوشته بودید رو نفهمیدم
    یعنی باید تست کنم خروجی درست ارسال میشه یا LED درسته؟
    چنین برنامه ای نوشتم (FlipFlop) و درست هم کار کرده
    ظاهرا تشخیص ورودی درست عمل نمیکنه
    برنامه رو برعکس کردم ، اینجوری:
    کد:
        LPC_GPIO0->FIODIR=0x00000001;
        while(1)
        {
            while((LPC_GPIO0->FIOPIN & 0x00000002)==1) LPC_GPIO0->FIOCLR=1;
            while((LPC_GPIO0->FIOPIN & 0x00000002)==0) 
            {
                LPC_GPIO0->FIOSET=1;
                delay(1000);
                LPC_GPIO0->FIOCLR=1;
                delay(1000);
            }
        }
    یعنی در حالت عادی خروجی فعال باشه و با زدن کلید غیر فعال بشه
    ولی باز هم خبری نبود
    معلوم میشه مقدار LPC_GPIO0->FIOPIN برعکس چیزی که من فکر میکنم نه یکه نه صفر
    تو نرم افزار Keil هم نتونستم تست بگیرم، فکر کنم چون قفل شکسته است
    باز هم ممنون که وقت گذاشتید

  19. #14
    کاربر علاقه مند adibsp آواتار ها
    تاریخ عضویت
    Jul 2012
    نام
    ادیب صدری
    نوشته ها
    50
    تشکر
    50
    تشکر شده 39 بار در 25 پست

    پیش فرض

    نقل قول نوشته اصلی توسط arasbaran نمایش پست ها
    البته منظور از کدی که نوشته بودید رو نفهمیدم
    خواهش می کنم.کدی که نوشتم قسمتی از کد خودتون بود که کپی کردم و منظورم از برنامه، فایل ضمیمه بود که الان متوجه شدم ضمیمه نشده.مجددا ضمیمه میکنم

    از پین مربوط به کلید مطمئن بشین.هم چنین اگر از پروگرمر سریال استفاده می کنید از p0.0 نمیتونید gpio بگیرین
    فايل هاي پيوست شده فايل هاي پيوست شده

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


  21. #15
    عضو جدید
    تاریخ عضویت
    Aug 2013
    نوشته ها
    13
    تشکر
    5
    تشکر شده 0 بار در 0 پست

    پیش فرض

    سلام
    ممنون ار فایل ضمیمه
    کد شما اجرا شد و از پین 26 پورت 3 خروجی چشمک زن گرفتم
    البته عرض کرده بودم در گرفتن خروجی مشکلی نبود و چنین برنامه هایی رو چند بار تست کرده بودم، آخریش این بود:
    کد:
    int i;
        LPC_GPIO0->FIODIR=0x00000003;
        while(1)
        {
            for(i=1;i<3;i++){
            LPC_GPIO0->FIOSET=1;
            delay(2000000);
            LPC_GPIO0->FIOCLR=1;
            delay(2000000);
            }
            for(i=1;i<3;i++){
            LPC_GPIO0->FIOSET=2;
            delay(2000000);
            LPC_GPIO0->FIOCLR=2;
            delay(2000000);
            }
    اینجوری هر دو پین 0 و 1 از پورت صفر هر تست می شدند
    ولی در زمان گرفتن ورودی درست عمل نمیکنه
    یعنی مقدار LPC_GPIO0->FIOPIN بر خلاص تصور صفر یا یک نیست
    باید راهی پیدا بشه که بتونم بفهمم مقدار داخل LPC_GPIO0->FIOPIN چنده
    این تنها راهیه که به نظر خودم میرسه
    باز هم ممنون

  22. #16
    کاربر علاقه مند adibsp آواتار ها
    تاریخ عضویت
    Jul 2012
    نام
    ادیب صدری
    نوشته ها
    50
    تشکر
    50
    تشکر شده 39 بار در 25 پست

    پیش فرض

    سلام.
    خب این مسئله سخت نیست.یه مثال ساده می نویسم.متناسب با بردت تغییرش بده.
    کد:
    knum = LPC_GPIO0->FIOPIN;
    if ((knum & 1<<16)==0){
    LPC_GPIO0->FIOSET = 1<<10;
    LPC_GPIO0->FIOCLR = 1<<10;
    }

  23. #17
    عضو جدید
    تاریخ عضویت
    Aug 2013
    نوشته ها
    13
    تشکر
    5
    تشکر شده 0 بار در 0 پست

    پیش فرض

    سلام
    ممنون
    از این مثالها زیاد نوشتم، با if , while , switch و .... ولی خبری از خروجی نیست
    نمیدوم شک داشتم شاید نیاز به ست کردن چیزی غیر از FIODIR , FIOSET , FIOCLR و ... باشه
    واقعا دیگه نمیدونم چکار کنم!
    میشه بردی که گرفتم مشکل سخت افزاری داشته باشه؟ یعنی پینی که خروجی درست میده نتونه ورودی رو اجرا کنه؟

  24. #18
    کاربر علاقه مند adibsp آواتار ها
    تاریخ عضویت
    Jul 2012
    نام
    ادیب صدری
    نوشته ها
    50
    تشکر
    50
    تشکر شده 39 بار در 25 پست

    پیش فرض

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

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


  26. #19
    کاربر فعال processor آواتار ها
    تاریخ عضویت
    May 2010
    نام
    محمد صداقتی
    نوشته ها
    171
    تشکر
    124
    تشکر شده 262 بار در 120 پست

    پیش فرض

    سلام این برنامه رو تست کن
    خودم اون موقع جواب گرفتم
    کد:
    // sw test program
    
    #include "lpc17xx.h"
    
    void delay (uint32_t Time)
    {
        uint32_t i;
         i=0;
          while(Time--)
            {
                for (i=0;i<5000;i++);
                }
    }
     
    int main (void)
    {
        LPC_GPIO0->FIODIR0=0xff; 
        LPC_GPIO1->FIODIR-0x00;
        LPC_GPIO0->FIOCLR0=0xff; // turn off port2    
        while(1)
        {
         if((LPC_GPIO1->FIOPIN & (1<<1))==0)
                 LPC_GPIO0->FIOSET=0x01;
             else
                 LPC_GPIO0->FIOCLR=0x01;
             delay(50);
        }    
    }

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


  28. #20
    عضو جدید
    تاریخ عضویت
    Aug 2013
    نوشته ها
    13
    تشکر
    5
    تشکر شده 0 بار در 0 پست

    پیش فرض

    سلام به همه

    مثلا این برنامه
    کد:
    #include <lpc17xx.h>
    #define  dl2 delay(2000000)
    
    void delay(unsigned int i)
    { while(i--); }
    
    void a(void)
    {
        LPC_GPIO0->FIODIR=0x00000007;
        LPC_GPIO0->FIOCLR=7;
        while(1)
        {
            if((LPC_GPIO1->FIOPIN & 0x00000001)==1)
            {
                LPC_GPIO0->FIOSET=2; dl2;
                LPC_GPIO0->FIOCLR=2; dl2;
            }
            if((LPC_GPIO1->FIOPIN & 0x00000001)==0) 
            {
                LPC_GPIO0->FIOSET=1; dl2;
                LPC_GPIO0->FIOCLR=1; dl2;
            }
            LPC_GPIO0->FIOSET=4; dl2;
            LPC_GPIO0->FIOCLR=4; dl2;
        }
    }
    توقع من اینه که پین 2 دائم چشمک بزنه
    پین 1 در زمان فشار کلید و پین صفر در زمان عدم فشار کلید چشمک زن باشه

    ولی روی برد پینهای 2 و 1 دائم چشمک میزنه و به کلید هم اصلا عکس العملی نشون نمیده!

    ممنون میشم شما تست کنی ببینی جواب میگیری یا نه

صفحه 1 از 2 12 آخرینآخرین

موضوعات مشابه

  1. پاسخ: 3
    آخرين نوشته: 24-03-2013, 18:38

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

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