اطلاعیه

Collapse
No announcement yet.

مشکل در UART

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

    مشکل در UART

    با سلام و خسته نباشید خدمت دوستان عزیز.من میخوام مقدار یه متغییر INT رو با UART بفرستم ولی نمیتونم.امکانش هست راهنمایی بفرمایید چطور میتونم مقدار این متغییر مستقیم ارسال و دریافت کنم.
    با تشکر
    حرف زدن کافي نيست بايد عمل کرد.دانستن کافي نيست بايد به کار گرفت

    #2
    پاسخ : مشکل در UART

    نوشته اصلی توسط rroozisia نمایش پست ها
    با سلام و خسته نباشید خدمت دوستان عزیز.من میخوام مقدار یه متغییر INT رو با UART بفرستم ولی نمیتونم.امکانش هست راهنمایی بفرمایید چطور میتونم مقدار این متغییر مستقیم ارسال و دریافت کنم.
    با تشکر
    اگر منظورتون اینه که 32 بیت رو می خواهید بفرستید تو پک های 8 بیتی
    خب باید 8 بیت 8 بیت جدا کنید و بفرستید
    به روش های مختلفی میشه اینکار رو کرد اول بفرمایید ببینم تا منظورتون رو درست متوجه شدم یا نه
    اللهم صل علی محمد و ال محمد و عجل فرجهم
    پیامبر اکرم(ص):زکات علم نشر آن است.
    در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

    دیدگاه


      #3
      پاسخ : مشکل در UART

      امکان ارسال تو یه پک واحد نداریم درسته؟چون سریال 8 بیتی هستش.
      چطور میتونم توی 4 تا پک بفرستم؟و اینکه اگه متغیرم از نوع shortint باشه چور میشه؟
      باتشکر
      حرف زدن کافي نيست بايد عمل کرد.دانستن کافي نيست بايد به کار گرفت

      دیدگاه


        #4
        پاسخ : مشکل در UART

        نوشته اصلی توسط rroozisia نمایش پست ها
        امکان ارسال تو یه پک واحد نداریم درسته؟چون سریال 8 بیتی هستش.
        چطور میتونم توی 4 تا پک بفرستم؟و اینکه اگه متغیرم از نوع shortint باشه چور میشه؟
        باتشکر
        خب اصلا ما کاری نداریم متغیرتون چیه یا 16 بیتی هست یا 32 بیتی یا ...
        و شما نیاز دارید که به صورت 8 بیت ارسال کنید
        باید از روش شیفت دادن استفاده کنید
        چه طوری
        اون متغیر مثلا 16 بیتی تون رو یک بار 8 بیت کم ارزشش رو داخل یک متغیر 8 بیتی می ریزید و ارسال می کنید
        بعد میایید 8 بار به راست شیفت میدید و الباقی را درون متغیر 8 بیتی تون می ریزید و ارسال می کنید
        short a=0xabcd;
        char b;

        b=a&0x00ff;////cd
        uart_transmit(b);//cd ersal mishe
        b=(a>>8)&0x00ff;
        uart_transmit(b);//ab ersal mishe
        اللهم صل علی محمد و ال محمد و عجل فرجهم
        پیامبر اکرم(ص):زکات علم نشر آن است.
        در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

        دیدگاه


          #5
          پاسخ : مشکل در UART

          با تشکر.دستور این کار برای کتابخونه hal چطور هستش؟
          حرف زدن کافي نيست بايد عمل کرد.دانستن کافي نيست بايد به کار گرفت

          دیدگاه


            #6
            پاسخ : مشکل در UART

            سلام به همه
            متاسفانه توابع hal برای usart بسیار دستوپاگیرن . شما این تابعی که نوشتین با رجیستر ها نوشتین درسته ؟ میشه با توابع hal هم راهنمایی کنین ؟

            دیدگاه


              #7
              پاسخ : مشکل در UART

              سلام دوستان
              اگر میخوایید کار با توابع HAL برای واحد UART (البته در keil؛ بقیه IDE ها رو امتحان نکردم) کمی ساده تر بشه، کافیه این قطعه کد رو بالای تابع main به پروژه ی خودتون اضافه کنید:
              #ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) 
              #else
              #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
              #endif /* __GNUC__ */
              PUTCHAR_PROTOTYPE {
              HAL_UART_Transmit (&huart3, (uint8_t *)&ch, 1, 0xFFFF);
              return ch;
              }

              کافیه struct مناسب (که در اینجا huart3 هستش) رو بهش بدید و در برنامه خودتون بجای HAL_UART_Transmit از تابع printf استفاده کنید که مشابه همون تابع در برنامه های ویندوزی عمل میکنه و دیگه احتیاجی به استفاده از توابعی مثل sprintf نیست.

              دیدگاه


                #8
                پاسخ : مشکل در UART

                عرض سلام و احترام خدمت دوستان و اساتید عزیز. بنده یک میکروی STM32F030K6T6 دارم که میخوام با توابع LL یه کاراکتری رو توسط UART ارسال کنم. از مبدل USB2TTL CH340 هم استفاده میکنم. تمامی تنظیمات رو مکررا چک کردم ولی متاسفانه در برنامه ترمینال هیچ کاراکتری دریافت نمیکنم. کد نوشته شده رو در ادامه قرار میدم. ممنون میشم اگر از دوستان کسی بتونه مشکل این برنامه رو حل بکنه.

                void uart_UART1_GPIO_config(void)
                {
                //PA2-->TX , PA3-->RX
                //Enable PortA Clock
                RCC->AHBENR |= (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOFEN);//(1UL<<17);
                //Mode to AF(UART1)
                //map PA2,PA3 mapped to UART1
                GPIOA->AFR[0] |= (0x01UL<<GPIO_AFRL_AFSEL2_Pos); //Alternate function 1 for PA2
                GPIOA->AFR[0] |= (0x01UL<<GPIO_AFRL_AFSEL3_Pos);
                // GPIOA->MODER &= ~(GPIO_MODER_MODER2 | GPIO_MODER_MODER3); // clearing PA2 Mode bits
                GPIOA->MODER &= ~(GPIO_MODER_MODER2 | GPIO_MODER_MODER3); // clearing PA2 and PA3 Mode bits
                GPIOA->MODER |= (GPIO_MODER_MODER2_1 | GPIO_MODER_MODER3_1); //putting PA2 and PA3 in Alternate function mode
                // GPIOA->MODER |= (GPIO_MODER_MODER2_1); //putting PA2 in Alternate function mode
                // GPIOA->MODER &= ~(GPIO_MODER_MODER3);// clearing PA3 Mode bits and at the same time setting it as input
                //Output max medium speed
                GPIOA->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR2 | GPIO_OSPEEDR_OSPEEDR3); //clear the PA2 Output speed bit fields
                GPIOA->OSPEEDR |= (GPIO_OSPEEDR_OSPEEDR2_1 | GPIO_OSPEEDR_OSPEEDR3_1); //Set the PA2 Output speed as medium speed
                //GPIO Output type register
                GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_2 | GPIO_OTYPER_OT_3);
                //Enable pull up resistors in PA2 and PA3
                GPIOA->PUPDR |= (GPIO_PUPDR_PUPDR2_0 | GPIO_PUPDR_PUPDR3_0);
                // GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_2);




                }


                /**
                * @brief UART1 Peripheral Configuration
                */
                void uart_UART1_config(void)
                {
                //Enable UART1 Clock
                RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
                //clear the UART1 control register
                USART1->CR1 &= ~(USART_CR1_UE); // disable UART1 for configuring
                //Set Parity to Even
                USART1->CR1 &= ~(USART_CR1_PS);
                //Parity control Enable
                USART1->CR1 |= USART_CR1_PCE;
                //Set word length to 8-bits
                // USART1->CR1 &= ~(0x3UL << 28); // Setting M1 to zero
                USART1->CR1 &= ~(USART_CR1_M ); // Setting M1 to zero
                //Set Stop bits to 1
                USART1->CR2 &= ~(USART_CR2_STOP);
                //Disable HW flow control
                USART1->CR3 &= ~(USART_CR3_CTSE);
                USART1->CR3 &= ~(USART_CR3_RTSE);
                //Set the baud rate to 115200
                // USART1->CR1 |= USART_CR1_OVER8; // Enable over-sampling mode for getting better accuracy in baud rate
                USART1->CR1 &= ~(USART_CR1_OVER8); // 16 Oversampling
                // USART1->BRR = 0; // Reset BRR first
                // USART1->BRR = 0x340; // 0x1A0UL 115200 with over8=1
                // USART1->BRR = 0x1388; // 9600 BD
                USART1->BRR = 0x1A1; // 0x1A1UL 115200 with over16=1
                //Clear some Flags and enable some others
                // USART1->CR2 &= ~(USART_CR2_CLKEN);
                // //Clear SCEN, HDSEL and IREN in CR3
                // USART1->CR3 &= ~(USART_CR3_HDSEL);


                //Enable USART
                USART1->CR1 |= (USART_CR1_UE | USART_CR1_TE | USART_CR1_RE);
                }


                /**
                * @brief UART1 Transmit
                */
                bool uart_UART1_transmit(uint8_t *data , uint8_t len , uint32_t timeout)
                {
                //wait on TXE to start transmit data
                //Write to TDR register while TXE is high
                uint8_t dataIdx=0;
                uint32_t startTick=rcc_msGetTicks();
                while(dataIdx<len)
                {
                if((USART1->ISR & USART_ISR_TXE)) //TX Buffer is empty
                {
                USART1->TDR = data[dataIdx];
                dataIdx++;
                }
                else // Manage Timout
                {
                if((rcc_msGetTicks()-startTick)>=timeout) return false;
                }
                }
                //wait for busy flag
                while((USART1->ISR & USART_ISR_TC))
                {
                if((rcc_msGetTicks()-startTick)>=timeout) return false;
                }
                return true;


                }
                جدیدترین ویرایش توسط mo.glmdi; ۱۳:۴۰ ۱۴۰۱/۰۳/۰۲.

                دیدگاه


                  #9
                  پاسخ : مشکل در UART

                  نوشته اصلی توسط mo.glmdi نمایش پست ها
                  عرض سلام و احترام خدمت دوستان و اساتید عزیز. بنده یک میکروی STM32F030K6T6 دارم که میخوام با توابع LL یه کاراکتری رو توسط UART ارسال کنم. از مبدل USB2TTL CH340 هم استفاده میکنم. تمامی تنظیمات رو مکررا چک کردم ولی متاسفانه در برنامه ترمینال هیچ کاراکتری دریافت نمیکنم. کد نوشته شده رو در ادامه قرار میدم. ممنون میشم اگر از دوستان کسی بتونه مشکل این برنامه رو حل بکنه.

                  void uart_UART1_GPIO_config(void)
                  {
                  //PA2-->TX , PA3-->RX
                  //Enable PortA Clock
                  RCC->AHBENR |= (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOFEN);//(1UL<<17);
                  //Mode to AF(UART1)
                  //map PA2,PA3 mapped to UART1
                  GPIOA->AFR[0] |= (0x01UL<<GPIO_AFRL_AFSEL2_Pos); //Alternate function 1 for PA2
                  GPIOA->AFR[0] |= (0x01UL<<GPIO_AFRL_AFSEL3_Pos);
                  // GPIOA->MODER &= ~(GPIO_MODER_MODER2 | GPIO_MODER_MODER3); // clearing PA2 Mode bits
                  GPIOA->MODER &= ~(GPIO_MODER_MODER2 | GPIO_MODER_MODER3); // clearing PA2 and PA3 Mode bits
                  GPIOA->MODER |= (GPIO_MODER_MODER2_1 | GPIO_MODER_MODER3_1); //putting PA2 and PA3 in Alternate function mode
                  // GPIOA->MODER |= (GPIO_MODER_MODER2_1); //putting PA2 in Alternate function mode
                  // GPIOA->MODER &= ~(GPIO_MODER_MODER3);// clearing PA3 Mode bits and at the same time setting it as input
                  //Output max medium speed
                  GPIOA->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR2 | GPIO_OSPEEDR_OSPEEDR3); //clear the PA2 Output speed bit fields
                  GPIOA->OSPEEDR |= (GPIO_OSPEEDR_OSPEEDR2_1 | GPIO_OSPEEDR_OSPEEDR3_1); //Set the PA2 Output speed as medium speed
                  //GPIO Output type register
                  GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_2 | GPIO_OTYPER_OT_3);
                  //Enable pull up resistors in PA2 and PA3
                  GPIOA->PUPDR |= (GPIO_PUPDR_PUPDR2_0 | GPIO_PUPDR_PUPDR3_0);
                  // GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_2);




                  }


                  /**
                  * @brief UART1 Peripheral Configuration
                  */
                  void uart_UART1_config(void)
                  {
                  //Enable UART1 Clock
                  RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
                  //clear the UART1 control register
                  USART1->CR1 &= ~(USART_CR1_UE); // disable UART1 for configuring
                  //Set Parity to Even
                  USART1->CR1 &= ~(USART_CR1_PS);
                  //Parity control Enable
                  USART1->CR1 |= USART_CR1_PCE;
                  //Set word length to 8-bits
                  // USART1->CR1 &= ~(0x3UL << 28); // Setting M1 to zero
                  USART1->CR1 &= ~(USART_CR1_M ); // Setting M1 to zero
                  //Set Stop bits to 1
                  USART1->CR2 &= ~(USART_CR2_STOP);
                  //Disable HW flow control
                  USART1->CR3 &= ~(USART_CR3_CTSE);
                  USART1->CR3 &= ~(USART_CR3_RTSE);
                  //Set the baud rate to 115200
                  // USART1->CR1 |= USART_CR1_OVER8; // Enable over-sampling mode for getting better accuracy in baud rate
                  USART1->CR1 &= ~(USART_CR1_OVER8); // 16 Oversampling
                  // USART1->BRR = 0; // Reset BRR first
                  // USART1->BRR = 0x340; // 0x1A0UL 115200 with over8=1
                  // USART1->BRR = 0x1388; // 9600 BD
                  USART1->BRR = 0x1A1; // 0x1A1UL 115200 with over16=1
                  //Clear some Flags and enable some others
                  // USART1->CR2 &= ~(USART_CR2_CLKEN);
                  // //Clear SCEN, HDSEL and IREN in CR3
                  // USART1->CR3 &= ~(USART_CR3_HDSEL);


                  //Enable USART
                  USART1->CR1 |= (USART_CR1_UE | USART_CR1_TE | USART_CR1_RE);
                  }


                  /**
                  * @brief UART1 Transmit
                  */
                  bool uart_UART1_transmit(uint8_t *data , uint8_t len , uint32_t timeout)
                  {
                  //wait on TXE to start transmit data
                  //Write to TDR register while TXE is high
                  uint8_t dataIdx=0;
                  uint32_t startTick=rcc_msGetTicks();
                  while(dataIdx<len)
                  {
                  if((USART1->ISR & USART_ISR_TXE)) //TX Buffer is empty
                  {
                  USART1->TDR = data[dataIdx];
                  dataIdx++;
                  }
                  else // Manage Timout
                  {
                  if((rcc_msGetTicks()-startTick)>=timeout) return false;
                  }
                  }
                  //wait for busy flag
                  while((USART1->ISR & USART_ISR_TC))
                  {
                  if((rcc_msGetTicks()-startTick)>=timeout) return false;
                  }
                  return true;


                  }
                  سلام

                  دوست عزیز از تنظیمات کد که بعضی جاهاش اشتباهه و چند باره کاری شده بگذریم ...

                  تنظیمات ریمپ gpio رو روی usart a9,a10 استفاده کن .

                  پول آپ ها رو کلا بردار ( وقتی پریفرال رو اینیتیالایز میکنی پورت رو روی اون پینها کانفیگ ورودی خروجی نمیکنن )

                  اول کدتون هم باس apb باید تنظیم بشه نه ahb ( باس پریفرالها apb1 و apb2 هستن )
                  جدیدترین ویرایش توسط Amie.s.m; ۱۴:۵۴ ۱۴۰۱/۰۳/۰۲.

                  دیدگاه


                    #10
                    پاسخ : مشکل در UART

                    ممنون از پاسخ سریعتون. طبق فرمایش شما، پول آپهارو برداشتم و تنظیمات ریمپ رو آوردم روی PA9 و PA10 . باس AHB هم که فرمودید اول کد تنظیم شده به خاطر تابع GPIO و فعال کردن پورت های A و F هست. باس APB در تابع بعدی که مربوط به UART هست تنظیم شده. با ریمپ کردن هم متاسفانه مشکل حل نشد.


                    void uart_UART1_GPIO_config(void)
                    {
                    //PA9-->TX , PA10-->RX
                    //Enable PortA Clock
                    RCC->AHBENR |= (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOFEN);//(1UL<<17);
                    //Mode to AF(UART1)
                    //map PA9,PA10 mapped to UART1
                    GPIOA->AFR[1] |= (0x01UL<<GPIO_AFRH_AFSEL9_Pos); //Alternate function 1 for PA2
                    GPIOA->AFR[1] |= (0x01UL<<GPIO_AFRH_AFSEL10_Pos);
                    GPIOA->MODER &= ~(GPIO_MODER_MODER9 | GPIO_MODER_MODER10); // clearing PA9 and PA10 Mode bits
                    GPIOA->MODER |= (GPIO_MODER_MODER9_1 | GPIO_MODER_MODER10_1); //putting PA9 and PA10 in Alternate function mode
                    //Output max medium speed
                    GPIOA->OSPEEDR &= ~(GPIO_OSPEEDR_OSPEEDR9 | GPIO_OSPEEDR_OSPEEDR10); //clear the PA9 Output speed bit fields
                    GPIOA->OSPEEDR |= (GPIO_OSPEEDR_OSPEEDR9_1 | GPIO_OSPEEDR_OSPEEDR10_1); //Set the PA10 Output speed as medium speed
                    //GPIO Output type register
                    GPIOA->OTYPER &= ~(GPIO_OTYPER_OT_9 | GPIO_OTYPER_OT_10);
                    }


                    /**
                    * @brief UART1 Peripheral Configuration
                    */
                    void uart_UART1_config(void)
                    {
                    //Enable UART1 Clock
                    RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
                    //clear the UART1 control register
                    USART1->CR1 &= ~(USART_CR1_UE); // disable UART1 for configuring
                    //Set Parity to Even
                    USART1->CR1 &= ~(USART_CR1_PS);
                    //Parity control Enable
                    USART1->CR1 |= USART_CR1_PCE;
                    //Set word length to 8-bits
                    // USART1->CR1 &= ~(0x3UL << 28); // Setting M1 to zero
                    USART1->CR1 &= ~(USART_CR1_M ); // Setting M1 to zero
                    //Set Stop bits to 1
                    USART1->CR2 &= ~(USART_CR2_STOP);
                    //Disable HW flow control
                    USART1->CR3 &= ~(USART_CR3_CTSE);
                    USART1->CR3 &= ~(USART_CR3_RTSE);
                    //Set the baud rate to 115200
                    // USART1->CR1 |= USART_CR1_OVER8; // Enable over-sampling mode for getting better accuracy in baud rate
                    USART1->CR1 &= ~(USART_CR1_OVER8); // 16 Oversampling
                    USART1->BRR = 0x1A1; // 0x1A1UL 115200 with over16=1
                    //Enable USART
                    USART1->CR1 |= (USART_CR1_UE | USART_CR1_TE | USART_CR1_RE);
                    }


                    /**
                    * @brief UART1 Transmit
                    */
                    bool uart_UART1_transmit(uint8_t *data , uint8_t len , uint32_t timeout)
                    {
                    //wait on TXE to start transmit data
                    //Write to TDR register while TXE is high
                    uint8_t dataIdx=0;
                    uint32_t startTick=rcc_msGetTicks();
                    while(dataIdx<len)
                    {
                    if((USART1->ISR & USART_ISR_TXE)) //TX Buffer is empty
                    {
                    USART1->TDR = data[dataIdx];
                    dataIdx++;
                    }
                    else // Manage Timout
                    {
                    if((rcc_msGetTicks()-startTick)>=timeout) return false;
                    }
                    }
                    //wait for busy flag
                    while((USART1->ISR & USART_ISR_TC))
                    {
                    if((rcc_msGetTicks()-startTick)>=timeout) return false;
                    }
                    return true;


                    }

                    دیدگاه


                      #11
                      پاسخ : مشکل در UART

                      پورت a9و a10 سریال پیش فرض دستگاه برای بوت لودره .برای امکان تست پورت سریال بدون برنامه نویسی گفتم از این پورت استفاده کنید .

                      میکرو رو روی مد بوت لودر ببر ( boot0 رو یک کن ) بعد ریست کن ببین 0x7fرو روی rx میگیری ( منظور از آر ایکس آر ایکس اینطرفه از سمت میکرو میشه tx )

                      دیدگاه


                        #12
                        پاسخ : مشکل در UART

                        مشکل حل شد. بسیار سپاسگزارم از راهنماییتون.

                        دیدگاه


                          #13
                          پاسخ : مشکل در UART

                          با عرض پوزش، مشکل جدیدی پیش اومده و اون هم اینه که کاراکتری که در برنامه ترمینال سریال (RealTerm) به نمایش درمیاد کلا متفاوت هست با اونی که در میکرو نوشتم. توی میکرو با دستور Printf نوشته شده printf("The program is starting...\n"); و چیزی که در ترمینال به نمایش درمیاد این هست : ش¯پً®ërxKح >WrWثçهr . (یکسری کاراکتر نامشخص!!!)
                          بادریت رو روی 115200 گذاشتم و paritybit هم even هست. کلاک سیستم از یک کریستال خارجی با فرکانس 4 مگاهرتز تامین میشه و با PLL فرکانس کلاک سیستم و باسها روی 48 مگاهرتز تنظیمه.
                          اولش فکر کردم شاید از فونت ترمینال باشه ولی با تمامی فونت ها امتحان کردم، تغییری حاصل نمیشه. ممنون میشم اگر راهنمایی کنید .

                          دیدگاه


                            #14
                            پاسخ : مشکل در UART

                            اون بخش پریتی رو از سمت میکرو بردار ( دیروز میخواستم بگم فراموش شد .... اکثر ارتباطات uart متداول 8n1 هستن یعنی پریتی اود و ایون خیلی وقته استفاده نمیشه )

                            اگر باوودریت درسته و الزام به استفاده از پریتی داری باید توی تنظیمات پورت در ویندوز پریتی پیش فرض رو از none به even تغییر بدی

                            دیدگاه


                              #15
                              پاسخ : مشکل در UART

                              نوشته اصلی توسط Amie.s.m نمایش پست ها
                              اون بخش پریتی رو از سمت میکرو بردار ( دیروز میخواستم بگم فراموش شد .... اکثر ارتباطات uart متداول 8n1 هستن یعنی پریتی اود و ایون خیلی وقته استفاده نمیشه )

                              اگر باوودریت درسته و الزام به استفاده از پریتی داری باید توی تنظیمات پورت در ویندوز پریتی پیش فرض رو از none به even تغییر بدی
                              بسیار سپاسگزارم. حل شد. دقیقا همین بود که فرمودید. البته قبلا توی تنظیمات Device manager پریتی رو Even گذاشته بودم ولی بازهم مشکل حل نمیشد. به هر چیزی فکر کردم به غیر از پریتی کنترل(به قول سعدی شیرازی که بسیار سفر باید تا پخته شود خامی )

                              دیدگاه

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