PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : درخواست تحلیل کد به زبان سی برای



alamdar
26-10-2012, 17:28
با سلام

من میخواستم بعضی قسمت های این کد که رتگی میکنم رو یکی از دوستان واسم توضیح بدند. خیلی ممنون میشم



#include <LPC21xx.H> /* LPC21xx definitions */

void PWM0_isr(void) __irq
آبا __irq معنی خاصی داره؟

{
PWMIR |= 0x00000001; /* Clear match0 interrupt */
چرا رجیستر PWMIR رو با اوت عدد OR میکته؟



VICVectAddr = 0x00000000;
این خط چه کار میکنه؟
}


void poll_ADC (void) { /* Get ADC Value and set PWM */
unsigned int val;
static unsigned int oldval;

ADCR |= 0x01000000; /* Start A/D Conversion */
do {
val = ADDR; /* Read A/D Data Register */
} while ((val & 0x80000000) == 0); /* Wait for end of A/D Conversion */
دستور while دقیقا چه چیزی رو چک میکنه و ترجمه عیارت داخلش چطور میشه؟

ADCR &= ~0x01000000; /* Stop A/D Conversion */
val = (val >> 6) & 0x03FF; /* Extract AIN0 Value */

if ((val != oldval)) {
PWMMR2 = val;
PWMLER = 0x4; /* Enable Shadow latch */
oldval = val;
}
}


void init_PWM (void) {
VICVectAddr8 = (unsigned)PWM0_isr; /* Set the PWM ISR vector address */
VICVectCntl8 = 0x00000028; /* Set channel */
VICIntEnable = 0x00000100; /* Enable the interrupt */

PINSEL0 |= 0x00028008; /* Enable P0.7 and P0.1 as PWM output */
این دستور چطور 2تا پینی که توضیح داده رو خروجی میکنه؟

PWMPR = 0x00000000; /* Load prescaler */

PWMPCR = 0x00000C0C; /* PWM channel 2 & 3 double edge control, output enabled */
PWMMCR = 0x00000003; /* On match with timer reset the counter */
PWMMR0 = 0x400; /* set cycle rate to sixteen ticks */
PWMMR1 = 0; /* set rising edge of PWM2 to 100 ticks */
PWMMR2 = 0x200; /* set falling edge of PWM2 to 200 ticks */
PWMMR3 = 0x400; /* set rising edge of PWM3 to 100 ticks */
PWMLER = 0xF; /* enable shadow latch for match 1 - 3 */
PWMTCR = 0x00000002; /* Reset counter and prescaler */
PWMTCR = 0x00000009; /* enable counter and PWM, release counter from reset */
}


int main (void) {

IODIR1 = 0x00FF0000; /* P1.16..23 defined as Outputs */
ADCR = 0x01200401; /* Setup A/D: 10-bit AIN0 @ 3MHz */
init_PWM();

while (1) { /* Loop forever */
poll_ADC();
}
}

من دلیل این چند مورد که نوشتم رو متوجه نمیشم در برنامه های ARM
پیشاپیش از راهنماییتان ممنون

mzarkoob
26-10-2012, 20:53
سلام
or میشه تا قبلا اگه بیتهای دیگه مقداری داشتند تغییر نکنه
VICvectAddدر pdf های آموزش آقای تروشه هست.
while ((val & 0x80000000) == 0) همان طور که نوشته چک میشه تا وقتی عملیات تبدیل انجام شد خواندن از رجیستر انجام میشه
در مورد pinsell هم به صورت باینری خودتون یکی یکی پایه ها رو قرار بدید همین عدد بدست میاد ....