امتیاز موضوع:
  • 2 رأی - میانگین امتیازات: 5
  • 1
  • 2
  • 3
  • 4
  • 5
چت باکس علمی ARM
نویسنده پیام
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #67
RE: چت باکس علمی ARM
سلام دوستان

من زیاد با وقفه ها کار نکردم...
برای راه اندازی twi از یه وقفه استفاده شده...
twi درست کار میکنه...

ولی زمانی که توی برنامه ام وقفه باشه، باید همه ی متغیر هام رو static تعریف کنم...
اونایی که static نیستند، هیچ مقداری نگه نمیدارن...و صفر میشن مثلا
int a ;
a= 10+sum(1+2);
وقتی برنامه رو دیباگ میکنم، بعد از اجرای تابع sum ، مقداری که داخل متغیر a هست میشه 0 !!! Amaze Amaze

کلا این مسئله عادیه؟ Confused
باید همشون استاتیک باشن؟
یا مشکل از یه چیز دیگه اس؟ Biggrin


کامپایلر : keil
میکرو : sam7s256
j-link
(آخرین ویرایش در این ارسال: ۱۳-فروردین-۱۳۹۲, ۱۵:۰۹:۳۷، توسط salehjg.)
۱۳-فروردین-۱۳۹۲, ۱۵:۰۸:۰۸
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : Ambassador
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #68
RE: چت باکس علمی ARM
سلام.

1-متغيير ها رو توي تابع تعريف مي كني يا سراسري؟
2-توي برنامه چقدر پرش داري؟
3-احيانا فضاي Stack كم نمي ياد؟
كلا ديباگ كردن در صورت وجود وقفه بنظرم كمي گيج مي زنه!!

(آخرین ویرایش در این ارسال: ۱۳-فروردین-۱۳۹۲, ۱۶:۴۳:۵۳، توسط sharin.)
۱۳-فروردین-۱۳۹۲, ۱۶:۳۳:۵۹
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : salehjg, Ambassador
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #69
RE: چت باکس علمی ARM
(۱۳-فروردین-۱۳۹۲, ۱۶:۳۳:۵۹)sharin نوشته است: سلام.

1-متغيير ها رو توي تابع تعريف مي كني يا سراسري؟
2-توي برنامه چقدر پرش داري؟
3-احيانا فضاي Stack كم نمي ياد؟
كلا ديباگ كردن در صورت وجود وقفه بنظرم كمي گيج مي زنه!!
سلام
ج1 - متغیر محلی - داخل تابع main و استاتیک نیست
ج2- فقط یکی...
ج3- Biggrin ، استک چی بود؟ Biggrin در این مورد پیاده ام... میشه توضیح بدین؟ همونیه که تو Bascom بالای برنامه مینوشتیم؟ اگه کم بیاد چه علائمی داره؟ Biggrin

آخه با تابع ای بهش پرش میشه، کاری ندارم...
فقط breakpoint میزارم روی a=10+sum بعد یه خط اجرا میکنم تا a رو ببینم.

درضمن برنامه یکم زیاده... نه در اون حد... مثلا متغیر زیاد داره...
منظورم اینکه توی main فقط اون a=sum+10 نیست Biggrin

