اطلاعیه

Collapse
No announcement yet.

میکرو با دو یوزارت

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

    میکرو با دو یوزارت

    سلام دوستان من میخوام با میکرو atmega162 که دوتا یوزارت داره کار کنم . هر دویوزارت درست دریافت میکنن و یوزارت 0 هم درست ارسال میکنه ولی برا ارسال با یوزارت1 مشکل دارم . کدیویژن به دستور printf1 ارور میده ولی تو هلپش putchar1 و getchar1 داره.
    یه مشکل دیگه که داشم اینه که من میخوام با وقفه یوزارت دریافت کنم ولی نمیتونم بعد از دریافت بافر ورودی صفر کنم اطلاعات جدید دنبال قبلی ها ذخیره میشه.

    #2
    پاسخ : میکرو با دو یوزارت

    سلام
    اول اینکه اصلا از printf استفاده نکنید چون حجم زیادی از حافظه کدرو اشغال میکنه
    وقفه پورت سریال در کدویژن بصورت صف حلقوی یا هممون ering queue اجرا شده،
    یعنی اینکه وقتی وقفه فعال میشه، یه تابع اونو دریافت میکنه و در انتهای یه آرایه حلقوی که اندازش رو شما تعیین کردین ذخیره میشه ، یه متغیر هم نشون میده الان چندتا بایت داخل بافر هست.
    شما هر وقت نیاز داشتین با تابع getchar1 داده ها رو بخونید

    دیدگاه


      #3
      پاسخ : میکرو با دو یوزارت

      کدویژن pritnf1 اصلا نداره. اگه بخواید باید خودتون تابعشو بنویسید.
      برای دریافت هم اگه داخل وقفه دریافت مستقیما از خود UDR بخونید فک می کنم بهتر باشه.
      www.gam-co.blogsky.com

      دیدگاه


        #4
        پاسخ : میکرو با دو یوزارت

        نوشته اصلی توسط vahidabedi نمایش پست ها
        کدویژن pritnf1 اصلا نداره. اگه بخواید باید خودتون تابعشو بنویسید.
        برای دریافت هم اگه داخل وقفه دریافت مستقیما از خود UDR بخونید فک می کنم بهتر باشه.
        منم چون این مشکل داشتم خودم تمام برنامه ای که کدیویژن تو وقفه یوزارت مینوشت پاک کردم و مستقیما از udr خوندم و ریختم تو یک ارایه دیگه. ولی اصلا تعداد بیتهای دریافتی و بیتهای استپ و توتزن چک نمیکنم . مشکلی پیش میاد؟؟؟؟

        در مورد ارسال با یوزارت 1 هم میشه بیشتر توضیح بدید.

        دیدگاه


          #5
          پاسخ : میکرو با دو یوزارت

          نه مشکلی پیش نمیاد.
          برای ارسال میتونید از putchar1 استفاده کنید یا اینکه برای ارسال هم از UDR1 استفاده کنید.یعنی اینطوری مثلا:

          UDR1='a';

          ولی با این روش فقط هر بار 1بایت رو میشه ارسال کرد و وقتی بایت اول تموم شد باید بایت بعد ارسال بشه. اگه میخواید این مشکل هم نباشه از همون prinf باید استفاده کنید. یه سرچ در مورد یوزارت نرم افزاری بزنید توابعش رو پیدا میکنید.
          جدیدترین ویرایش توسط vahidabedi; ۰۹:۳۱ ۱۳۹۵/۰۵/۲۲.
          www.gam-co.blogsky.com

          دیدگاه


            #6
            پاسخ : میکرو با دو یوزارت

            نوشته اصلی توسط vahidabedi نمایش پست ها
            نه مشکلی پیش نمیاد.
            برای ارسال میتونید از putchar1 استفاده کنید یا اینکه برای ارسال هم از UDR1 استفاده کنید.یعنی اینطوری مثلا:

            UDR1='a';

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



            i=0;
            while(data[i]!=0)
            {
            if(UDR1==0)
            {
            UDR1=data[i];
            i++;
            }
            }




            تو شرط حلقه while چک میکنه که اگه data به اخر رسید از حلقه خارج بشه و تو شرط if هم چک میکنه که اگه udr خالی شده کاراکتر بعدی بفرسته
            فقط هر بار ممکنه طول رشته data فرق کنه . مشکلی پیش نمیاد؟؟
            جدیدترین ویرایش توسط rasool1370; ۱۱:۰۷ ۱۳۹۵/۰۵/۲۲.

            دیدگاه


              #7
              پاسخ : میکرو با دو یوزارت

              دیلی هم لازم داره. مقدار دیلی بستگی به باودریت داره. مثلا برای باود 9600 شما حداقل 2 میلی ثانیه دیلی نیاز دارید. بدین صورت که 1بیت استارت 8 بیت دیتا و 1 بیت استپ در هربار ارسال میشه یعنی 10 بیت. هر 1000 میلی ثانیه 9600 بیت ارسال میشه پس برای 10 بیت میشه 1.04 میلی ثانیه و از اونجایی که نمیشه توی تایع دیلی عدد اعشاری نوشت دیلی رو 2 میلی ثانیه انتخاب می کنیم.
              www.gam-co.blogsky.com

              دیدگاه

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