اطلاعیه

Collapse
No announcement yet.

فعال سازی اینتراپت سریال برای خواندن دیتا

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

    فعال سازی اینتراپت سریال برای خواندن دیتا

    دوستان برای فعال سازی اینتراپت و زیر روال سریال 1768 از همین کد باید استفاده کرد یا میشه راحت تر به نتیجه رسید.کسی رو این قسمت کار کرده و از این کد استفاده کرده؟میخوام به سیم 900 وصل کنم .کسی کار کرده یکم توضیح بده.
    کد:
    void UART0_IRQHandler (void) 
    {
     uint8_t IIRValue, LSRValue;
     uint8_t Dummy = Dummy;
        
     IIRValue = LPC_UART0->IIR;
      
     IIRValue >>= 1;            /* skip pending bit in IIR */
     IIRValue &= 0x07;            /* check bit 1~3, interrupt identification */
     if ( IIRValue == IIR_RLS )        /* Receive Line Status */
     {
        LSRValue = LPC_UART0->LSR;
        /* Receive Line Status */
        if ( LSRValue & (LSR_OE|LSR_PE|LSR_FE|LSR_RXFE|LSR_BI) )
        {
         /* There are errors or break interrupt */
         /* Read LSR will clear the interrupt */
         UART0Status = LSRValue;
         Dummy = LPC_UART0->RBR;        /* Dummy read on RX to clear 
                                interrupt, then bail out */
         return;
        }
        if ( LSRValue & LSR_RDR )    /* Receive Data Ready */            
        {
         /* If no error on RLS, normal ready, save into the data buffer. */
         /* Note: read RBR will clear the interrupt */
         UART0Buffer[UART0Count] = LPC_UART0->RBR;
         UART0Count++;
         if ( UART0Count == BUFSIZE )
         {
            UART0Count = 0;        /* buffer overflow */
         }    
        }
     }
     else if ( IIRValue == IIR_RDA )    /* Receive Data Available */
     {
        /* Receive Data Available */
        UART0Buffer[UART0Count] = LPC_UART0->RBR;
        UART0Count++;
        if ( UART0Count == BUFSIZE )
        {
         UART0Count = 0;        /* buffer overflow */
        }
     }
     else if ( IIRValue == IIR_CTI )    /* Character timeout indicator */
     {
        /* Character Time-out indicator */
        UART0Status |= 0x100;        /* Bit 9 as the CTI error */
     }
     else if ( IIRValue == IIR_THRE )    /* THRE, transmit holding register empty */
     {
        /* THRE interrupt */
        LSRValue = LPC_UART0->LSR;        /* Check status in the LSR to see if
                                        valid data in U0THR or not */
        if ( LSRValue & LSR_THRE )
        {
         UART0TxEmpty = 1;
        }
        else
        {
         UART0TxEmpty = 0;
        }
     }
      
    }

    #2
    پاسخ : فعال سازی اینتراپت سریال برای خواندن دیتا

    این که فقط زیر روال وقفه هست!
    کدوم قسمتشو مشکل داری.
    همشو که نمیشه توضیح داد
    اگه با کلیات آشنایی و فقط با اینتراپت مشکل داری با این تنضیمات میتونی اینتراپت رو در حالت دریافت فعال کنی
    کد:
    LPC_UART0->IER = 0x01;     
    NVIC_SetPriority(UART0_IRQn,0); 
    NVIC_EnableIRQ(UART0_IRQn);
    تولید کننده انواع تابلو فرمان آسانسور با تکنولوژی روز دنیا

    دیدگاه


      #3
      پاسخ : فعال سازی اینتراپت سریال برای خواندن دیتا

      درست زیر روال وقفه رو لازم دارم.جور ساده تر هم میشه نوشتش

      دیدگاه


        #4
        پاسخ : فعال سازی اینتراپت سریال برای خواندن دیتا

        والا رجیستر IIR برای تشخیص نوع اینتراپت هست
        که اومده بر اساس اون تصمیم گیری کرده
        این تیکه از دیتا شیت مربوط به این رجیستر هست
        کد:
        Interrupt identification. UnIER[3:1] identifies an interrupt corresponding to the 
        UARTn Rx or TX FIFO. All other combinations of UnIER[3:1] not listed below 
        are reserved (000,100,101,111).
        0
        011 1 - Receive Line Status (RLS).
        010 2a - Receive Data Available (RDA).
        110 2b - Character Time-out Indicator (CTI).
        001 3 - THRE Interrupt
        که من فقط با مورد دومش کار کردم
        elseif آخر که مربوط به مورد آخر میشه رو دقیق نمیدونم چیه
        اما توی کامنت های برنامه توضیح مختصری داده که :
        کد:
        /* THRE, transmit holding register empty */
        تولید کننده انواع تابلو فرمان آسانسور با تکنولوژی روز دنیا

        دیدگاه


          #5
          پاسخ : فعال سازی اینتراپت سریال برای خواندن دیتا

          سلام
          این کدی که آوردید از سمپل کیل یه مقدار دشواره فهمیدنش برای شروع
          دو تا وقفه ارسال و دریافت را میشه فعال کرد با رجیسترها. در این سمپل وقفه ارسال هم فعال است اما به نظر من در نهایت برنامه متوقف می ماند تا ارسال انجام شود که این صحیح نیست ...
          فيلم آموزشي ميکروکنترلر LPC1768
          فيلم آموزشي تکميلي و پيشرفته ميکروکنترلر LPC1768
          فيلم آموزش کاربردی زبان سی در میکروکنترلر ARM
          فیلم آموزش مقدماتی میکروکنترلر LPC1788 به زودی ...

          دیدگاه


            #6
            پاسخ : فعال سازی اینتراپت سریال برای خواندن دیتا

            بچه ها یک زیر روال وقفه نوشتن کار سختی نیست فقط نمیدونم چجوری و از کجا شروع کنم.هرچی مینویسم به خاطر فایلهای اد کردنی کلی ارور میگیرم.یک سول اگه کل برنامه رو بخوام تو یک صفحه بنویسم مشه اشکالی داره.چرا از یک نوع متغیرهایی استفاده میشه که دوباره برای اونا باید فایل اد بشه.برای نوشتن یک برنامه که که uart و اینتراپت میخواد فعال بشه چه فایلهایی باید اد بشه.این نوع متغیر ها که با u شرو میشن تو کدوم فایل کتاب خانه ای تعریف شدن.type?.ولی اد کردم بازم متغیرها با این نامها رو نمیشناسه.
            نمیشه همون جور که برای ای وی ار مینوشتیم برای اینم بنویسیم.بخدا رجستراش خیلی ساده تر از avr هست و قابل فهم تر ولی این دنگو فنگاش برنامه نویسی رو سخت کرده.هرروز میگم خیلی ساده الان برنامش رو مینویسم ولی تا کیل رو باز میکنم میمونم باید چکار کنم.یکی بیاد روند برنامه نویسی رو توضیح بده.
            زیر روال وقنه ای که کد ویزن درست میکنه خیلی مثل همین سمپل کد هست ولی به صورت خلاصه

            اضافه شده در تاریخ :
            سلام.نونستم بعد از کلی تلاش این برنامه رو بنویسم ولی یبار کار میکنه یبار کار نمیکنه.اگه میشه دیباگ کنید ببینید مشکل چیه.من دیباگ میکنم میاد تو فایل سیتم رو
            کد:
             while ((LPC_SC->SCS & (1<<6)) == 0);/* Wait for Oscillator to be ready  *
            یا
            کد:
             while (!(LPC_SC->PLL0STAT & (1<<26)));/* Wait for PLOCK0          */
            یا تابع send bait گیر میکنه.بعضی وقتها هم کار میکنه.البته زمانی که هنگام دیباک فرکانس رو تغییر میدم.
            سوال دیگه اینه که نمیشه از توابع stdio , string تو کیل استفاده کرد؟مثلا میشه نوشت printf

            کد:
            #include <LPC17xx.h>
            #include <string.h>
            int j,i;
            void UARTInit( uint32_t SystemFrequency, uint32_t baudrate );
            int UART0_SendByte (int ucData);
            int UART0_GetChar (void); 
            void UART0_SendString (unsigned char *s); 
            /******************************************************************************
                     UART0 Interrupt service function
            ******************************************************************************/
            void UART0_IRQHandler(void) {
            /* write code here */
            
            			LPC_GPIO2->FIOSET = 3<<4 ;
            			for(j=0;j<40000;j++);
            			LPC_GPIO2->FIOCLR = 3<<4 ;
            		 for(j=0;j<40000;j++);
            
            }
            /*******************************************************************************/
            
            int main(){
            	SystemInit ();
             LPC_GPIO2->FIODIR1 = 0x00 ;
            	LPC_GPIO2->FIODIR0 = 0xFF ;
            	LPC_GPIO2->FIOCLR0 = 0xFF ;  
             UARTInit(100e6,115200 );  
             while(1){
            	
            	 printf("arvin 2009\r\n");
            		UART0_SendString("http://www.DIDBANSANAT.COM\r\n");
            		for(j=0;j<40000000;j++);	
             }
              
             
             
              
            
            }
            /***********************************************************************************/
            void UARTInit( uint32_t SystemFrequency, uint32_t baudrate )
            {
             uint32_t Fdiv;
             uint32_t pclkdiv, pclk;
             
              LPC_SC->PCONP |= (0x1<<3);
              LPC_PINCON->PINSEL0 &= ~0x000000F0;
              LPC_PINCON->PINSEL0 |= 0x00000050; /* RxD0 is P0.3 and TxD0 is P0.2 */
              /* By default, the PCLKSELx value is zero, thus, the PCLK for
                all the peripherals is 1/4 of the SystemFrequency. */
                /* Bit 6~7 is for UART0 */
                pclkdiv = (LPC_SC->PCLKSEL0 >> 6) & 0x03;
                switch ( pclkdiv )
                {
                 case 0x00:
                 default:
                    pclk = SystemFrequency/4;
                    break;
                 case 0x01:
                    pclk = SystemFrequency;
                    break; 
                 case 0x02:
                    pclk = SystemFrequency/2;
                    break; 
                 case 0x03:
                    pclk = SystemFrequency/8;
                    break;
                }
            
              LPC_UART0->LCR = 0x83;        /* 8 bits, no Parity, 1 Stop bit */
              Fdiv = ( pclk / 16 ) / baudrate ;    /*baud rate */
              LPC_UART0->DLM = Fdiv / 256;                            
              LPC_UART0->DLL = Fdiv % 256;
              LPC_UART0->LCR = 0x03;        /* DLAB = 0 */
              LPC_UART0->FCR = 0x07|(0x2<<6);        /* Enable and reset TX and RX FIFO. */
            		NVIC_SetPriority(UART0_IRQn,0);     /* Default priority group 0, can be 0(highest) - 31(lowest) */
              NVIC_EnableIRQ(UART0_IRQn);
            
            
              LPC_UART0->IER = 0x01;    /* Enable UART0 interrupt */
             
            }
            
            /********************************************************************************************************/
            int UART0_SendByte (int ucData)
            {
            	while (!(LPC_UART0->LSR & 0x20));
              return (LPC_UART0->THR = ucData);
            }
            
            /*----------------------------------------------------------------------------
             Read character from Serial Port  (blocking read)
             *----------------------------------------------------------------------------*/
            int UART0_GetChar (void) 
            {
             	while (!(LPC_UART0->LSR & 0x01));
             	return (LPC_UART0->RBR);
            }
            
            /*********************************************************************************************************/
            void UART0_SendString (unsigned char *s) 
            {
             	while (*s != 0) 
            	{
              		UART0_SendByte(*s++);
            	}
            }
            /***********************/

            اضافه شده در تاریخ :
            کسی نمیاد جواب منو بده چرا برانه کار نمیکنه .
            سوال دوم از pritf میشه استفاده کرد .اگه نه چرا

            اضافه شده در تاریخ :
            قبلی هارو که کسی جواب نداد خودم فهمیدم برای دستور printf بود که کار نمیکرد.حالا چرا این دستور رو اجرا نمیکنه نمیدونم.
            حالا این سوالم رو جواب بدید لطفا بالا برنامه توی ایترابت گیر میکنه.توی زیر روال کدام رجستر رو باید مقدار بدم که بیاد بیرون؟ :cry2:

            دیدگاه

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