در مورد stack میشه یه سر نخ بدین؟
در options هه keil یه قسمت هست : Read/write area .... به اون که ربطی نداره؟ داره؟
(آخرین ویرایش در این ارسال: ۱۳-فروردین-۱۳۹۲, ۱۷:۲۵:۰۷، توسط salehjg.)
۱۳-فروردین-۱۳۹۲, ۱۷:۲۳:۳۳
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : Ambassador
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #70
RE: چت باکس علمی ARM
خوب ديگه ... ، مشكل از محلي بودنش هست.
وقتي مي ري به وقفه ، يعني يه جايي خارج از تابع main و در نتيجه اون متغيير مقدارش رو نگه نمي دارهه.
اين متغييرهايي كه ضروري هستن رو قبل از تابع main تعريف كن كه سراسري باشن ، اينطوري مشكلي نداري ...
stack يا معادلش به فارسي پشته هست.
مثلا توي AVR تعداد 16 عدد ريجستر همه منظورهه داري كه نقل و انتقال و ... توسط همينا صورت مي گيرهه. توي ARM هم به همين صورت اما يه تفاوت هايي دارهه! خيلي جالبه. يكيشون تخصيص به PC (program counter) دارهه و ...
حالا وقتي مي ري توي وقفه يا هر نوع سابروتيني ، چندتا از ريجستر ها اونجا بايد استفاده بشن ، پس قبل از اينكه بري به اون روال بايستي اينها رو در بخشي از SRAM ذخيرهه كني و بعد بري ... . به اين فضا استك مي گن كه موقع برگشت دوبارهه اين مقادير بايد به رجيستر هاي مربوطه باز گردونده بشن تا برنامه اطلاعاتي رو گم نكنه و ... . ( كد زنيه اينا در سطح اسمبلي هست ، در سطح C مستقيم برخوردي نداري. )
ممكنه سرريز كنه كه بايد حواست باشه. تو مورد شما بعييد مي دونم.


نقل قول: در options هه keil یه قسمت هست : Read/write area .... به اون که ربطی نداره؟ داره؟
كجا رو مي گي؟
براي تغيير مقدار SRAM مي توني از همون wizard اي استفاده كني كه توش فركانس رو تنظيم مي كني.
دقت كن كه ARM داراي 6 مود هست و در حال عادي در مود User/System mode هست و موقعي كه وقفه رخ مي دهه مي رهه به مود Intrrupt mode .
معمولا بيشتر در همين 2 مود هستي ، اگر خواستي فضا رو افزايش بدي روي اين دو قسمت زوم كن.
sam7x256 هم 64KB SRAM دارهه .
--
كافي بود؟

(آخرین ویرایش در این ارسال: ۱۳-فروردین-۱۳۹۲, ۱۸:۱۳:۱۸، توسط sharin.)
۱۳-فروردین-۱۳۹۲, ۱۷:۵۵:۳۹
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : salehjg
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #71
RE: چت باکس علمی ARM
(۱۳-فروردین-۱۳۹۲, ۱۷:۵۵:۳۹)sharin نوشته است: كجا رو مي گي؟

Happy
Happy
عالـــی بود... تشکر

static رو فهمیدم ... تشکر
---------
اینجا رو میگم:
[تصویر:  tvr00gs21ork0mlnghle_thumb.jpg]
(آخرین ویرایش در این ارسال: ۱۳-فروردین-۱۳۹۲, ۱۸:۱۱:۲۹، توسط salehjg.)
۱۳-فروردین-۱۳۹۲, ۱۸:۰۸:۴۵
وب سایت ارسال‌ها
پاسخ
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #72
RE: چت باکس علمی ARM
نه اين اگر اشتباه نكنم بر اساس memory map اي هست كه توي ديتاشيت اومدهه و آدرس شروع و پايان RAM همين مي شه كه اين گفته. البته چون تاحالا سر اين قضيه به مشكل نخوردم پيگير نشدم ، اما مي توني توي ديتاشيت آدرسش هاش رو چك كني.
توي LPC1768 هم كه 64k فضا دارهه ، 32K اش رو دم دستت مي ذارهه و باقيش صرف RAM مورد نياز واحد هاي جانبي مي شه ، كه باز فكر مي كنم از همين قسمت مي توني يه دخل و تصرف هايي توش داشته باشي.
احتمالا SAM7 هم همينطور باشه ، باز مي گم ، خودم چك نكردم ، براي اطمينان بيشتر خودت با ديتاشيت تطبيق بدهه.
اگر پيگير شدي ،‌بي زحمت نتيجه رو هم اينجا بذار ... . تشكر.

موفق باشي.

۱۳-فروردین-۱۳۹۲, ۱۸:۲۲:۲۷
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : salehjg, WhiteNoise, omid_phoenix
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #73
RE: چت باکس علمی ARM
سلام
برای اولین بار خواستم با RTT کار کنم... Real time timer

اول رجیستر AR رو با مقدار زمانی که دوست دارم ، مقدار دهی میکنم(Alarm)

