NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 2453 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 15 از 15

موضوع: رهنمایی برای ارسال و دریافت عدد با usart

  1. #1
    کاربر علاقه مند sadeqebrahimi آواتار ها
    تاریخ عضویت
    Jan 2012
    نوشته ها
    22
    تشکر
    25
    تشکر شده 0 بار در 0 پست

    پیش فرض رهنمایی برای ارسال و دریافت عدد با usart

    با سلام
    من میخام یک عدد متغییر رو با USART ارسال کنم و در گیرنده نمایشش بدم کد زیر رو نوشتم.اما انگار به شدت اشتباه هستش.
    با تشکر از راهنمایی دوستان



    ارسال

    کد:
    #ifndef F_CPU    #define F_CPU 8000000UL
    #endif
    #include <avr/io.h>
    #include <avr/iom8.h>
    #include <util/delay.h>
    #include <stdio.h>
    #include <stdlib.h>
    volatile char buff[8];
    volatile int i=177;
    
    
    void Send_Data(char *data)
    {
    while ((UCSRA & (1<<UDRE))==0); 
    UDR=*data; 
    }
    int main(void)
    {
        UCSRA=0x00;
        UCSRB=0x08;                                                                                      
        UCSRC=0x86;
        UBRRH=0x00;
        UBRRL=0x67;
        
        while(1)
        {
            
            
            itoa(i,buff,10);
            Send_Data(buff);
            
        }
    }

    دریافت

    کد:
    
    
    #ifndef F_CPU
        #define F_CPU 8000000UL
    #endif
    #include <avr/io.h>
    #include <avr/iom8.h>
    #include <util/delay.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "lcd.h"
    volatile char c, buff[8];
    volatile int i,j=0;
    unsigned char USART_Receive( void )
    {
    while ( !(UCSRA & (1<<RXC)) );
    return UDR;
    }
    int main(void)
    {
        UCSRA=0x00;
        UCSRB=0x90;                                                                                      
        UCSRC=0x86;
        UBRRH=0x00;
        UBRRL=0x67;
        while(1)
        {
            
    c=USART_Receive();
           
           i=(void*)c;
           itoa(i,buff,10);
           lcd_clrscr();           
            lcd_home();            
            lcd_gotoxy(0,1);
            lcd_puts(c);
            _delay_ms(50);
        }
    }
    ویرایش توسط sadeqebrahimi : 06-05-2014 در ساعت 10:57

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    کاربر علاقه مند sadeqebrahimi آواتار ها
    تاریخ عضویت
    Jan 2012
    نوشته ها
    22
    تشکر
    25
    تشکر شده 0 بار در 0 پست

    پیش فرض

    ویرایش:

    دوست عزیز اگه کسی بلد باشه جواب میده
    لطفا پست بی محتوا ارسال نکنید

    vahidasm
    ویرایش توسط vahidasm : 06-05-2014 در ساعت 21:32

  4. #3
    ناظم انجمن vahidasm آواتار ها
    تاریخ عضویت
    Feb 2010
    نام
    وحید
    نوشته ها
    754
    تشکر
    1,068
    تشکر شده 881 بار در 470 پست

    پیش فرض

    دوست عزیز اگه با وین ای وی آر کار میکنید از تابع زیر برای ارسال عدد استفاده کنید این تابع رو دوست عزیزم آقا صادق محمدی به من داده و خیلی هم عالی کار میکنه
    کد:
    void ChTostr(unsigned int x,char b)
    {
         unsigned long int t,m,count;
    
         unsigned char z=0,b_tmp;
    
         b_tmp = b;
         
         b--;
         
         for (b;b>0;b--)
         {
             
             switch(b)
             {
                 case 0: t=1;
                 
                 break;
    
                 case 1: t=10;
                 
                 break;
                 
                 case 2: t=100;
    
                 break;
                 
                 case 3: t=1000;
                 
                 break;
    
                 case 4: t=10000;
                 
                 break;
                 
                 case 5: t=100000;
    
                 break;
                 
                 case 6: t=1000000;
    
                 break;
             }
    
             m=x/t;
             
             str[z]=m+0x30;
             
             x=x-(t*m);
    
             z++;
    
         }
         str[z]=x+0x30;
         
         for(count=0;count<b_tmp;count++)
         {
             uart_putc(str[count]);
         }
    }

    مثال:

    کد:
    ChTostr(temp,2);
    اولین مرحله شناخت آفرینش همانا خرد است چشم و گوش و زبان سه نگهبان اویند که لاجرم هر چه نیکی و شر است از همین سه ریشه می گیرد .و افسوس که بدنبال کنندگان خرد اندکند باید که به سخن دانندگان راه جست و باید جهان را کاوش نمود و از هر کسی دانشی آموخت و یک دم را هم برای آموختن نباید از دست داد . فردوسی خردمند

  5. کاربران : 3 تشکر کرده اند از شما vahidasm برای ارسال این پست سودمند:


  6. #4
    کاربر علاقه مند sadeqebrahimi آواتار ها
    تاریخ عضویت
    Jan 2012
    نوشته ها
    22
    تشکر
    25
    تشکر شده 0 بار در 0 پست

    پیش فرض

    سلام
    بابت اسپم عذر میخام

    من این کد رو دوباره نوشتم اما مشکل بنظرم تو دریافت هستش.چون من یک بافر رو ارسال میکنم(اگه درست ارسال بشه) اما اونطرف فقط یک کاراکتر رو دریافت میکنم.تو شکل معلومه من 177 رو میخام ارسال کنم اما تو گیرنده فقط عدد اولی یعنی 1 رو دریافت میکنم.
    تو انجمن و جاهای دیگه گشتم یه ارسال و دریافت با usart درست حسابی پیدا نکردم.(شاید خوب نگشتم)
    با تشکر لطف دوستان

    کد:
    #ifndef F_CPU
    	#define F_CPU 8000000UL
    #endif
    #include <avr/io.h>
    #include <avr/iom8.h>
    #include <util/delay.h>
    #include <stdio.h>
    #include <stdlib.h>
    volatile char buff[8];
    volatile int i=177;
    
    
    void usart_puts(char *buff)
    {
    while ((UCSRA & (1<<UDRE))==0); 
    UDR=*buff; 
    }
    int main(void)
    {
    	UCSRA=0x00;
    	UCSRB=0x08;                                                                                      
    	UCSRC=0x86;
    	UBRRH=0x00;
    	UBRRL=0x67;
    	while(1)
        {
    		itoa(i,buff,10);
    		usart_puts(buff);
        }
    }
    دریافت

    کد:
    #ifndef F_CPU
    	#define F_CPU 8000000UL
    #endif
    #include <avr/io.h>
    #include <avr/iom8.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include "lcd.h"
    volatile char c,buff[8];
    volatile int i=0;
    ISR(USART_RXC_vect)
    {
    	c=UDR;
    }
    
    
    /*unsigned char usart_gets( void )
    {
    while ( !(UCSRA & (1<<RXC)) );
    return UDR;
    }*/
    int main(void)
    {
    	UCSRA=0x00;
    	UCSRB=0x90;                                                                                      
    	UCSRC=0x86;
    	UBRRH=0x00;
    	UBRRL=0x67;
    	sei();
    	lcd_init(LCD_DISP_ON);
        lcd_clrscr(); 
        while(1)
        {
    		 lcd_home();            
             lcd_putc(c);
    		 lcd_gotoxy(5,0);
    		 lcd_puts(buff);
        }
    }

  7. #5
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    سلام
    مهندس شما اومدین تو روتین وقفه فقط دیتا رو تو یه متغیر از نوع char میریزین، خوب معلومه که فقط دیتای اول رو دریافت میکنید و این اشتباهه!
    شما باید دیتای دریافتی رو تو آرایه بریزین.
    اینطوری:
    کد:
    char received_data[8];
    char counter=0;
    ISR(USART_RXC_vect)
    {
        received_data[counter]=UDR;
        counter++;
        if(counter == 8)
    `        counter=0;
    }
    ویرایش توسط sadmonew : 07-05-2014 در ساعت 13:26
    _____________________________________
    _____________________________________

  8. کاربران : 2 تشکر کرده اند از شما sadmonew برای ارسال این پست سودمند:


  9. #6
    کاربر علاقه مند sadeqebrahimi آواتار ها
    تاریخ عضویت
    Jan 2012
    نوشته ها
    22
    تشکر
    25
    تشکر شده 0 بار در 0 پست

    پیش فرض

    نقل قول نوشته اصلی توسط sadmonew نمایش پست ها
    سلام
    مهندس شما اومدین تو روتین وقفه فقط دیتا رو تو یه متغیر از نوع char میریزین، خوب معلومه که فقط دیتای اول رو دریافت میکنید و این اشتباهه!
    شما باید دیتای دریافتی رو تو آرایه بریزین.
    اینطوری:
    کد:
    char received_data[8];
    char counter=0;
    ISR(USART_RXC_vect)
    {
        received_data[counter]=UDR;
        counter++;
        if(counter == 8)
    `        counter=0;
    }
    سلام مهندس ازاین که وقت گذاشتین بینهایت متشکرم
    اما من قبلا این کار رو کرده بودم اما جواب نداد(الان به فرستنده هم شک دارم)
    پیشنهاد شما چیه برای ارسال و دریافت جای من میبودید چیکار میکردین

    کد:
    volatile char c,buff[8];volatile int i=0;
    unsigned char j=0;
    ISR(USART_RXC_vect)
    {
        c=UDR;
        buff[j]=c;
        j++;
    }
    ویرایش توسط sadeqebrahimi : 07-05-2014 در ساعت 14:21

  10. #7
    مدير بخش STM32 sadmonew آواتار ها
    تاریخ عضویت
    Jun 2011
    نام
    صادق محمدي
    نوشته ها
    2,002
    تشکر
    6,283
    تشکر شده 3,115 بار در 1,408 پست

    پیش فرض

    حتما از کریستال خارجی با فرکانس هایی مثل 7.3728MHz یا 14.7456MHz استفاده کن تا ارسال و دریافت دیتای بدون خطا داشته باشی.
    _____________________________________
    _____________________________________

  11. #8
    کاربر علاقه مند sadeqebrahimi آواتار ها
    تاریخ عضویت
    Jan 2012
    نوشته ها
    22
    تشکر
    25
    تشکر شده 0 بار در 0 پست

    پیش فرض

    فکر نکنم با کریستال درست بشه اما من تست میکنم
    کتابخانه آماده برای این کار نیست؟
    از printf ,scanf چطور میشه استفاده کرد؟
    با تشکر

  12. #9
    تازه وارد
    تاریخ عضویت
    Jul 2015
    نوشته ها
    1
    تشکر
    0
    تشکر شده 0 بار در 0 پست

    پیش فرض sgh

    نقل قول نوشته اصلی توسط sadeqebrahimi نمایش پست ها
    فکر نکنم با کریستال درست بشه اما من تست میکنم
    کتابخانه آماده برای این کار نیست؟
    از printf ,scanf چطور میشه استفاده کرد؟
    با تشکر
    سلام
    از دستور زیر برای فرستادن اطلاعات استفاده کن:

    (printf("%s\n",buff

  13. #10
    کاربر فعال mohamad_musav آواتار ها
    تاریخ عضویت
    Aug 2012
    نام
    سید محمد موسوی
    نوشته ها
    189
    تشکر
    61
    تشکر شده 39 بار در 29 پست

    New

    سلام دوستان
    من یه برنامه ای نوشتم و تو محیط شبیه سازی اطلاعاتی رو که میکرو باید ارسال کنه رو با VSM Virtual Terminal پروتئوس که چک میکنم داده ها دسته ولی بعد از ای سی max232 رو که چک میکنم با همین VSM Virtual Terminal یسری کارکترایی نشون میده که اصلا مشخص نیست چیه!
    سخت افزاری هم تست کردم پورت کام رو به کامپیوتر وصل کردم و ارسال دیتا رو میزنم یسری حروف یا کارکترایی نشون میده که اطلاعاتی که گفتم میکرو بفرسته و نشون بده نیستن.
    ممنون میشم یکی راهنماییم کنه باید چکار کنم.

    1.jpg
    ویرایش توسط mohamad_musav : 04-07-2017 در ساعت 14:19

  14. #11
    کاربر فعال mohamad_musav آواتار ها
    تاریخ عضویت
    Aug 2012
    نام
    سید محمد موسوی
    نوشته ها
    189
    تشکر
    61
    تشکر شده 39 بار در 29 پست

    پیش فرض

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


    بعداز آی.سی max232 ولتاژ سیگنال ها دیگه 0 و 5 ولت نیست. بلکه منطق RS232 داره. در سمت کامپیوتر اگه پورت سریال واقعی دارید که نباید مشکلی باشه اگه پورت سریال واقعی ندارید و از مبدل USB و RS232 استفاده کردید معمولا این مبدل ها با سطح ttl کار می کنن و اصلا نیازی به max232 نیست.
    سلام مهندس
    من به پورت واقعی کامپوتر وصل میکنم و با برنامه Serial Port Monitor وقتی شروع به دریافت میکنه اصلا اون چیزی که باید رو نشون نمیده!
    میشه راهنماییم کنید این مشکلو رفع کنم؟
    ممنونم که وقت گذاشتی و جواب دادی
    ویرایش توسط mohamad_musav : 08-07-2017 در ساعت 12:06

  15. #12
    مدیر کل انجمن ها morteza_rk آواتار ها
    تاریخ عضویت
    Apr 2009
    نام
    مرتضی رحیمی کردمحله
    نوشته ها
    2,071
    تشکر
    2,376
    تشکر شده 2,899 بار در 1,263 پست

    پیش فرض

    بعداز آی.سی max232 ولتاژ سیگنال ها دیگه 0 و 5 ولت نیست. بلکه منطق RS232 داره. در سمت کامپیوتر اگه پورت سریال واقعی دارید که نباید مشکلی باشه اگه پورت سریال واقعی ندارید و از مبدل USB و RS232 استفاده کردید معمولا این مبدل ها با سطح ttl کار می کنن و اصلا نیازی به max232 نیست.
    .
    اَللّهُمَ صَلّ عَلی مُحَمَّد وَ آلِ مُحَمَّد وَ عَجّل الفَرَجَهُم


    وبلاگ شخصی من

  16. تشکرها از این نوشته :


  17. #13
    کاربر فعال mohamad_musav آواتار ها
    تاریخ عضویت
    Aug 2012
    نام
    سید محمد موسوی
    نوشته ها
    189
    تشکر
    61
    تشکر شده 39 بار در 29 پست

    پیش فرض

    بعداز آی.سی max232 ولتاژ سیگنال ها دیگه 0 و 5 ولت نیست. بلکه منطق rs232 داره
    سلام مهندس
    درسته دیگه 0 تا 5 نیست.
    در سمت کامپیوتر اگه پورت سریال واقعی دارید که نباید مشکلی باشه
    نمیدونم والا. منم از پورت اصلی کامپیوتر استفاده میکنم. از مبدل usb استفاده نکردم. این مشکلم حتی توی شبیه سازم هست.
    عکسشو میذارم ببینید!
    c9q2_1.jpg

    smdr_2.jpg
    ویرایش توسط mohamad_musav : 09-07-2017 در ساعت 01:45

  18. #14
    کاربر فعال mohamad_musav آواتار ها
    تاریخ عضویت
    Aug 2012
    نام
    سید محمد موسوی
    نوشته ها
    189
    تشکر
    61
    تشکر شده 39 بار در 29 پست

    پیش فرض

    برای ارسال داده با پورت سریال و به ایسی مکس 232 فرمت خاصی باید داشته باشه؟

  19. #15
    کاربر فعال mohamad_musav آواتار ها
    تاریخ عضویت
    Aug 2012
    نام
    سید محمد موسوی
    نوشته ها
    189
    تشکر
    61
    تشکر شده 39 بار در 29 پست

    پیش فرض

    مرسی از همه که اینقدر توجه دارید و راهنمایی میکنید.

موضوعات مشابه

  1. مشکل عجیب در usart
    توسط Niloufar.Male در انجمن AT91 series (ATMEL)
    پاسخ: 1
    آخرين نوشته: 19-11-2013, 00:21
  2. پاسخ: 2
    آخرين نوشته: 25-10-2013, 01:45
  3. کمک در مورد usart
    توسط mahdi_6739 در انجمن AVR
    پاسخ: 3
    آخرين نوشته: 01-10-2012, 11:06
  4. مدباس و usart
    توسط ali_73909 در انجمن میکروکنترلرهای 8و16 بیتی
    پاسخ: 0
    آخرين نوشته: 23-08-2012, 05:22
  5. مشکل با usart
    توسط mahanb در انجمن AT91 series (ATMEL)
    پاسخ: 11
    آخرين نوشته: 22-09-2011, 23:06

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •