PDA

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



منصوره$
07-02-2011, 17:48
سلام
من دارم با ميكرو آرم يه برنامه مي نويسم توي اين برنامه من مي خوام كه يه زمان تاخير نيم ساعت داشته باشم طبق اون چيزي كه در مجله شماره 1 گفته شده
زمان=(x*5) تقسيم بر f به ما مقدار عددي كه بايد در حلقه for شمارش ميشه رو ميده ، من استفاده كردم ولي متاسفانه اين روش به من مقدار زمان دلخواهم كه يه تاخير نيم ساعته هست نمي ده ،اگر كسي لطف كنه و بگه كه چطوري من مي تونم اين زمان تاخير نيم ساعته رو داشته باشم ممنون ميشم

shayanmelody
07-02-2011, 21:23
الگوی کار همونه . حالا شما لطف کن بگو چه عددی گذاشتی بعنوان شاخص و فرکانس کاری میکرو را هم بذار تا ببینیم چی به چیه .

draculaaaaa
08-02-2011, 01:53
سلام
عجب کاری می خواهید بکنید شما؟
اون کاری که تو مجله کرده (n=110592000) ولی هدر delay موجوده و کار با تایمرها رو هم که تو ویرایش جدید گفتن :125:

منصوره$
08-02-2011, 12:51
سلام
من دارم با ميكرو آرم كار مي كنم فركانسم 18.432mhz ،برنامه من به اين صورت كه هر نيم ساعت يكبار ميياد خروجي كانال هاي adc(به ترتيب از كانال صفر تا كانال7) هرنيم ساعت يكبار به يك شماره sms مي كنه ودر ضمن زمان هم روي lcdنشون بده، حالا من مي خوام بدونم با چه كاري كنم تا اين نيم ساعتو و دقيق داشته باشم ، اگه بخوام delay بزارم برنامم جواب نميده پس مي خوام بدونم فرمولي يا چيزي هست اگه كسي چيزي ميدونمه ممنون ميشم بگويد.

ssh
08-02-2011, 18:50
سلام
از تایمر بلادرنگ با فرکانس KHz 32.768 می تونی استفاده کنی.

draculaaaaa
10-02-2011, 13:22
سلام شما کافیه که PMM3 رو بخونید .

فرکانس برد 18432000 هست شما کافیه با وقفه سریز یکی از تایمر ها 1 ثانیه درست کنید و تو برنامه وقفه یه شمارنده بذارید که هر موقع 1800 شد اون کاری رو که می خواین انجام بده.

prescaler تون رو اگه 1024 بذارید ( تو مجله نوشته که برای بخش Wave چهار مد کاری داریم ) مثلا اگه با مد 2 کار کنید کافیه RC رو مقدار دهی کنید و یک ثانیه تولید کنید .


مثلا این یه نمونه تولید 1 ثانیه است

پیکربندی تایمر 1

void Timer1_init(void)
{
*AT91C_PMC_PCER |=(1<< AT91C_ID_TC1);
*AT91C_TC1_CMR|=0xC004;
*AT91C_TC1_CCR|=0x05 ;
*AT91C_TC1_RC =46769;
*AT91C_TC1_IER = 0x10;
*AT91C_AIC_SMR = 0x66;


AT91C_BASE_AIC -> AIC_SVR[AT91C_ID_TC1]=(unsigned long) tc1_interrupt;
AT91C_BASE_AIC ->AIC_IECR=(1<<AT91C_ID_TC1);

}


قسمت مربوط به وقفه سرریز تایمر 1

__irq void tc1_interrupt (void)
{




*AT91C_TC1_CCR=0x04;


// کد مربوط
AT91C_AIC_EOICR = *AT91C_TC1_SR;
}

1nafar
17-02-2011, 17:12
سلام
توی سری at91sam یه تایمر به نام rtt وجود داره که باهاش میشه زمانی از 0 تا 2 به توان 32 ثانیه رو به راحتی ایجاد کرد .
نحوه ی کار باهاش در انتهای مجله ی شماره ی 4 ( ویرایش دوم ) توضیح داده شده .

منصوره$
22-02-2011, 19:11
سلام اقاي هاشمي ممنون از راهنماييهاتون من چند تا سوال دارم؟

1-من دارم با ماژول آرم شما كار مي كنم كه فركانس كريستال اون 18.432mhz اگه بخوام از RTT استفاده كنم شما در مجله نوشتيد كه بايد از كرريستال 32678 استفاده كنم خوب حالا من بايد اين كارو چطور انجام بدم؟
2- شما در مثالي كه اورديد مقاد شمارش شده روي پورت B قرار داديد ،توي اين مثال وقتي مي يايم مقدار شمارش شده روي پورت B قرار مي ديم دقيقا چه اتفاقي ميافته؟ تا چه زماني براي ما ميشمره؟

3- من توي برنامم مي خوام كه در حين اجراي روند برنامه هر نيم ساعت يكبار خروجي كانال ADC بگيره اگه يه لطف كنيد و بيشتر توضيح بديد ممنون ميشم چون من چيز زياد از اين مثال نفهميدم خيلي ممنون ميشم براي توضيحاتتون

1nafar
22-02-2011, 23:12
سلام

1-من دارم با ماژول آرم شما كار مي كنم كه فركانس كريستال اون 18.432mhz اگه بخوام از rtt استفاده كنم شما در مجله نوشتيد كه بايد از كرريستال 32678 استفاده كنم خوب حالا من بايد اين كارو چطور انجام بدم؟
اگه مطلب رو یه مقدار دقیق تر بخونید متوجه میشید که ما برای ساختن زمان دقیق 1 ثانیه ، به این کریستال نیاز داریم ( زمان دقیق 1000000 میکرو ثانیه ) ، شما میتونید با استفاده از فرمول های موجود در داخل مجله با استفاده از کریستال 18.432 مگا هرتز زمان مورد نظر رو ایجاد کنید .

2- شما در مثالي كه اورديد مقاد شمارش شده روي پورت b قرار داديد ،توي اين مثال وقتي مي يايم مقدار شمارش شده روي پورت b قرار مي ديم دقيقا چه اتفاقي ميافته؟ تا چه زماني براي ما ميشمره؟
شمارش در مبنای دسیمال هست که به صورت باینری بر روی پورت قرار میگره ، آخرین رقم برابر با 1111111111111111111111111111111 ( تعداد 31 عدد یک ) در مبنای باینری یا 4294967295 در مبنای دسیمال هست .

3- من توي برنامم مي خوام كه در حين اجراي روند برنامه هر نيم ساعت يكبار خروجي كانال adc بگيره اگه يه لطف كنيد و بيشتر توضيح بديد ممنون ميشم چون من چيز زياد از اين مثال نفهميدم خيلي ممنون ميشم براي توضيحاتتون
در کل عمل کرد این تایمر کاملا مجزا از سایر بخش های میکرو هست ، شما کافیه با استفاده از فرمول های موجود ، مقدار پرسیکال و سایر تنظیمات رو برای ایجاد کردن یک زمان پایه مثلا 1 یا 2 ثانیه مجاسبه کنید ، بعد مقدار رجیستر at91c_rttc_crtv; رو با عدد مثلا 1800 یا 900 مقایسه کنید تا ببنید زمان نیم ساعت سپری شده یا نه ، مهم نیست توی برنامه ی شما چه کدهای اجرا بشه ، چون این تایمر به صورت کاملا مستقل زمان رو میشمره .