بعدا رجیستر MR رو مقدار میدمش: 0x8000 | 1<<18
تا فرکانس شمارنده 1 هرتز بشه و یه ریست روی RTT انجام بشه...


اما حتی وقتی برای اولین بار بیت ALMS رو توی رجیستر status چک میکنم ، میبینم 1 شده... در حالی که تا شماره ای که توی AR ذخیره کردم، نشمرده!

چرا اینطوری رفتار میکنه؟


------------------
ویرایش:

Amaze
دارم سکته میکنم

این برنامه مشکل داره:

کد:
*AT91C_RTTC_RTAR = 0X8;

*AT91C_RTTC_RTMR = 0x8000 | 1<<18;



delay_ms(10);


while( (*AT91C_RTTC_RTSR) & 0x1 ==0);




اما این برنامه درست کار میکنه:


کد:
*AT91C_RTTC_RTAR = 0X8;

*AT91C_RTTC_RTMR = 0x8000 | 1<<18;



delay_ms(10);


while( ((*AT91C_RTTC_RTSR) & 0x1) ==0);




که تفاوت 2 کد در این خطه:
برنامه اول:
کد:
while( (*AT91C_RTTC_RTSR) & 0x1 ==0);
برنامه دوم:
کد:
while( ((*AT91C_RTTC_RTSR) & 0x1) ==0);


الان دقیقا پرانتزها اونجا ، چه وظیفه ای دارن؟!!
(آخرین ویرایش در این ارسال: ۲۰-فروردین-۱۳۹۲, ۰۰:۵۲:۰۱، توسط salehjg.)
۲۰-فروردین-۱۳۹۲, ۰۰:۵۰:۲۴
وب سایت ارسال‌ها
پاسخ
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #74
RE: چت باکس علمی ARM
به نظر منم ، اون پرانتزها نبايد تفاوتي ايجاد كنن!
راستي اينطور كه برنامه رو نوشتي بايد هر سري 2تا ريجستر رو مقدار دهي كني درسته؟
چون اينطور كه خوندم ، بعد از برابر شدن مقدار شمرده شده با ريجستر AR ، بيت ALMS در RTT_SR يك مي شه ، ريجستر AR ريست مي شه مقدار 0xFFFFFFFF رو مي گيرهه.
يعني بارهه بعدي بايد دوبارهه مقدار دهي بشه ديگه ، درسته ؟

۲۰-فروردین-۱۳۹۲, ۰۱:۲۵:۰۰
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : salehjg
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #75
RE: چت باکس علمی ARM
نقل قول: راستي اينطور كه برنامه رو نوشتي بايد هر سري 2تا ريجستر رو مقدار دهي كني درسته؟
چون اينطور كه خوندم ، بعد از برابر شدن مقدار شمرده شده با ريجستر AR ، بيت ALMS در RTT_SR يك مي شه ، ريجستر AR ريست مي شه مقدار 0xFFFFFFFF رو مي گيرهه.
سلام
آره 2 تا رجیستر....

ALMS یک میشه، ولی AR تغییر نمیکنه....
دیتاشیت اون سطر رو بد نوشته، باید از سر خط اون جمله رو مینوشتBiggrin

نقل قول:
The current value of the counter is compared with the value written in the alarm register
RTT_AR (Real-time Alarm Register). If the counter value matches the alarm, the bit ALMS in
RTT_SR is set. The alarm register is set to its maximum value, corresponding to 0xFFFF_FFFF,
after a reset.

منم سر اون جمله شک کردم، رجیستر ها رو تست کردم.
بازم معلوم نبود که منظورش از RESET چیه...
ریست کل میکرو منظورشه یا ریست RTT
دوباره تست کردم....
یعنی AR رو قبل از MR مقدار دهی کردم(روی رجیستر مد، RTTRST رو یک مقدار دهی میکنم)

AR تغییر نکرد...
پس منظورش ریست کل میکرو هستش

Confused

Biggrin

