اطلاعیه

Collapse
No announcement yet.

مشکلی جدید با USART

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

    مشکلی جدید با USART

    با سلام خدمت دوستان

    به یه مشکل برخوردم نمیدونم چطور برطرفش کنم

    من یه برنامه برای ارتباط دو میکرو با RS422 نوشتم و در پروتئوس از SN75179 استفاده کردم و سیموله کردم. RS422 جواب داد و مشکلی نبود

    اما در این ارتباط سریال، Master برای Slave کدش رو ارسال میکنه و اگه Slave با چنین کدی وجود داشت پیام تصدیق رو ارسال میکنه

    اما سناریو:

    - Slave باید در وقفه دریافت Usart به Master پاسخ بده. چون قراره در حالت عادی به کارهای دیگه ای بپردازه و فقط زمانی که Master چیزی ارسال کرد بره سراغ وقفه و کارای دیگه رو متوقف کنه

    - پروتکل رو طوری تعریف کردم که پس از آنکه وقفه Usart فعال شد و رفت به روتین وقفه، حالا وقفه دریافت رو موقتا غیر فعال کنه و به Master جواب بده و آنگاه منتظر دریافت کد دستور باشه و ببینه که مستر چه چیزی میفرسته و بره دستورات رو انجام بده و وقتی Master بایتی با نام Stop_Byte رو که براشون تعریف کردم دریافت کرد ارتباط را تمام کنه و وقفه دریافت Usart رو فعال کنه

    - اما مشکل اینجاست که وقتی وقفه فعال شد و کد رو خواندم و وقفه دریافت رو موقتا غیر فعال کردم
    ابتدا هر چی که Master میفرسته رو Slave به خوبی دریافت میکنه و میتونم به زیر برنامه ها برم
    سپس اگه Slave هم چیزی بفرسته Master دریافت میکنه
    اما از این پس هرچه Master برای Slave میفرسته دریافت نمیشه

    برنامه ساده ای از این مشکل رو ببینید:

    Master :


    b = 2;
    putchar(b);
    b = 3;
    putchar(b);
    b = 4;
    putchar(b);
    b = 5;
    putchar(b);
    lcd_putsf("OK1"
    b = getchar();
    if (b == Acknowledge)
    {
    b = getchar();
    if (b == 0b00000010)
    {
    lcd_gotoxy(0,0);
    lcd_putsf("OK2"
    }
    }
    b = 6;
    putchar(b);
    lcd_putsf("OK3"

    }
    Master هر آنچه که ابتدای ارتباط Usart ارسال میکند Slave دریافت میکند
    تا آنجا که Slave جواب تصدیق میدهد و پس از آن هم هر آنچه Slave بفرستد Master دریافت میکند
    اما زمانی که Master مجددا چیزی ارسال میکند دیگر دریافت نمیشود(خطوط قرمز رنگ)

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

    در روتین وقفه دریافت Usart تابع test فراخوانده میشود

    void test(void)
    {
    #asm("sei&quot
    lcd_init(20);
    a = getchar(); // Reading a Byte from Bufer of Reciving USART
    code = PINA; // 5 bits in LSB of this Port is the code of Slave
    code &= 0b00011111;
    if (a == code)
    {
    lcd_putsf("OK1"
    delay_ms(100);
    }

    UCSRB=0x18;
    a = getchar();
    if (a == 3)
    {
    lcd_putsf("OK3"
    delay_ms(100);
    }
    a = getchar();
    if (a == 4)
    {
    lcd_putsf("OK4"
    delay_ms(100);
    }
    a = getchar();
    if (a == 5)
    {
    lcd_putsf("OK5"
    delay_ms(100);
    }

    putchar(Acknowledge);
    putchar(code);


    a = getchar();
    if (a == 6)
    {
    lcd_putsf("OK6"
    delay_ms(100);
    }

    }

    ابتدا بایتی از Master خوانده میشود و درصورتی که با کد قرار گرفته بر روی پورتی ار میکرو برابر بود پیامی رو LCD مینویسد

    حال وقفه دریافت Usart غیر فعال میشود

    چندین کد دیگر هم که برای امتحان عملکرد برنامه قرار دادم را دریافت میکند (3و4و5)

    برای Master پیام تصدیق و کد را ارسال میکند

    حال که Master پیام دیگری را ارسال میکند دیگر کدی دریافت نمیشود(6)

    یعنی در این شرایط فقط یکبار Slave از Master دریافت اطلاعات میکند و پس از ارسال به Master دیگر چیزی دریافت نمیکند.
    ایراد کار در Slave و فقط در بخش دریافت از Usart است

    به نظر شما کجا اشتباه کردم؟؟؟

    #2
    پاسخ : مشکلی جدید با USART

    این هم لینک فایل پروتئوس و Master و Slave در کدویژن

    http://rapidshare.com/files/276677527/Test_Usart.rar.html

    به نظر شما مشکل از کجاست؟؟؟

    قاعدتا نباید این مشکل باشه

    وقتی به صورت عادی و بدون وقفه دریافت Usart میکروها رو فعال میکنم درست جواب میده اما با وقفه دریافت پس از یک سری دریافت و یک سری ارسال دیگه Slave چیزی دریافت نمیکنه

    اما من نمیتونم وقفه دریافت Usart رو استفاده نکنم
    چون ار اصلی Slave چیز دیگه ای هست و باید به اون مشغول باشه

    دیدگاه


      #3
      پاسخ : مشکلی جدید با USART

      اگه وقفه دریافت Usart رو هم فعال نگه دارم دائما با ارسال اطلاعات از Master ، دائما Slave از روتین وقفه سراغ تابع test میره و مجددا میخواد Code خودش رو دریافت کنه
      اونوقت دیگه سراغ ادامه نمیره و اطلاعاتی که Master ارسال میکنه همه از دست میرن

      نمیدونم چرا با خاموش کردن وقفه دریافت یوزارت ، دریافت Usart کلا قطع میشه

      تمام بیت های UCSR رو هم دستی مجدد تنظیم دلخواهم رو روشون امجام دادم
      بازم مشکل حل نشد

      کسی راه حلی نداره؟؟؟

      دیدگاه


        #4
        پاسخ : مشکلی جدید با USART

        یعنی واقعا کسی راه حلی به نظرش نمیرسه؟؟؟

        یکی از دوستان برنامه ها و پروتئوسی که گذاشتم رو دانلود کنه ببینه جایی اشتباهی کردم یا نه؟؟؟

        اخه همه مواردی رو که به ذهنم میرسید رو امتحان کردم و خیلی دستکاریش کردم اما جواب نداد

        نمیدونم چرا دریافت USART قطع میشه

        دیدگاه


          #5
          پاسخ : مشکلی جدید با USART

          با تشکر از این همه جواب
          واقعا شرمندم کردین

          حالا لااقل برنامه پایین رو دانلود کنید و مشکل پایین رو چک کنید

          http://rapidshare.com/files/277297651/Only_Start_Byte.rar.html

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

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

          این برنامه تغییر کرده برنامه اوله که حدودا جواب داده اما نمیخوام LCD داشته باشه

          دیدگاه


            #6
            پاسخ : مشکلی جدید با USART

            با سلام مجدد

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

            بگذریم شاید قسمت نبود

            اما حالا دنبال یه ایده هستم

            بزارید یه سناریو از اون چیزی که میخوام بگم

            ما یه Master داریم و چند تا Slave
            Master ابتدا آدرس Slave ها رو صدا میزنه و بعد از این که جواب دادن اطلاعات رو براشون میفرسته

            حالا مشکل کجاست
            پیشفرض اینه که ما تعداد Slave ها رو نمیدونیم ولی میدونیم که شماره هاشون از یک شروع میشه و پشت سر همه
            یعنی اگه قراره 20 تا ی=باشن از یک تا بیست

            من از دستورات getchar و putchar در کدویژن استفاده میکنم
            ابتدا کد Slave رو ارسال میکنم و منتظر جوابش میشم اگه پیام تصدیقش(Acknowledge) اومد (a = getchar(); - if(a == Aknowledge) send_data)
            اطلاعات رو براش میفرستم

            به این روش میفهمم که چند تا Slave به Master اتصال دارن

            اما مشکل اینجاست که دستوراتی مثل getchar اونقدر منتظر میمونن تا یه بایت از usart بگیرن و اگه نگیرن برنامه به خط بعدی نمیره

            خوب حالا اگه مثلا 20 تا slave داشته باشیم و ما برای گاهی از 21 امی کدش را ارسال کنیم، چون وجود ندارد چیزی ارسال نمیشود و تابع getchar چون بایتی دریافت نکرده برنامه در آن خط متوقف میشود و ادامه نمی یابد

            برای حل این روش راه حلی ندارید؟؟؟

            دیدگاه


              #7
              پاسخ : مشکلی جدید با USART

              اگه بشه به روشی کاری کرد که اگه دستور getchar بایتی رو دریافت نکرد پس از مدتی مثلا یک ثانیه از این دستور رد بشه و برنامه رو ادامه بده خیلی خوب میشه

              با وقفه تایمر ها کار کردم اما دستورات پرشی فقط در یک تابع کار میکنه و در تابع دیگه نمیشه فراخوانی بشن بنابراین جواب نداد

              - به روشی نمیشه نحوه تعریف این دستورات رو در کتابخانه stdio.h تغییر داد یا تابع جدید تعریف کرد که پس از یک delay مشخص اگر چیزی دریافت نکرد ازش عبور کنه و یک بایت متفاوت ارسال کنه؟؟؟

              - با دستورات اسمبلی چه؟؟؟

              دیدگاه


                #8
                پاسخ : مشکلی جدید با USART


                من یه مشکلی داشتم اگه لطف کند کمکم کنید ممنون میشم ..
                من یه پروژه با bascom دارم درست میکننم(فرکانس متر )البته می خوام برای سنجش دور موتور dc در یک ثانیه استفاده کنه و مقدارش رو با یک فرستنده به گیرنده بفرسته تا روی lcd نمایش بده

                حالا من هر کار میکنم با usart جواب نمیگیرم فرستنده وگیرنده من hm-t ,hm-r 433 hz هستش .من حتی این دو ماژول رو کنار گذاشتم و با سیم هم دو میکرو رو وصل کردم جواب نگرفتم.یعنی یا lcd روشن نمیشه یا جواب درست نمیده..و حالا اگه با بسکام آشنایید میخواستم برنامه درست ارسال و دریافت رو بهم بگین.در ظمن میخواستم بدونم در usart چه طور میشه تعداد pack های ارسالی رو تنظیم کرد مثلا 8 بیت داده یک بیت خطا ...
                یه سوال دیگه میخواستم بدونم در codevision چه طور میشه تعداد پالس هی ورودی در یک ثانیه رو حساب کرد...
                با کمال تشکر حیدر فارابی

                دیدگاه

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