اطلاعیه

Collapse
No announcement yet.

عملکرد PMC_PCER

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

    #16
    پاسخ : عملکرد PMC_PCER

    نوشته اصلی توسط حامد پور آزاد
    آها. خوب مهندس سوئیچ برای وصل کردن دو نقطه به هم دیگست دیگه. مثلاً شما می خوای یه ولتاژ رو به یه نقطه وصل کنی، یه سرش به ولتاژ وصل میشه و یه سر دیگش به اون نقطه ای که می خوای ولتاژ بهش وصل بشه.

    شما دقیق بگو می خوای چیکار کنی تا راهنمائیت کنم.

    ممنون میشم اگه این مشکل منو حل کنین .
    من یه مداری دارم که از پایه 4 تا 11 ال ای دی وصل کردم و از پایه 12 تا 20 هم همین کلید ها .(به قول شما سوئیچ)
    پایه 0 برای Receive و پایه 1 برای Transmit هست . می خوام هر چی از پورت سریال ورودی اومد تو ال ای دی ها نشون بدم و با کلید ها هم به پورت سریال اطلاعات بفرستم .
    حالا من برا اینکه این مدارو تست کنم پایه 0 و 1 رو به هم وصل کردم (یعنی Receive و Transmit ) . ولی مدارم کار نمی کنه .
    این هم کد بنده هست . اگه مشکلی تو کد هست بفرمایید :

    کد:
    #include <at91sam7s64.h>
    
    int main()
    {
    	*AT91C_PIOA_PER = 0x1FFFF0;
    	*AT91C_PIOA_OER = 0xFF0;
    	*AT91C_PMC_PCER = 1 << 6 | 1 << 2;
    	*AT91C_PIOA_PDR = 0x3;
    	*AT91C_PIOA_ASR = 0x3;
    	*AT91C_US0_CR = AT91C_US_RSTRX | AT91C_US_RSTTX | AT91C_US_RXDIS | AT91C_US_TXDIS;
    	*AT91C_US0_MR = 0x808D0;
    	*AT91C_US0_BRGR = 0x139;
    	while( 1 )
    	{
    		int a;
    		if( *AT91C_US0_CSR & 1 )
    		{
    			*AT91C_US0_CR = AT91C_US_RXEN;
    			a = *AT91C_US0_RHR;
    			*AT91C_PIOA_CODR = 0xFF0;
    			*AT91C_PIOA_CODR = a << 4;
    		}
    		*AT91C_US0_CR = AT91C_US_RXDIS;
    		if( *AT91C_US0_CSR & 2 )
    		{
    			*AT91C_US0_CR = AT91C_US_TXEN;
    			while( *AT91C_PIOA_PDSR & (1 << 20) );
    			a = (~*AT91C_PIOA_PDSR) & (0xFF000);
    			*AT91C_US0_THR = a >> 12;		
    		}
    		*AT91C_US0_CR = AT91C_US_TXDIS;
    	}
    }

    دیدگاه


      #17
      پاسخ : عملکرد PMC_PCER

      سلام
      چندتا اشکال وجود دارد اینا تصحیح کن تا نتیجه رو ببینید چی می شود.
      1. اصلا PA0,PA1 در سری 7S برای واحد USART0 نیست و باید از پایه های PA6,PA7 استفاده کنید.
      2. برای تست برنامه نیازی نیست با یک سیم RX را به TX وصل کنید شما می توانید از مد حلقه بسته داخلی واحد USART استفاده کنید و اگر برنامه درست جواب داد بعد در مد معمولی استفاده کنید.
      3. قبل از while شما باید فرستنده و گیرنده را فعال کنید. وقتی گیرنده غیر فعال است دیتایی دریافت نمی کند و بیت RXRDY رجیستر US_CSR اصلا 1 نمی شود و این چند خط از برنامه اصلا اجرا نمی شود.
      کد:
       if( *AT91C_US0_CSR & 1 )
         {
           *AT91C_US0_CR = AT91C_US_RXEN;
           a = *AT91C_US0_RHR;
           *AT91C_PIOA_CODR = 0xFF0;
           *AT91C_PIOA_CODR = a << 4;
         }
      در ضمن در خط آخر همین if باید از رجیستر PIOA_SODR استفاده کنید.
      و ....

      دیدگاه


        #18
        پاسخ : عملکرد PMC_PCER

        نوشته اصلی توسط حامد AT91
        سلام
        چندتا اشکال وجود دارد اینا تصحیح کن تا نتیجه رو ببینید چی می شود.
        1. اصلا PA0,PA1 در سری 7S برای واحد USART0 نیست و باید از پایه های PA6,PA7 استفاده کنید.
        2. برای تست برنامه نیازی نیست با یک سیم RX را به TX وصل کنید شما می توانید از مد حلقه بسته داخلی واحد USART استفاده کنید و اگر برنامه درست جواب داد بعد در مد معمولی استفاده کنید.
        3. قبل از while شما باید فرستنده و گیرنده را فعال کنید. وقتی گیرنده غیر فعال است دیتایی دریافت نمی کند و بیت RXRDY رجیستر US_CSR اصلا 1 نمی شود و این چند خط از برنامه اصلا اجرا نمی شود.
        کد:
         if( *AT91C_US0_CSR & 1 )
           {
             *AT91C_US0_CR = AT91C_US_RXEN;
             a = *AT91C_US0_RHR;
             *AT91C_PIOA_CODR = 0xFF0;
             *AT91C_PIOA_CODR = a << 4;
           }
        در ضمن در خط آخر همین if باید از رجیستر PIOA_SODR استفاده کنید.
        و ....
        خیلی ممنون از توجهتون .
        این کارهارو انجام دادم ولی بازم مدار کار نمی کنه .
        تو keil که دیباگ می کنم اصلا هیچ وقت وارد if اولی که همون receive هست نمیشه .
        این هم کد تغییریافته :

        کد:
        #include <at91sam7s64.h>
        
        int main()
        {
        	*AT91C_PIOA_PER = 0x2FFFF00;
        	*AT91C_PIOA_OER = 0xFF00;
        	*AT91C_PMC_PCER = 1 << 6 | 1 << 2;
        	*AT91C_PIOA_PDR = (1 << 6) | (1 << 7);
        	*AT91C_PIOA_ASR = (1 << 6) | (1 << 7);
        	*AT91C_US0_CR = (1 << 2) | (1 << 3) | (1 << 5) | (1 << 7);
        	*AT91C_US0_MR = 0x808D0;
        	*AT91C_US0_BRGR = 0x139;
        	while( 1 )
        	{
        		int a;
        		*AT91C_US0_CR = (1 << 4);
        		if( *AT91C_US0_CSR & 1 )
        		{
        			a = *AT91C_US0_RHR;
        			*AT91C_PIOA_CODR = 0xFF00;
        			*AT91C_PIOA_SODR = a << 8;
        		}
        		*AT91C_US0_CR = (1 << 5);
        		*AT91C_US0_CR = (1 << 6);
        		if( *AT91C_US0_CSR & 2 )
        		{
        			while( *AT91C_PIOA_PDSR & (1 << 25) );
        			a = (~*AT91C_PIOA_PDSR) & (0xFF0000);
        			*AT91C_US0_THR = a >> 16;		
        		}
        		*AT91C_US0_CR = (1 << 7);
        	}
        }

        دیدگاه


          #19
          پاسخ : عملکرد PMC_PCER

          سلام
          پایه های USART0 در سری 7S پایه های PA5,PA6 هست که من در بالا اشتباهی زده بودم PA6,PA7. البته پایه های PA7,PA8 برای مد handshaking واحد USART0 می باشد که در اینجا با آنها کاری نداریم.
          باز در برنامه ات چندتا اشکال هست برنامه زیر رو ببین الان نوشتم و باید درست کار کند. فایل باینری را هم پیوست کردم این فایل رو بریز رو میکروت و تو عمل تست کن ببین درست جواب می دهد یا نه. این برنامه را من با IAR نوشتم اما اگر می خواهید با KEIL آنرا کامپایل کنید به نظرم فقط کافی است شما در بالای برنامه به جای ioat91sam7s64.h فایل at91sam7s64.h را include نمایید.
          در برنامه زیر رجیستر US_MR=0x880D0 قرار دارد که این حالت واحد USART0 در مد حلقه بسته داخلی پیکربندی شده است یعنی در داخل خود میکرو پایه های RX به TX وصل است و به خارج از میکرو سیگنال نمی دهد و نیازی نیست برای تست برنامه شما با سیم پایه های PA5,PA6 را بهم وصل نمایید اگر خواستید بعدا آنرا به یک میکرو دیگر یا کامپیوتر وصل کنید که نیاز دارد واحد USART0 در مد معمولی پیکربندی شود فقط کافیست رجیستر US_MR=0x800D0 قرار گیرد.

          کد:
          #include <Atmel/ioat91sam7s64.h>
          void main ()
          {
          //--------------------start up--------------------------
          AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; // AT91C_WDTC_WDDIS=(1<<15)
          AT91C_BASE_RSTC->RSTC_RMR=0xA5000001;
          //--------------------speed up--------------------------
          AT91C_BASE_CKGR->CKGR_MOR = 0xF01;
          AT91C_BASE_CKGR->CKGR_PLLR = 0x2903FFC; 
          AT91C_BASE_PMC->PMC_MCKR = 0x3;    
          AT91C_BASE_PMC->PMC_SCER = 0x1;
          //-----------------------------------------------------
          AT91C_BASE_PMC->PMC_PCER = ( 1<<AT91C_ID_PIOA ); // AT91C_ID_PIOA=2 
          AT91C_BASE_PMC->PMC_PCER = (1<<AT91C_ID_US0); // AT91C_ID_US0=6
          //------------------------------------------------------
          int a;
          AT91C_BASE_PIOA->PIO_PER=0x2FFFF00;
          AT91C_BASE_PIOA->PIO_OER=0xFF00;
          AT91C_BASE_PIOA->PIO_CODR=0xFF00;
          AT91C_BASE_PIOA->PIO_ODR=0x2FF0000;
          AT91C_BASE_PIOA->PIO_IFER=0x2FF0000;
          AT91C_BASE_PIOA->PIO_PDR = (1<<5|1<<6);
          AT91C_BASE_PIOA->PIO_MDER = (1<<5|1<<6);
          AT91C_BASE_PIOA->PIO_ASR = (1<<5|1<<6);
          AT91C_BASE_US0->US_CR=0xC;
          AT91C_BASE_US0->US_MR=0x880D0;
          AT91C_BASE_US0->US_BRGR=0x27;
          AT91C_BASE_US0->US_CR=0x50;
          while(1)
          	{
              if ((AT91C_BASE_US0->US_CSR&0x1)==0x1)
               {
               a = AT91C_BASE_US0->US_RHR&0xFF;
               AT91C_BASE_PIOA->PIO_CODR=0xFF00;
               AT91C_BASE_PIOA->PIO_SODR=(a<<8);
               }
              if ((AT91C_BASE_US0->US_CSR&0x2)==0x2)
               {
               a=(AT91C_BASE_PIOA->PIO_PDSR&(1<<25))>>25;
               if (a==1)
                {
                a=(AT91C_BASE_PIOA->PIO_PDSR&0xFF0000)>>16;      
                AT91C_BASE_US0->US_THR=a;
                }
               }
              } 
          }

          در ضمن میکرو روی فرکانس 48M تنظیم شده است و نرخ انتقال 19200و 8 بیت اطلاعات و 1 بیت توقف و بیت توازن زوج می باشد.
          فایل های پیوست شده

          دیدگاه

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