PDA

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



alamdar
26-10-2012, 20:59
با سلام

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



#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
پیشاپیش از راهنماییتان ممنون

alamdar
27-10-2012, 01:01
من الان همه اون چیزایی که نوشته بودم رو فهمیدم فکر میکنم (البته به جز __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;


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

Aghaeifar
27-10-2012, 03:29
1- اون __irq برای کامپایلر مشخص می کنه که این تابعی که نوشته شده، یه روتین وقفه است.

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

alamdar
27-10-2012, 11:03
خوبه پس حدسم درست بود

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

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

agape
27-10-2012, 15:07
نه دایی جان - بسته به کامپایلر متفاوته
و البته میشه ننوشت! و کار هم میکنه ولی خود توضیخات توصیه میکنه که بذارید این کلید رو