اطلاعیه

Collapse
No announcement yet.

راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

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

    #46
    پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

    نوشته اصلی توسط Soodi
    سلام

    من می خواهم که کل متغیر رو یکجا ارسال کنم و یا یک کلمه رو به صورت یکجا ارسال کنم و در گیرنده نیز به صورت یکجا دریافت کنم ولی دوستان فرمودند که اساس کار این ماژول به این صورت است که یک متغیر رو به صورت تکه تکه و در چند مرحله ارسال می کند ولی چرا با توجه به برنامه ای که در بالا گزاشتم تا 3 رقم رو به صورت یکجا ارسال می کرد و در گیرنده نیز به درستی این 3 رقم دریافت می شد ، البته این 3 رقم فقط تا 231 بود یعنی اگر بالاتر می زدم همون 231 رو دوباره می گرفت ، اگر راهی بود که بالاتر از 3 رقم رو می شد ارسال کرد و یا حداقل این 3 رقم تا 999 بود ، نه تا 231 !!!!

    بالاخره با این اوصاف AVR و زبان بیسیک بهتر بود چون کل متغیر و یا یک رشته (یک کلمه یا جمله) رو به صورت یکجا ارسال می کرد و به صورت یکجا دریافت می کرد ، حتا روی LCD هم به درستی و بدون تبدیل کد اسکی و این چیز ها نشان می داد

    با سپاس
    احتمالا منظورشون این بوده که مثلا متغیر 16 بیت رو نمیشه یکجا ارسال کرد چون حداکثر طول دیتای ارسالی 9 بیته پس یه کاری کنید
    اگر ماژولتون 8 بیت میفرسته دیتاتون 8 بیته اون رو مستقیما ارسال کنید بدون هیچ تغییری
    اگر بیشتر از 8 بیته اون رو دو قسمت میکنید
    فرض کنید متغیر int 16 بیت داره بنابراین میتونید این کار رو انجام بدید:
    کد:
    int a=859;
    char b,c;
    b=a%256;
    c=a/256;
    الآن متغیر b حاوی 8 بیت کم ارزشه یعنی عدد 91 توشه و متغیر c هم 8 بیت بعدی داخلشه که میشه 768 ولی اگر مقدار c رو بخواید مقدارش 3 هست
    حالا متغیر های b و c رو ارسال میکنید با تابعی که هر چی اینور میفرستید اونور هم همونو بگیرید یعنی تبدیل اسکی نکنه
    بعد توی گیرنده
    کد:
    int s;
    char b,c;
    .
    .
    .
    s=c;
    s=s+(256*c);
    اینجا متغیر های b و c رو میگیرید و عملیات رو روش انجام میدید در نتیجه متغیر s با a برابره ولی برای نمایشش روی LCD باید باید به تعداد رقم های احتمالی یه آرایه تعریف کنید و بعد یه تابع از اون کتابخونه ها پیدا کنید که مقدار int رو تبدیل کنه به اسکی و کد اسکی رقم ها رو دونه دونه داخل عضو های آرایه میریزه و بعد آرایه رو به LCD میفرستید
    فکر کنم اسم تابعش باید itoa باشه میتونید توی هدر جایی که توابع LCD هست یه نگاهی بکنید

    دیدگاه


      #47
      پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

      نوشته اصلی توسط Soodi
      سلام

      من دیگه AVR رو کنار گزاشتم ، برایم فرقی ندارد که از هیچ کدوم از امکانات ARM استفاده نکردم من فقط می خواهم کارم راه بیفتد ، مگه ARM رو ساختن که فقط باهاش پروژه های خیلی بزرگ یا ethernet,usb,can رو راه انداخت ، هر کسی می تونه هر کاری با این میکرو بکنه ، شاید دلش بخواهد که چراغ چشمک زن بسازه ، چه اشکالی داره ؟ ، اون موقع هم که AVR تازه اومده بود همه فکر می کردند که برای کار های بزرگ ساخته شده ولی کم کم یک چیز بهتر مثل ARM اومد و حالا AVR رو کسی قبول نداره !!!

      ****** خوب من ماژول ها رو از مدار خارج کردم و با یک تکه سیم میکرو ها را به یکدیگر متصل کردم و متوجه شدم که وقتی من با دستور SendChar عدد 789 رو ارسال می کنم (با متغیر int ) در گیرنده عدد 25 دریافت می شود ، حتا این دفعه یک دستور IF گزاشتم که وقتی متغیر 21 شد بازر رو روشن کن و دیدم که بازر روشن شد ولی وقتی IF رو تغییر دادم که وقتی متغیر 789 شد ..... بازر روشن نشد !!!

      با دستور Printf هم همینطور ، عدد 123 رو ارسال می کنم و در گیردنده عدد 51 دریافت می شود که باز هم با بازر امتحان کردم و متوجه شدم که واقعا عدد 51 دریافت می شود !!!!!!!!!!!!!

      با سپاس
      اشاره کردم که ماژول هارو از مدار خارج کردم پس یعنی ارتباطی به چند بیتی بودن ماژول نداره تازه من با AVR جمله هم می فرستادم چه برسه به عدد

      با سپاس
      http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

      دیدگاه


        #48
        پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

        اگه 51 میاد دلیلش اینه مقدار کاراکتری 3 برابر 51 هست .2 برابر 50 و 1 برابر 49.توی اون if بجای 51 مقدار 50 یا 49 قرار بده ببین باز بازر به صدا در میاد

        دیدگاه


          #49
          پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

          سلام

          عدد 50 و 49 رو قرار دادم ولی بعضی مواقع بازر روشن و خاموش می شود

          با سپاس
          http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

          دیدگاه


            #50
            پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

            میشه برنامه گیرندرو بذارید oo:

            دیدگاه


              #51
              پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

              برنامه

              گیرنده :

              #include <AT91SAM7X256.H>
              #include <delay.h>
              #include <usart.h>
              #include <stdio.h>

              #define LCD_PORT_B
              #define LCD_RS 0
              #define LCD_E 1
              #define LCD_DB4 5
              #define LCD_DB5 4
              #define LCD_DB6 3
              #define LCD_DB7 2
              #include <lcd.h>

              #define Set_Buzzer() *AT91C_PIOB_SODR = 0x100000;
              #define Reset_Buzzer() *AT91C_PIOB_CODR = 0x100000;

              int main (void)
              {

              int a;

              *AT91C_PIOB_PER = 0x100000;
              *AT91C_PIOB_OER = 0x100000;

              lcd_init();
              lcd_clear();
              cursor_off();
              lcd_gotoxy(1,1);
              lcd_putsf("Resived Data With"
              lcd_gotoxy(2,1);
              lcd_putsf(" ++** HM-TR ++**"
              usart0_init(2,9600);
              delay_ms(500);

              while (1)
              {
              lcd_clear();
              cursor_off();
              lcd_gotoxy(1,1);
              lcd_putsf("Resived Data :"
              a = getkey();
              lcd_gotoxy(2,1);
              lcd_puts(a);
              if ( a == 49 )
              {
              Set_Buzzer();
              }
              else
              {
              Reset_Buzzer();
              }
              delay_ms(100);
              }
              }

              فرستنده :

              #include <AT91SAM7S64.H>
              #include <delay.h>
              #include <usart.h>
              #include <stdio.h>

              #define LCD_PORT_A
              #define LCD_RS 30
              #define LCD_E 29
              #define LCD_DB4 25
              #define LCD_DB5 26
              #define LCD_DB6 27
              #define LCD_DB7 28
              #include <lcd.h>

              int main (void)
              {

              int a;
              a = 789;

              lcd_init();
              lcd_clear();
              cursor_off();
              lcd_gotoxy(1,1);
              lcd_putsf("Sending Data With"
              lcd_gotoxy(2,1);
              lcd_putsf(" ++** HM-TR ++**"
              usart0_init(2,9600);
              delay_ms(500);

              while (1)
              {
              lcd_clear();
              cursor_off();
              lcd_gotoxy(1,1);
              lcd_putsf("Sending Data :"
              printf("123"
              delay_ms(100);
              }
              }
              http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

              دیدگاه


                #52
                پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

                دلیلش اینه که فقط 100 میلی ثانیه بازر روشن میشه.عدد یک میاد.شرط برقرار میشه و بازر روشن میشه،پشت سرش عدد 2 میاد و شرط برقرار نیست و بازر خاموش میشه.دلیل اینکه عدد 3 هم میاد بازر روشن میمونه اینه که روی دستور getkey() متوقف میشه بعد از ارسال 3 و چون عددی نمیاد همونجا میمونه و دیگه به if ها کاری نداره،دلیل اینکه هم عدد 51 روی lcd میمونه هم همینه،مگرنه قبلش 49 بعد روش 50 و دوباره روش 51 نوشته میشه

                دیدگاه


                  #53
                  پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

                  بله درسته ، هنگامی که تغذیه مدار رو متصل می کنم ابتدا عدد 49 و سپس 50 و سپس 51 نمایش داده می شود
                  خوب حالا با این جواب می توانیم به چه نتایجی برسیم ؟؟

                  با سپاس
                  http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

                  دیدگاه


                    #54
                    پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

                    شما همون برنامه ای که 4 بار getkey() داشت از هر متغییر که با getkey() گرفتی مقدار 48 تا کم کن.بعد اون ضرب و بعلاورو روش انجام بده
                    دلیل 48 هم اینه
                    مقدار کاراکتری 1 برابر 49 بود اگه 48 تا ازش کم کنیم میشه 1 بقیه ارقام هم به همین ترتیب

                    دیدگاه


                      #55
                      پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

                      سلام

                      با راهنمایی آقای رجب زاده و یکم تغییر توسط خودم توانستم که به عدد 567 برسم ولی عدد ارسالی رو تغییر ندادم که ببینم چی می شه

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

                      #include <AT91SAM7X256.H>
                      #include <delay.h>
                      #include <usart.h>
                      #include <stdio.h>

                      #define LCD_PORT_B
                      #define LCD_RS 0
                      #define LCD_E 1
                      #define LCD_DB4 5
                      #define LCD_DB5 4
                      #define LCD_DB6 3
                      #define LCD_DB7 2
                      #include <lcd.h>

                      #define Set_Buzzer() *AT91C_PIOB_SODR = 0x100000;
                      #define Reset_Buzzer() *AT91C_PIOB_CODR = 0x100000;

                      int main (void)
                      {

                      int s;
                      char b,c;


                      *AT91C_PIOB_PER = 0x100000;
                      *AT91C_PIOB_OER = 0x100000;

                      lcd_init();
                      lcd_clear();
                      cursor_off();
                      lcd_gotoxy(1,1);
                      lcd_putsf("Resived Data With"
                      lcd_gotoxy(2,1);
                      lcd_putsf(" ++** HM-TR ++**"
                      usart0_init(2,9600);
                      delay_ms(500);

                      while (1)
                      {
                      lcd_clear();
                      cursor_off();
                      lcd_gotoxy(1,1);
                      lcd_putsf("Resived Data :"
                      b = getkey();
                      c = getkey();
                      s=c;
                      s=s+(256*c);
                      s = s / 25 + 2.6;
                      lcd_gotoxy(2,1);
                      lcd_puts(s);
                      if ( s == 567 )
                      {
                      Set_Buzzer();
                      }
                      else
                      {
                      Reset_Buzzer();
                      }
                      delay_ms(100);
                      }
                      }


                      ********************** با راهنمایی آقای روزیطلب به برنامه زیر رسیدم که عدد 1155 رو دریافت می کردم

                      #include <AT91SAM7X256.H>
                      #include <delay.h>
                      #include <usart.h>
                      #include <stdio.h>

                      #define LCD_PORT_B
                      #define LCD_RS 0
                      #define LCD_E 1
                      #define LCD_DB4 5
                      #define LCD_DB5 4
                      #define LCD_DB6 3
                      #define LCD_DB7 2
                      #include <lcd.h>

                      #define Set_Buzzer() *AT91C_PIOB_SODR = 0x100000;
                      #define Reset_Buzzer() *AT91C_PIOB_CODR = 0x100000;

                      int main (void)
                      {

                      int a,b,c,d;


                      *AT91C_PIOB_PER = 0x100000;
                      *AT91C_PIOB_OER = 0x100000;

                      lcd_init();
                      lcd_clear();
                      cursor_off();
                      lcd_gotoxy(1,1);
                      lcd_putsf("Resived Data With"
                      lcd_gotoxy(2,1);
                      lcd_putsf(" ++** HM-TR ++**"
                      usart0_init(2,9600);
                      delay_ms(500);

                      while (1)
                      {
                      lcd_clear();
                      cursor_off();
                      lcd_gotoxy(1,1);
                      lcd_putsf("Resived Data :"
                      a = getkey();
                      b = getkey();
                      c = getkey();
                      d = a * 10 + b * 10 + c;
                      lcd_gotoxy(2,1);
                      lcd_puts(d);
                      if ( d == 567 )
                      {
                      Set_Buzzer();
                      }
                      else
                      {
                      Reset_Buzzer();
                      }
                      delay_ms(100);
                      }
                      }

                      ************************** در تمامی برنامه ها متغیر int با مقدار 567 با دستور sendchar ارسال می شد



                      با سپاس
                      http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

                      دیدگاه


                        #56
                        پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

                        ببینم یعنی برنامه من درست کار کرد؟
                        اگه درست کار کرد که خوبه و راهنمایی هام نتیجه داشته و اگر شما زودتر گوش میکردی زودتر به نتیجه میرسیدی اگر هم که نه پس هنوز کار داریم
                        حالا یه راه بهتر برای اعداد بزرگتر:
                        کد:
                        char x;
                        long int a=39618;
                        for(char i=0;a>0;i++)
                        {
                        x=a%256;
                        a/=256;
                        sendchar(x);
                        }
                        گیرنده:
                        کد:
                        char x[4];
                        long int a;
                        for(char i=3;i>=0;i--)
                        {
                        x[i]=getkey();
                        }
                        for(i=3;i>=0;i--)
                        {
                        a+=x[i];
                        a*=256;
                        }
                        با این برنامه میشه اعداد و متغیر های خیلی بزرگتر رو هم فرستاد اما باید بدونی که متغیرت چند بایته یعنی چند تا 8 بیتیه
                        که بر حسب اون توی گیرنده تعداد عضو های آرایه x معلوم میشه و مقدار داخل i هم یکی کمتر از تعداد بایت هاست اگر هم میخواستی محدودیت نباشه که میتونی از وکتور استفاده بکنی و ...
                        بیخیال مورد وکتور بشی بهتره همین طوری کار میکنه

                        دیدگاه


                          #57
                          پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

                          در ضمن اون قسمت از برنامه آقای روزیطلب که
                          نوشته شده:
                          نوشته اصلی توسط Soodi
                          d = a * 10 + b * 10 + c;
                          اشتباهه و باید a در 100 ضرب بشه
                          در ضمن برنامه من هم اشتباه نوشتی اون تیکه که میاد متغیر های b و c رو میریزه توی s شما c رو دوبار استفاده کردی پس تکلیف b چی میشه؟
                          برنامه رو دقیق به همراه فرستنده بزار شاید هر دو برنامه کار بکنند

                          دیدگاه


                            #58
                            پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت &#

                            ممنون
                            http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

                            دیدگاه


                              #59
                              پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

                              این ارور های گیرنده :

                              Build target 'Target 1'
                              assembling SAM7.s...
                              compiling Program.c...
                              Program.c(44): error: #29: expected an expression
                              Program.c(44): warning: #186-D: pointless comparison of unsigned integer with zero
                              Program.c(48): warning: #186-D: pointless comparison of unsigned integer with zero
                              Target not created

                              این هم ارور های فرستنده :

                              Build target 'Target 1'
                              assembling SAM7.s...
                              compiling Program.c...
                              Program.c(38): error: #29: expected an expression
                              Target not created

                              با سپاس
                              http://vz.iminent.com/vz/39a77668-19...h-fishing.giff

                              دیدگاه


                                #60
                                پاسخ : راه اندازی واحد USART در AT91SAM7S64 و ارسال و دریافت با HM-TR

                                نوشته اصلی توسط Soodi
                                این ارور های گیرنده :

                                Build target 'Target 1'
                                assembling SAM7.s...
                                compiling Program.c...
                                Program.c(44): error: #29: expected an expression
                                Program.c(44): warning: #186-D: pointless comparison of unsigned integer with zero
                                Program.c(48): warning: #186-D: pointless comparison of unsigned integer with zero
                                Target not created

                                این هم ارور های فرستنده :

                                Build target 'Target 1'
                                assembling SAM7.s...
                                compiling Program.c...
                                Program.c(38): error: #29: expected an expression
                                Target not created

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

                                دیدگاه

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