اطلاعیه

Collapse
No announcement yet.

ارتباط سریال در pic

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

    ارتباط سریال در pic

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

    بنده از طریق کامپیوتر با میکرو ارتباط برقرار کردم. اما....
    اما مشکل اینجاست که مثلا وقتی داده C0 00 40 06 0A را میفرستم داده ای که میکرو برمیگرداند، هربار تغییر میکند.
    کد

    #include <18f452.h>
    #use delay (xtal=20MHz)
    #fuses HS,nowdt
    #use rs232(baud=9600,parity=N, xmit=PIN_C6,rcv=PIN_C7)

    char s[5];


    void main()
    {


    while(true)
    {
    for(int i=0;i<=4;i++)
    s[i]=getc();
    putc(s[4]);

    }

    }


    هدف این است که داده که 5 بایت است، هر کدام در یک خانه از ارایه ذخیره شده و مثلا 0a را حذف کرده و بقیه را به عدد تبدیل کنم.
    هم اکنون نیازمند یاری سبزتان هستیم......
    رو به خودت نسبت هستی مده!**دل به چنین مستی و پستی مده! //زانچه نداری ز چه افسردهآ‌ای*و زغم و اندوه دل آزردهآ‌ای؟!//گر ببرد ور بدهد دست دوست*ور بِبَرد ور بنهد مُلک اوست//ور بِکِشی یا بکُشی دیو غم **کج نشود دست قضا را قلم//آنچه خدا خواست همان میآ‌شود**وآنچه دلت خواست نه آن میآ‌شود.
    ....

    #2
    پاسخ : ارتباط سریال در pic

    سلام

    برنامه ای که نوشتید کامل نیست !

    ببینید به دو روش میتونید با درگاه سریال ارتباط برقرار کنید 1 روش پولینگ یا چک کردن مدام 2 روش استفاده از وقفه

    در روش اول
    شما باید در یک حلقه , پرچم دریافت سریال رو مدام چک کنید , یعنی باید اول ببینید که آیا یک بایت سریال توسط سخت افزار USART دریافت شده یا خیر و اگر دریافت شده بود اقدام به خوندن اون بایت کنید و اون رو در یک بافر ذخیره کنید

    در روش دوم
    نیازی به چک کردن مدام نیست و هنگام دریافت یک بایت , میکرو وقفه میخوره و شما میتونید بایت دریافت شده رو در داخل یک بافر ذخیره کنید

    در برنامه شما خبری از چک کردن پرچم دریافت نیست !
    نا اميدي يه دروغ بزرگه که آدما به خودشون ميگن
    تلاش يه حقيقت بزرگه که با صبر به ثمر ميرسه

    دیدگاه


      #3
      پاسخ : ارتباط سریال در pic

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

      دیدگاه


        #4
        پاسخ : ارتباط سریال در pic

        نوشته اصلی توسط ramezani.t
        سلام

        برنامه ای که نوشتید کامل نیست !

        ببینید به دو روش میتونید با درگاه سریال ارتباط برقرار کنید 1 روش پولینگ یا چک کردن مدام 2 روش استفاده از وقفه

        در روش اول
        شما باید در یک حلقه , پرچم دریافت سریال رو مدام چک کنید , یعنی باید اول ببینید که آیا یک بایت سریال توسط سخت افزار USART دریافت شده یا خیر و اگر دریافت شده بود اقدام به خوندن اون بایت کنید و اون رو در یک بافر ذخیره کنید

        در روش دوم
        نیازی به چک کردن مدام نیست و هنگام دریافت یک بایت , میکرو وقفه میخوره و شما میتونید بایت دریافت شده رو در داخل یک بافر ذخیره کنید

        در برنامه شما خبری از چک کردن پرچم دریافت نیست !
        ممنون از پاسخ شما
        اینو متوجه شدم و برنامم رو با وقفه تنطیم کردم ونکته دیگر اینکه که هربار 5 بایت داده میگیره، اینو چطوری در روتین سرویس وقفه قرار بدم که بتونم به تک تک بایتها دسترسی داشته باشم.
        ممنون

        اضافه شده در تاریخ :
        نوشته اصلی توسط S S
        من قبلا این مشکلو با CCS داشتم پدرمو در آورد
        از پورت سریال سخت افزاری استفاده کن مشکلت حل میشه
        ممنون از لطف شما.
        منظورتون رو متوجه نشدم. اینکه
        مدار من اینطوریه که از کامپیوتر با rs232 و max232 به میکرو وصل شدم که اگه جواب بده، ماژولم رو با کامپیوتر جایگزین میکنم.
        برا شما هم همینطوری بود ایا؟
        رو به خودت نسبت هستی مده!**دل به چنین مستی و پستی مده! //زانچه نداری ز چه افسردهآ‌ای*و زغم و اندوه دل آزردهآ‌ای؟!//گر ببرد ور بدهد دست دوست*ور بِبَرد ور بنهد مُلک اوست//ور بِکِشی یا بکُشی دیو غم **کج نشود دست قضا را قلم//آنچه خدا خواست همان میآ‌شود**وآنچه دلت خواست نه آن میآ‌شود.
        ....

        دیدگاه


          #5
          پاسخ : ارتباط سریال در pic

          منطور من اینه که شما توی کامپایلر ccs پایه های rx و tx خودتون مشخص میکنید که به کدوم پین متصل بشه
          نمیدونم کامپایلر چیکار میکنه ولی من وقتی درست از پایه های RX و TX خود میکرو استفاده کردم دیتا درست ردو بدل میکرد
          دستور فعال سازیش فرق داره فردا برات میزارم

          اضافه شده در تاریخ :
          [code=c]#use rs232(baud=2400, UART1, ERRORS)[/code]

          دیدگاه


            #6
            پاسخ : ارتباط سریال در pic

            نوشته اصلی توسط amanver
            ممنون از پاسخ شما
            اینو متوجه شدم و برنامم رو با وقفه تنطیم کردم ونکته دیگر اینکه که هربار 5 بایت داده میگیره، اینو چطوری در روتین سرویس وقفه قرار بدم که بتونم به تک تک بایتها دسترسی داشته باشم.
            ممنون
            با سلام یک ارایه و عدد گلوبال تعریف کنید و مثل زیر عمل کنید
            کد:
            Char rd = uart_rd();
            Buf[bufIndex]=rd;
            حالا تو ارایه رشته ورودی هست، فقط با توجه به طول ارایه یه شزط هم روی اون عدد بذار تا از سرریز بافر جلوگیری کنی
            The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

            دیدگاه


              #7
              پاسخ : ارتباط سریال در pic

              بالاخره با راهنمایی دوستان به نتیجه رسید.ممنونم از شما

              کد را اوردیم شاید به درد دوستان دیکر بخوره.
              کد:
              #include <18f452.h>
              #use delay (xtal=20MHz)
              #fuses HS,nowdt
              #use rs232(baud=9600, UART1, ERRORS)
              
              char rcv,s[5];
              #INT_RDA
              void RDA_isr(void) // receive data from rs485 
              {
              for(int i=0;i<=4;i++)
              {
              rcv=getc();
              s[i]=rcv;
              }
              putc(s[3]);
              } 
              
              
              void main()
              {
              
              enable_interrupts(INT_RDA);
              enable_interrupts(GLOBAL);
              
              while(true)
              {
              
              }
              
              }
              فقط 2 تا سوال دارم.
              یکی اینکه دستور uart_rd() در ccs بود یانه؟
              دومیش هم اینکه وقتی داده ای بیشتر از 5 بایت(بیشتر از طول ارایه) میدم، داده مورد نظر برنمیگرده.میخواستم بدونم برای اینکه هر داده ای با هر طولی گرفتم همان نتیجه رو بده باید چه کنم؟
              ممنون
              رو به خودت نسبت هستی مده!**دل به چنین مستی و پستی مده! //زانچه نداری ز چه افسردهآ‌ای*و زغم و اندوه دل آزردهآ‌ای؟!//گر ببرد ور بدهد دست دوست*ور بِبَرد ور بنهد مُلک اوست//ور بِکِشی یا بکُشی دیو غم **کج نشود دست قضا را قلم//آنچه خدا خواست همان میآ‌شود**وآنچه دلت خواست نه آن میآ‌شود.
              ....

              دیدگاه


                #8
                پاسخ : ارتباط سریال در pic

                بالاخره با راهنمایی دوستان به نتیجه رسید.ممنونم از شما
                :applause:
                یکی اینکه دستور uart_rd() در ccs بود یانه؟
                مثال بود، منظورم تابع مخصوص خوندن کاراکتر در کامپایلر شما بود. در میکرو سی این دستور وجود داره.
                دومیش هم اینکه وقتی داده ای بیشتر از 5 بایت(بیشتر از طول ارایه) میدم، داده مورد نظر برنمیگرده.میخواستم بدونم برای اینکه هر داده ای با هر طولی گرفتم همان نتیجه رو بده باید چه کنم؟
                کد رو به شکل زیر اصلاح کنید
                کد:
                char buf[1000];
                int bufIndex=0;
                #INT_RDA
                void RDA_isr(void) // receive data from rs485 
                {
                buf[bufIndex++] = getc();
                if ( bufIndex > 999 )
                bufIndex = 0;
                }
                نیازی به for نیست به ازای هر کاراکنر دریافتی یه بار کد بالا اجرا میشه، با کد بالاشما تا 1000 کاراکتر رو می نوتید بخونید که برای اکثر کار ها بیش از کافیه. بیش از 1000 کاراکتر دوباره میاد و دیتاهای قبل رو overwrite میکنه. این از دریافت اصولی حالا هر کار می خواین با اضافه کردن کد مربوط انجام بدین
                و سوال اخر اینکه اگر داده ای به صورت C0 00 40 06 از سریال بگیرم، چگونه میتوان به عدد تبدیل کرد به این صورت که دوبایت اول به یک عدد و دو بایت دوم به عددی دیگر. بایت اخر هم بایت علامت بوده و حذف میشود.؟
                اگه درست فهمیده باشم
                کد:
                int a = buf[0] << 8 | buf[1];
                با کد بالا دو یایت اول باهم یکجا، معنای یک عدد رو پیدا می کنن
                The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                دیدگاه


                  #9
                  پاسخ : ارتباط سریال در pic

                  نوشته اصلی توسط hessam2013
                  نیازی به for نیست به ازای هر کاراکنر دریافتی یه بار کد بالا اجرا میشه، با کد بالاشما تا 1000 کاراکتر رو می نوتید بخونید که برای اکثر کار ها بیش از کافیه. بیش از 1000 کاراکتر دوباره میاد و دیتاهای قبل رو overwrite میکنه. این از دریافت اصولی حالا هر کار می خواین با اضافه کردن کد مربوط انجام بدیناگه درست فهمیده باشم
                  همممممم...
                  ممنون
                  . اما عملیات من روی هر 4 بایت همزمان انجام میشه ها....
                  یعنی بازم به حلقه برای گرفتن کامل داده و سپس انجام عملیات نیازی نیست؟؟؟؟ میخام بگم که هر بار که یه بایت گرفت و اینتراپت داد تمامی دستورات روتین وقفه رو انجام میده درحالی که هنوز داده های من همون 4 بایت کامل نشده.
                  رو به خودت نسبت هستی مده!**دل به چنین مستی و پستی مده! //زانچه نداری ز چه افسردهآ‌ای*و زغم و اندوه دل آزردهآ‌ای؟!//گر ببرد ور بدهد دست دوست*ور بِبَرد ور بنهد مُلک اوست//ور بِکِشی یا بکُشی دیو غم **کج نشود دست قضا را قلم//آنچه خدا خواست همان میآ‌شود**وآنچه دلت خواست نه آن میآ‌شود.
                  ....

                  دیدگاه


                    #10
                    پاسخ : ارتباط سریال در pic

                    منطقا نه، لازم نیست، ببینید اصولا میگن روتین سرویس به وقفه باید حدالامکان ساده باشه، در حد چک و ریست کردن فلگ های مبوطه و خوندن دیتا، سریع بره تو بیاد بیرون، پردازش سنگین و بالا باید در حلقه اصلی برنامه انجام بشه، شما میتونید تو while برنامتون که همش داره اجرا میشه، bufIndex رو چک کنید و هر وقت بزرگتر از 4 شد عملیات رو روی 4 کاراکتر اول buf انجام بدین و bufIndex رو 4 تا کم کمین و 4 کاراکتر اول buf رو خالی کنین، این طوری بافر هر قدر هم پر بشه به نوبت پردازش و خالی میشه،
                    Nice and clean
                    The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                    دیدگاه


                      #11
                      پاسخ : ارتباط سریال در pic

                      نوشته اصلی توسط hessam2013
                      با کد بالا دو یایت اول باهم یکجا، معنای یک عدد رو پیدا می کنن
                      یعنی یه عدد 16 بیتیه.
                      اخه تو کامپایلر وقتی شما میخای مقداری رو چاپ کنی میشه بدون توجه به نوع اون مقدار به چند روش رو lcd چاپ کرد. حالا اگه رو همین مقدار بخوای عملیات انجام بدی نوع مقدار خودشو نشون میده. حالا این دوبایت اول که یک 16 بیتی تشکیل میدن نوعش int هست ایا؟
                      رو به خودت نسبت هستی مده!**دل به چنین مستی و پستی مده! //زانچه نداری ز چه افسردهآ‌ای*و زغم و اندوه دل آزردهآ‌ای؟!//گر ببرد ور بدهد دست دوست*ور بِبَرد ور بنهد مُلک اوست//ور بِکِشی یا بکُشی دیو غم **کج نشود دست قضا را قلم//آنچه خدا خواست همان میآ‌شود**وآنچه دلت خواست نه آن میآ‌شود.
                      ....

                      دیدگاه


                        #12
                        پاسخ : ارتباط سریال در pic

                        اگه متوجه شده باشم، شما طول متغیر ها براتون سوال شده، int همه جا یک طول نداره و کامپایلر به کامپایلر میتونه عوض شه، اما هدر فایل stdint.h هست که میشه استفاده کرد تا مطمئن شیم طول متغیر رو همونی که میخوایم کامپایلر تعریف می کنه، مثلا 16 بیت علامت دار یا بی علامت و غیره
                        The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                        دیدگاه


                          #13
                          پاسخ : ارتباط سریال در pic

                          با عرض سلام خدمت دوستان.
                          مشکلی که الان درگیرش هستم اینه که در ارتباط سریال با هر بار ریست کردن میکرو داده هام عوض میشه. به این صورت که دیتاشیت گفته که هر بار که داده میاد 16 بایت هستش. بنده هم بافری 32 بایتی درنظر گرفتم و درایه های خاصی رو در ارایه دیگر ذخیره کردم.اما وقتی رو lcd نشون میدم هربار یک قسمت از داده رو نشون میده.
                          compiler :ccs 5007
                          micro : 18f452
                          کد:
                          #include <18f452.h>
                          #use delay (xtal=20MHz)
                          #fuses HS,nowdt
                          #use rs232(baud=9600,bits=8,UART1, ERRORS)
                          
                          #define LCD_RS_PIN   PIN_b0                  
                          #define LCD_RW_PIN   PIN_b1
                          #define LCD_ENABLE_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>
                           
                          
                           
                          //int8 a,c;
                          unsigned char buf[32],x[3],y[3];
                          //int16 b,d;
                          int bufIndex=0;
                          #INT_RDA
                          void RDA_isr(void) // receive data from rs485 
                          {
                          
                          buf[bufIndex++]=getc();
                          if ( bufIndex >31 )
                          bufIndex = 0;
                          } 
                          
                          
                          void main()
                          {
                          for (int i=0;i<=31;i++)
                          buf[i]=0;
                          enable_interrupts(INT_RDA);
                          enable_interrupts(GLOBAL);
                          putc('*');
                          putc('P');
                          
                          while(true)
                          {
                           lcd_init();
                          
                          x[0]=buf[19];
                          x[1]=buf[20];
                          x[2]=buf[22];
                          
                          y[0]=buf[27];
                          y[1]=buf[28];
                          y[2]=buf[30];
                          
                          
                          lcd_gotoxy(2,2);
                          for(int j=0;j<=2;j++)
                          printf(lcd_putc,"%c",x[j]);
                          
                          }
                          
                          }
                          عبارت P* هم برای گرفت داده است که فعلا یکبار داده میگیرم تا درستی برناممو چک کنم.
                          رو به خودت نسبت هستی مده!**دل به چنین مستی و پستی مده! //زانچه نداری ز چه افسردهآ‌ای*و زغم و اندوه دل آزردهآ‌ای؟!//گر ببرد ور بدهد دست دوست*ور بِبَرد ور بنهد مُلک اوست//ور بِکِشی یا بکُشی دیو غم **کج نشود دست قضا را قلم//آنچه خدا خواست همان میآ‌شود**وآنچه دلت خواست نه آن میآ‌شود.
                          ....

                          دیدگاه


                            #14
                            پاسخ : ارتباط سریال در pic

                            نوشته اصلی توسط amanver
                            با عرض سلام خدمت دوستان.
                            مشکلی که الان درگیرش هستم اینه که در ارتباط سریال با هر بار ریست کردن میکرو داده هام عوض میشه. به این صورت که دیتاشیت گفته که هر بار که داده میاد 16 بایت هستش.
                            الان مشکل رو نگرفتم، اولا حرف بالا بی معنیه، با هر یه بایت وقفه اجرا میشه، رفرنس بدین بخونیم ببینیم چی میگه
                            بعد هم اگه تعداد دیتایی که می فرستین مقیوم علیه 32 نباشه، اینکه دیتای خانه nام ثابت نمونه چیز عجیبی نیست
                            The healthy human mind doesn't wake up in the morning thinking this is his last day on earth.

                            دیدگاه


                              #15
                              پاسخ : ارتباط سریال در pic

                              ممنون.
                              حله. بنده داده هام رو بعد از ذخیره کردن در بافر باتوجه به مشخصات داده ای که میخواستم، با چک کردن بایت های دریافتی تونستم استخراج کنم.
                              ب هرهال! ممنون.
                              منظورم این بود که دیتاشیت میگه که هر پک داده ای که میده 16 بایته، درست؟ و این منافاتی با این نداره که ارتباط سریال ما رو 8 بیت بسته شده یعنی با هر بار که اینتراپت میده 8 بیت میفرسته(میگیره).
                              اشتباه از من بود.ببخشید. البته زبان مادری بنده فارسی نیست.میتونه علتش این باشه.
                              رو به خودت نسبت هستی مده!**دل به چنین مستی و پستی مده! //زانچه نداری ز چه افسردهآ‌ای*و زغم و اندوه دل آزردهآ‌ای؟!//گر ببرد ور بدهد دست دوست*ور بِبَرد ور بنهد مُلک اوست//ور بِکِشی یا بکُشی دیو غم **کج نشود دست قضا را قلم//آنچه خدا خواست همان میآ‌شود**وآنچه دلت خواست نه آن میآ‌شود.
                              ....

                              دیدگاه

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