اطلاعیه

Collapse
No announcement yet.

مشکل با UART

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

    مشکل با UART

    برای ارتباط سریال با یک برد دیگر از میکرو PIC استفاده کردم
    کریستال داخلی 32MHz بود ریت 9600
    از وقفه دریافت سریال برای دریافت 12 بایت پشت سر هم استفاده کردم. میکرو گاهی اوقات درست کار نمی کند. یعنی به جای دریافت 12 بایت 11 بایت دریافت می کند و یک بایت را دریافت نمی کند و بایت قبلی نیز یک مقدار دیگر نشان می دهد. البته ممکنه 20 دقیقه این اتفاق نیفته و میکرو درست کار کنه و گاهی هم پس از چند ثانیه این اتفاق می فته.
    از وقفه تایمر ها هم استفاده کردم.
    کسی می دونه مشکل چیه؟

    #2
    پاسخ : مشکل با UART

    بسم الله الرحمن الرحیم

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

    مشخص و مشهود و معلوم است که اشراف بسیار خوبی بر کار داشته اید.
    اما باید به طور خلاصه خدمت تان عرض کنم که این مشکل شما ، مشکل جدیدی نیست و یا اینکه شما فقط درگیر آن باشید. همه کسانی که از ارتباط سریال استفاده می کنند. به این مورد و مشابه آن برخورد می کنند. این چیزی نیست جز وجود نویز و حذف نویز تکنیک هایی دارد از جمله تکنیک های نرم افزاری و سخت افزاری. با توجه به نوع بیان شما حتما تکنیک های سخت افزاری را به کار برده اید.
    اما روش های نرم افزاری گوناگونی هست از جمله (مثلا یکی از روش ها ) استفاده از توابع چند جمله ای که اختصارا به آن cyclic redundancy check (CRC) می گویند.
    اگر که روش های تشخیصی و کنترل خطا را نیز به کار برده اید ، پس اما برای این سوال شما که پرسیده اید:
    نوشته اصلی توسط eca_user نمایش پست ها
    کسی می دونه مشکل چیه؟
    بدون نقشه و شماتیک و احیانا سورس کد خیلی سخت است که بدانیم چی به چی است .

    زیاده جسارت است.
    والسلام علي من اتبع الهدي .... و درود بر کساني که راه هدايت را دنبال مي کنند.

    هوشمندانه بپرسيد...

    دیدگاه


      #3
      پاسخ : مشکل با UART

      ممنون از پاسخگویی شما.
      مشکل هنوز پا برجاست من قبلا با AVR اینکار را کرده ام و مشکلی نبود و پرپزه انجام شد.
      اینجا تو PIC اما این مشکل را دارم از کامپایلر CCS استفاده کرد ه ام. وقتی وقفه تایمر 6 را غیر فعال می کنم ظاهرا مشکل حل میشه.
      گاهی وقتها بایت اشتباه می فرسته و گاهی وقتها بایت اشتباه دریافت می کنه.
      البته من برای ارتباط سریال از یک خط استفاده کرد ه ام.و بامقاومت پین دریافت و ارسال به هم وصل هستند

      دیدگاه


        #4
        پاسخ : مشکل با UART

        یک سوال
        وقتی ارسال با از طریق پین TXD تمام میشه پین یک هست.high
        من می خوام بعد از ارسال صفر یا float باشه باید چکار کنم؟

        دیدگاه


          #5
          پاسخ : مشکل با UART

          سلام
          تو ccs چطور با وقفه سریال اطلاعات گرفتی؟؟
          من هر کار کردم نتونستم . تو تابع وقفه از دستور getc استفاده کردم ولی اصلا کار نکرد

          دیدگاه


            #6
            پاسخ : مشکل با UART

            هم می تونی از getc استفاده کنی هم مستقیم رجستر RCREG را بخونی.
            کد ت را بذار اگر ایراد داشت بهت بگم

            دلیل: ادغام دو پست برای جلوگیری از اسپم

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

            دیدگاه


              #7
              پاسخ : مشکل با UART

              سلام
              این کد برنامه هست . دستور printf درست کار میکنه ولی موقع دریافت اصلا وقفه uart فعال نمیشه یعنی وارد تابع وقفه نمیشه.

              #include <1.h>
              char k;
              #INT_RDA
              void RDA_isr(void)
              {
              k=getc();
              output_high(pin_a2);


              }
              #define LCD_ENABLE_PIN PIN_B0
              #define LCD_RS_PIN PIN_B1
              #define LCD_RW_PIN PIN_B2
              #define LCD_DATA4 PIN_B3
              #define LCD_DATA5 PIN_B4
              #define LCD_DATA6 PIN_B5
              #define LCD_DATA7 PIN_B6


              #include <lcd.c>


              void main()
              {
              enable_interrupts(GLOBAL);
              enable_interrupts(INT_RDA);




              lcd_init();
              printf("rasool");
              delay_ms(500);
              while(TRUE)
              {

              lcd_putc(k);
              delay_ms(500);
              lcd_clear();
              }


              }

              دیدگاه


                #8
                پاسخ : مشکل با UART

                تابع تنظیمات سریال کجاست ؟
                #use rs232 ()

                دیدگاه


                  #9
                  پاسخ : مشکل با UART

                  من از ویزارد استفاده کردم که خودش کد تولید کرده نمیدونم چرا تو کد نیست ولی کار میکنه.
                  این مشکل وارد نشدن به وقفه هم به خاطر این بود که من از یوزارت نرم افزاری استفاده کردم یعنی از خود پایه های tx و rx استفاده نکردم . الان مشکل حل شد و درست کار میکنه
                  فقط یک سوال چطور میشه یک متغیر نوع string به int ابدیل کرد؟ مثلا یک عدد توسط یوزارت دریافت میشه و داخل یک متغیر میریزیم حالا میخوام از نوع int بشه.

                  دیدگاه

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