سلام دوستان من توی مقدار دهی به رجیستر ها یکم مشکل دارم میشه لطفاً کمکم کنید.
مثلاً این کد ها رو ببینید :
کد:
LPC_PINCON->PINSEL1 &= ~( 3 << 18);
LPC_PINCON->PINSEL1 |= ( 1 << 18); /* P0.25 is AD0.2 */
LPC_PINCON->PINMODE1 &= ~( 3 << 18);
LPC_PINCON->PINMODE1 |= ( 2 << 18); /* P0.25 no pull up/down */
ببینید من میدونم هدف این کد چیه میخواد پین رو روی ADC سلکت کنه و Pull up/down رو برداره. خط 2 و 4 رو خوب متوجه میشم چون داره عدد یک رو شیف میده تا به بیت مورد نظر برسه و بعد تنظیمات اعملا میشه از OR هم استفاده کرده تا روی بقیه بیت ها تاثیر نذازه ولی اصلاً مقهموم خط 1 و 3 رو نمیفهمم و این سوال ها رو دارم
1- چرا از AND استفاده کرده
2- چرا عدد 3 رو داره شیقت میده ؟ مگه اون بیت شماره 18 یه بیت بیشتر نیست که فقط میتونه 1 باشه یا 0 پس این عدد 3 چی میگه این وسط
3- این علامت ~ رو برای چی قبل پرانتز گذاشتن. آقا اصلا کلاً این خط 1 و 3 چی کار میکنه ؟
یا مثلا این کد رو ببینید
کد:
LPC_ADC->ADCR &= ~( 7 << 24); /* stop conversion */
LPC_ADC->ADCR |= ( 1 << 24); /* start conversion */
ببینید بیت شماره 24 رجیستر ADCR برای شروع تبدیل ADC هست اگر 1 بشه استارت میکنه اگر 0 بشه استاپ میشه من الان مفهوم خط 2 رو رو میفهمم داره بیت 24 رو 1 میکنه خط اول رو هم میدونم که داره بیت 24 رو 0 میکنه چون جلوش توضیح نوشته ولی نمیتونم تحلیل کنم که چجوری عدد 7 رو 24 تا شیف میده و باعث میشه که بیت 24 صفر میشه ؟؟؟
و مشکل بعد این کد هست :
کد1:
کد:
while (!(LPC_ADC->ADGDR & ( 1UL << 31))); /* Wait for Conversion end */
کد2 :
کد:
do
{
} while ((LPC_ADC->ADGDR & 0x80000000) == 0); // Wait for end of A/D Conversion
خوب ببینید کد1 و کد 2 هر 2 یه کار رو انجام میدن من تحلیل کد 2 رو متوجه میشم ولی رو اولی مشکل دارم. ببینید کد اینجوری عمل میکنه که میاد تو while میمنونه تا بیت شماره 31 که بیت DONE هست 1 بشه وقتی شد یعنی تبدیل انجام شد و ما میتونیم مقدار دیجیتال رو از روی رجیستر مربوطه برداریم.
حال من تو کد 1 این که 1UL رو اومد 31 تا شیف داده رو متوجه نمیشم اصلاً 1UL یعنی چی ؟ بعض جاها دیدم مثلاً زده 3UL اینا یعنی چی ؟؟ و اینکه while کد 1 رو متوجه نمیشم دیگه کلاً
ممنون میشم دوستانی که تجربه دارن و مخصوصاً آقای زرکوب که دیگه همه اینا رو فوت آب هستن یه کمکی به ما برسونن