---------------
نقل قول: به نظر منم ، اون پرانتزها نبايد تفاوتي ايجاد كنن!
خیلی خیلی جالبه که تغییر ایجاد میکنن...
فکر کنم bug ای چیزی باشه...
توی C اصولا نباید فرقی بکنه اون پرانتز ها
ولی با keil ، دو سه بار تست کردم...
همون مشکل هست

میگم رجیستر ها رو مستقیم استفاده کردم(بدون استفاده از اون دسته رجیستر هایی که داخل struct ها دسته بندی شدن)
(منظورم همون روش استفاده از آدرس base هه)
میتونه مشکل ازش باشه؟

----------------------


مثلا این برنامه یه چشمک زن ساده با rtt یه:
(بدون پرانتز ها ، کار نمیکنه!!!)

کد:
#include <AT91SAM7S256.H>
#include <delay.h>
/*

#define AT91C_RTTC_RTSR (AT91_CAST(AT91_REG *)
0xFFFFFD2C) // (RTTC) Real-time Status Register
#define AT91C_RTTC_RTMR (AT91_CAST(AT91_REG *)
0xFFFFFD20) // (RTTC) Real-time Mode Register
#define AT91C_RTTC_RTVR (AT91_CAST(AT91_REG *)
0xFFFFFD28) // (RTTC) Real-time Value Register
#define AT91C_RTTC_RTAR (AT91_CAST(AT91_REG *)
0xFFFFFD24) // (RTTC) Real-time Alarm Register

*/
void initt();












int main()
{


int a=333,b;

*AT91C_PMC_PCER = 1<<AT91C_ID_PIOA;

*AT91C_PIOA_OER = 1<<19;


for(;;)

{


initt();


if(a)


{



a=0;



*AT91C_PIOA_SODR = 1<<19;


}


else


{



a=1;



*AT91C_PIOA_CODR = 1<<19;


}



while( (*(AT91C_RTTC_RTSR) & 0x1) ==0);

}


return 0;
}

void initt()
{

unsigned int tmp;

tmp = *
AT91C_RTTC_RTAR;

*AT91C_RTTC_RTAR = 1;

*AT91C_RTTC_RTMR = 0x8000 | 1<<18;


}
(آخرین ویرایش در این ارسال: ۲۰-فروردین-۱۳۹۲, ۲۰:۴۲:۴۶، توسط salehjg.)
۲۰-فروردین-۱۳۹۲, ۲۰:۳۸:۲۸
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : omid_phoenix, sharin
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #76
RE: چت باکس علمی ARM
سلام.
ببخشید که دبر جواب می دم.
Net خونه قطعهه و فعلا دسترسی به PC ام ندارم. ان شاءالله تا دسترسی پیدا کردم ، بررسی می کنم و خبر می دم ...

۲۷-فروردین-۱۳۹۲, ۲۱:۵۹:۲۵
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : hadikh73, salehjg, babyy
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #77
RE: چت باکس علمی ARM
سلام
اين خط زير رو ببين ( از برنامه اي هست كه نوشتي )
کد php:
while( (*(AT91C_RTTC_RTSR) & 0x1) ==0); 

به اين شكل بنويسش:
1)
کد php:
while( (AT91C_BASE_RTTC->RTTC_RTSR 0x1) ==0); 
و حالا اينطور:
2)
کد php:
while( AT91C_BASE_RTTC->RTTC_RTSR 0x1 ==0); 

---
و يه بار اين:
3)
کد php:
while( (*AT91C_RTTC_RTSR 0x1) ==0); 
يه بار هم اين:
4)
کد php:
while( *AT91C_RTTC_RTSR 0x1 ==0); 

جواب درست يا غلط رو جلوي هر شمارهه بنويس بي زحمت.

-----

اون متني كه حرف از ريست زده ، منظور ريست ميكرو نيست ، ريست خود رجيستر هست ، كه مقداري برابر 0xFF~FF مي گيرهه.
البته اين برداشت من هست ، ريست ميكرو معني نمي دهه ، چون اون موقع واحد rtt اصلا فعال نيست.

۳۱-فروردین-۱۳۹۲, ۲۱:۳۶:۳۵
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : salehjg, omid_phoenix, babyy


پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 3 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS