اطلاعیه

Collapse
No announcement yet.

آموزش تغییر پورت printf , scanf در gcc

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

    آموزش تغییر پورت printf , scanf در gcc

    سلام
    آموزش تغییر پورت printf , scanf در gcc
    این PDF را بخونید مشکل داشتید در خدمتم
    http://cld.persiangig.com/download/N...3/stdio.pdf/dl

    کلید واژه ها : scanf - printf - usart1 - پورت - تغییرپورت - سریالprintf - سریالscanf
    موفق باشید
    امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

    #2
    پاسخ : آموزش تغییر پورت printf , scanf در gcc

    با سلام و تشکر فراوان از دوست عزیز جناب اقای صرامی بابت تهیه این مقاله
    و اما بعد:
    دوستانی که از این مقاله استفاده می کنند یک نکته مهم رو باید در نظر بگیرند تا مثل بنده 2 ماه بال بال نرنند و سر کار نباشند . :rolleyes:
    و اما نکته :
    هنگامی که می خواهیم رجیستر UCSRC رو مقدار بدیم( در ATMEGA32 ) حتما باید اولش بیت URSEL رو یک کنیم چون این رجیستر با رجیستر UBRRH از نظر موقعیت حافظه مشابه می باشد و بیت URSEL برای دسترسی به این دو رجیستر در نظر گرفته شده است و اگر این بیت یک نشود شما در واقع به جای UCSRC رجیستر UBRRH رو مقدار می دهید و این یعنی دو ماه سر کار رفتن :angry: :angry: :angry:
    UCSRC|=(1 << URSEL ) |(1<<UCSZ0)|(1<<UCSZ1); برای ATMEGA32
    UCSRC|=(1<<UCSZ0)|(1<<UCSZ1); (استفاده شده در مقاله جناب اقای صرامی برای ATMEGA128)
    من این اشتباه رو انجام دادم و مشکلی که پیش میاد اینه که ارسال و در یافت هر رشته تقریبا 2 ثانیه طول می کشه!!!!!!!! :eek: :eek:
    البته برای ATMEGA128 درسته :redface:

    دیدگاه


      #3
      پاسخ : آموزش تغییر پورت printf , scanf در gcc

      بعد از سه ماه کلنجار رفتن با hmr , hmt و usart مشکلم بالا خره حل شد و نکات مهمی رو خدمت دوستان یاداور می شم تا شما در استفاده از این دو ماژول دجار مشکل نشین
      و اما بعد:
      1-در هنگام ارسال مداوم رشته حتما و حتما بین هر ارسال 100 میلی ثانیه تاخیر بزارین تا در گیرنده دچار ایراد های عجیب و غریب نشین . من رشته "moh" رو بدون تاخیر و توی لوپ برنامه ارسال می کردم اما در گیرنده ناگهان بعد از چند در یافت صحیح میکرو قاطی می کرد و رشته های عجیب غریب در یافت می کرد باریست کردن در گیرنده و یا فرستنده گاهی مشکل حل می شد و گاهی خیر . کلا قاطی بود و از هیج قانونی تبیعیت نمی کرد شاید دلیلش .......نمی دونم چرا دروغ بگم :redface:
      اما وقتی بین ارسالها از یه تاخیر 100 میلی ثانیه ای استفاده کردم مشکل برطرف شد و دیگه از اطلاعات عجیب و قریب خبری نبود :applause:
      2_ اگه در فرستنده مثلا یک رشته 3 کاراکتری ارسال می کنید و قصد دارید در گیرنده با رسیدن این 3 کاراکتر عملی رو انجام بدید حتما به جای 3 کاراکتر حداقل 7 کاراکتر رو دریافت کنید و سپس توی اون 7 کاراکتر بدنبال 3 کاراکتر خودتون بگردین
      دلیلش اینه که مثلا اگه شما رشته "moh" رو 10 بار ارسال می کنید و توی گیرنده منتظر رسیدن این 3 کاراکتر هستید ممکنه یک با "moh" و یک بار "ohm" و یک بار دیگه "hmo" رو در یافت بکنین :eek: در واقع شیفت پیدا کرده رشته رو . برای رفع مشکل بجای 3 کاراکتر 7 کاراکتر رو در یافت می کنید که حتما شامل رشته شما هست که با جستجو در این رشته می تونید رشته خودتون رو پیدا کنیین :wow:
      مثلا: "ohmohmo" و یا "hmohmoh"
      کد:
       fgets(str1,8,&MyIO);
      		for(j=0;j<=5;j++)
      		{
      			if((str1[j]=='m')&(str1[j+1]=='o')&(str1[j+2]=='h'))
      			{
      				do thing
      				break;
      			}
      		}
      و در ارسال:

      [
      کد:
       for(i=1;i<=5;i
      		 {
      			 fputs("moh",&MyIO);
      			 _delay_ms(100); 
      		 }
      3_ از تغذیه مدار هم مطمئن باشین من از باطری کتابی 9 ولت با رگولاتور 5 ولت استفاده کردم
      4_ در پست قبلی هم در مورد مقدار دادن صحیح UCSRC با ATMEGA32 هم توضیح دادم که باید دقت بکنین

      دیدگاه


        #4
        پاسخ : آموزش تغییر پورت printf , scanf در gcc

        چیپ Atmega128 هست


        موفق باشید
        امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

        دیدگاه


          #5
          پاسخ : آموزش تغییر پورت printf , scanf در gcc

          خیلی جالبه نکته بسیار کنکوریه :applause: کاملا درسته برای میکروی شما ولی من از ATMEGA32 استفاده کردم که ادرس دو رجیستر یکیه و ایجوری بود که من سرکار رفتم
          باشد درس عبرتی برای دوستان تا بدونن که دیتاشیت برای قشنگی نیست برای خوندنه

          دیدگاه


            #6
            پاسخ : آموزش تغییر پورت printf , scanf در gcc

            سلام

            بهتر نیست خودمون این تابع را بنویسیم و استفاده کنیم .
            کد:
            void usartSend(const char val)
            {
            	UDR1 = val;
            	while(!(UCSR1A & (1<<TXC)));
            	UCSR1A|=(1<<TXC);
            }
            باد می وزد ...
            میتوانی در مقابلش هم دیوار بسازی ، هم آسیاب بادی
            تصمیم با تو است ...

            دیدگاه


              #7
              پاسخ : آموزش تغییر پورت printf , scanf در gcc

              نوشته اصلی توسط ATROBOT
              سلام
              بهتر نیست خودمون این تابع را بنویسیم و استفاده کنیم .
              کد:
              void usartSend(const char val)
              {
              	UDR1 = val;
              	while(!(UCSR1A & (1<<TXC)));
              	UCSR1A|=(1<<TXC);
              }
              این چه ربطی به printf داره
              منظورتون چیه ؟
              امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

              دیدگاه

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