NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 4201 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 5 از 5

موضوع: تحلیل کد مربوط به arm

  1. #1
    کاربر دائمی
    تاریخ عضویت
    Nov 2011
    نوشته ها
    427
    تشکر
    218
    تشکر شده 128 بار در 102 پست

    Icon16 تحلیل کد مربوط به arm

    با سلام

    من میخواستم بعضی قسمت های این کد که رتگی میکنم رو یکی از دوستان واسم توضیح بدند. خیلی ممنون میشم
    کد:
    #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
    پیشاپیش از راهنماییتان ممنون

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    کاربر دائمی
    تاریخ عضویت
    Nov 2011
    نوشته ها
    427
    تشکر
    218
    تشکر شده 128 بار در 102 پست

    پیش فرض

    من الان همه اون چیزایی که نوشته بودم رو فهمیدم فکر میکنم (البته به جز __irq )

    اما سوال مهمتری که واسم پیش اومده ، مقادیر هگزا دسیمال موجود در برنامه هستند

    چه اونهایی که برای مقدار دهی استفاده شدن و چه اونها که برای مقایسه!

    آیا همه این اعداد آدرس یا اینستراکشن های مربوط به این میگرو هستند و در user manual باید دنبالشون گشت؟ یا حکمت ذیکه ای دارند؟!

    PWMIR |= 0x00000001;
    ADCR |= 0x01000000;
    ADCR &= ~0x01000000;
    (val & 0x80000000)
    (val >> 6) & 0x03FF;
    VICVectCntl8 = 0x00000028; VICIntEnable = 0x00000100;
    PINSEL0 |= 0x00028008;
    PWMPCR = 0x00000C0C; PWMMCR = 0x00000003; PWMMR0 = 0x400; PWMMR1 = 0; PWMMR2 = 0x200; PWMMR3 = 0x400; PWMLER = 0xF; PWMTCR = 0x00000002; PWMTCR = 0x00000009;


    جساب و کتاب این عددها چیه نمیفهمم!!

  4. #3
    مدیر انجمن Aghaeifar آواتار ها
    تاریخ عضویت
    Feb 2010
    نام
    علی آقائی فر
    نوشته ها
    751
    تشکر
    552
    تشکر شده 975 بار در 440 پست

    پیش فرض

    1- اون __irq برای کامپایلر مشخص می کنه که این تابعی که نوشته شده، یه روتین وقفه است.

    2- نه اخوی، اینها فقط یک مقدار هستن که در رجیستر مورد نظر ریخته شده اند. می تونستن در مبنای دسیمال هم بریزند توش. اما اینکه هر عدد چه معنی می ده باید بری در منوال رجیستر مورد نظر رو بخونی ببینی هر بیتش برای چه منظوری است که وقتی این عدد می ره توش موجب چی میشه.
    ما در انتظار رویت خورشیدیم ...

    اللهم عجل لولیک الفرج

  5. #4
    کاربر دائمی
    تاریخ عضویت
    Nov 2011
    نوشته ها
    427
    تشکر
    218
    تشکر شده 128 بار در 102 پست

    پیش فرض

    خوبه پس حدسم درست بود

    میگم اخوی غیر از این __irq بارم داریم دستور مشابه اون؟

    اینو آهر هر تابعی بنویسی وقفه حساب میشه؟ و اکر ننویسی کار نمیکنه؟

  6. #5
    مدیرکل انجمنها agape آواتار ها
    تاریخ عضویت
    Feb 2009
    نام
    Zeus
    نوشته ها
    1,235
    تشکر
    139
    تشکر شده 2,209 بار در 846 پست

    پیش فرض

    نه دایی جان - بسته به کامپایلر متفاوته
    و البته میشه ننوشت! و کار هم میکنه ولی خود توضیخات توصیه میکنه که بذارید این کلید رو

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •