PDA

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



pirozy
13-04-2013, 23:02
با سلام
دوستان یه at91sam7s128 خریدم تغذیه ها رو وصل کردم و توسط کامپیوتر هم شناخته میشه ولی وقتی برنامه چشمک زن رو روش میریزم کار نمیکنه
من لینک برنامه چشمک زن رو می زارم اساتید لطف کنید بفرمایید که اشکال از چیست.
در ضمن با sam-ba v2.12 وقتی می خوام از میکرو بخونم برنامه هنگ میکنه ولی پروگرم کردنش رو بدون ارور انجام میده :unh: :(

You can see links before reply

aref3006
14-04-2013, 00:35
شما باید اول کلاک واحد PIO رو فعال کنید:

AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;

ضمناً بهتره به جای استفاده از اعداد، ثوابت دارای نام تعریف کنید:

#define AT91B_LED1 (1<<19)
چون بعداً که پروژه بزرگ می شه، خوندن، فهمیدن و دیباگ سخت می شه.

pirozy
14-04-2013, 09:46
شما باید اول کلاک واحد PIO رو فعال کنید:

AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;ضمناً بهتره به جای استفاده از اعداد، ثوابت دارای نام تعریف کنید:

#define AT91B_LED1 (1<<19)چون بعداً که پروژه بزرگ می شه، خوندن، فهمیدن و دیباگ سخت می شه.
ممنون دوست عزیز
ولی مگه با
*AT91C_PIOA_PER = 0x00000004;
کلاک واحد pio فعال نمی شه؟

sarbaz13
14-04-2013, 11:21
#include <AT91SAM7S128.h>
void delay_s(void);

int main (void) {

*AT91C_PIOA_PER = 0x00080000; // Set in PIO mode
*AT91C_PIOA_OER = 0x00080000; // Configure in Output
while(1)
{
*AT91C_PIOA_SODR = 0x00080000 ; // PB.19 to be set
delay_s();
*AT91C_PIOA_CODR = 0x00080000; // PB.19 to be cleared
delay_s();
}
}
void delay_s (void)
{
unsigned int n;
for (n = 0; n < 7372800; n++);
}



ویرایش فایل ارسالی

pirozy
14-04-2013, 15:05
میشه بگید این چه کار می کنه

*AT91C_PIOA_PER = 0x00080000;
و فرقش با

AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
در چیه؟

sarbaz13
14-04-2013, 17:25
میشه بگید این چه کار می کنه

*AT91C_PIOA_PER = 0x00080000;
و فرقش با

AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;
در چیه؟
فرقی می کنه و شما دقت کنید پرانتز را یادتون رفته که بگذارید.
و این دستور


AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PIOA);

کلاک پورت A را توسط واحد PMC فعال می کند.
این دستور


*AT91C_PIOA_PER = 0x00080000;

واحد PIO را برای پایه ی 19 از پورت A فعال می کند.

بعدم شما کمی دقت کنید و یک شبیه سازی در keil انجام بدهید اشکالات خودتون رو می فهمید.با کد شما اصلا پورت 19 نه روشن میشد نه خاموش و من نمیدونم بر چه اساسی شما کامپیل کردین و انتظار داشتین که LED پایه 19 خاموش و روشن شود.

aref3006
15-04-2013, 00:07
فرقی نمی کنه و فقط شما دقت کنید پرانتز را یادتون رفته که بگذارید.


AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PIOA);


من فکر می کنم این دو کد فرق دارن. کد اولی پین های مورد نظر رو تحت کنترل واحد PIO قرار می ده اما کد دومی به طور کلی کلاک پورت A واحد PIO رو فعال می کنه که به طور پیش فرض برای صرفه جویی در مصرف توان، غیرفعال هست. البته شاید من منظور شما رو اشتباه متوجه شدم.
اما چرا لازم بوده پرانتز استفاده بشه؟ تمام ID های تعریف شده در AT91SAM7X256.h دورشون پرانتز دارن. و اگه هم نداشته باشن، اون موقع باید دور ID پرانتز گذاشت نه کل عبارت، مثلاً

#define SOME_ID 1+2
x = 1 << SOME_ID /*computation error because + has more priority */
در این کد چون دور SOME_ID پرانتز قرار ندادم، نتیجه به جای 8 میشه 4 که غلطه.

sarbaz13
15-04-2013, 00:29
من فکر می کنم این دو کد فرق دارن. کد اولی پین های مورد نظر رو تحت کنترل واحد PIO قرار می ده اما کد دومی به طور کلی کلاک پورت A واحد PIO رو فعال می کنه که به طور پیش فرض برای صرفه جویی در مصرف توان، غیرفعال هست. البته شاید من منظور شما رو اشتباه متوجه شدم.
اما چرا لازم بوده پرانتز استفاده بشه؟ تمام ID های تعریف شده در AT91SAM7X256.h دورشون پرانتز دارن. و اگه هم نداشته باشن، اون موقع باید دور ID پرانتز گذاشت نه کل عبارت، مثلاً

#define SOME_ID 1+2
x = 1 << SOME_ID /*computation error because + has more priority */
در این کد چون دور SOME_ID پرانتز قرار ندادم، نتیجه به جای 8 میشه 4 که غلطه.
سلام دوست عزیز ممنون که تذکر دادین
ولی دوستمون داره با at91sam7s128 کار می کنه نه با at91sam7x256 که شما از کتابخونه at91sam7x256.h استفاده کنید.
بعدم اون پرانتز مهم هست که باشه.
بعدم این حرف با هم شما و هم دوست عزیز آقای pirozy هستم ککه معلوم هست این برنامه را کسی برای ایشان نوشته :mrgreen:
حالا من توصیه می کنم به ایشون که زمانی که از آدرس های پایه ای(Base) ساختمان واحد های PIO استفاده می کنند.( منظور نوشتن کد ها به این شکل AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PIOA); است.)
بهتر است قسمت های startup(منظور واحد های wdtc_wdmr و rstc_rmr ) و speed up(منظور واحدهای ckgr_mor و pmc_mckr و pmc_scer ) را هم مقدار دهی کنند تا برنامه در عمل بهتر تر کار کند.

aref3006
15-04-2013, 07:02
سلام دوست عزیز ممنون که تذکر دادین
ولی دوستمون داره با at91sam7s128 کار می کنه نه با at91sam7x256 که شما از کتابخونه at91sam7x256.h استفاده کنید.


سلام به شما :)
بله من حواسم نبود. البته نکته ای که درباره پرانتزها گفتم فکر می کنم در هر دو هدر صادق باشه


بعدم اون پرانتز مهم هست که باشه.
چرا؟ من که برای لازم نبودنش دلیل آوردم!



بعدم این حرف با هم شما و هم دوست عزیز آقای pirozy هستم ککه معلوم هست این برنامه را کسی برای ایشان نوشته :mrgreen:
حالا من توصیه می کنم به ایشون که زمانی که از آدرس های پایه ای(Base) ساختمان واحد های PIO استفاده می کنند.( منظور نوشتن کد ها به این شکل AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_PIOA); است.)
بهتر است قسمت های startup(منظور واحد های wdtc_wdmr و rstc_rmr ) و speed up(منظور واحدهای ckgr_mor و pmc_mckr و pmc_scer ) را هم مقدار دهی کنند تا برنامه در عمل بهتر تر کار کند.
ممنون بابت این توصیه، اما عمل کردن به اینها مستلزم مطالعه زیاده، مثل ور رفتن با واحد PMC. ولی اینکه چرا باید تنظیمات پیش فرضشون رو تغییر داد کلاً یه بحث دیگه ست.
در مقابل آنچه بنده گفتم توصیه نبود، بلکه انجامش برای کار کردن پروژه ایشون ضروریه. اگه اشتباه می گم بفرمایید.

برای پیش گیری از سوء تفاهم عرض کنم کل تجربه عملی من درباره میکروکنترلها محدود به 2 ماه گذشته هست. هدفم از نوشتن در انجمن این میکرو هم فقط دو چیزه: کمک به دوستان و افزایش دانش خودم. و صد البته دربرابر اساتید بزرگوار ادعایی ندارم :wink:

pirozy
15-04-2013, 09:42
#include <AT91SAM7S128.h>
void delay_s(void);

int main (void) {

*AT91C_PIOA_PER = 0x00080000; // Set in PIO mode
*AT91C_PIOA_OER = 0x00080000; // Configure in Output
while(1)
{
*AT91C_PIOA_SODR = 0x00080000 ; // PB.19 to be set
delay_s();
*AT91C_PIOA_CODR = 0x00080000; // PB.19 to be cleared
delay_s();
}
}
void delay_s (void)
{
unsigned int n;
for (n = 0; n < 7372800; n++);
}


ویرایش فایل ارسالی
با سلام
دوست عزیز کد شما رو هم پروگرم کردم کار نکرد اصلا اشکال از چیه ؟
ولی تو شبیه سازی کار می کنه
اقا دیگه دیونه شدم :unh:
سخت افزار که فکر نکنم مشکلی داشته باشه چون با usb پروگرم می کنم و تو ویندوز 7 اونو به عنوان یه com مجازی می شناسه و با sam-ba هم پروگرم میشه
واسه led هم از پین 19 یه سیم به مثبت مثبت led وصل کردم و منفی led رو هم گراند مدار وصل کردم خوب اشکالش چیه که کار نمیکنه؟ :x

aref3006
16-04-2013, 03:41
با سلام
دوست عزیز کد شما رو هم پروگرم کردم کار نکرد اصلا اشکال از چیه ؟
ولی تو شبیه سازی کار می کنه
اقا دیگه دیونه شدم :unh:
سخت افزار که فکر نکنم مشکلی داشته باشه چون با usb پروگرم می کنم و تو ویندوز 7 اونو به عنوان یه com مجازی می شناسه و با sam-ba هم پروگرم میشه
واسه led هم از پین 19 یه سیم به مثبت مثبت led وصل کردم و منفی led رو هم گراند مدار وصل کردم خوب اشکالش چیه که کار نمیکنه؟ :x

از سر کنجکاوی می پرسم، اضافه کردن سطر زیر به ابتدای main() مشکل رو حل نمی کنه؟

AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;شما در کد اولتون این دو چیز رو با هم یکی فرض کرده بودید:
AT91C_BASE_PMC->PMC_PCER
و *AT91C_PIOA_PER
در حالیکه دو چیز متفاوت هستند. در واقع اولی کلاک کل واحد PIO رو می تونه کنترل کنه. اما دومی مشخص می کنه که کدام پینهای بورد در اختیار واحد PIO باشند (یعنی GPIO بشند و بتونید توسط *AT91C_PIOA_SODR و *AT91C_PIOA_CODR مقدارشون رو 0 یا 1 کنید) و کدام پینها در اختیار Peripheral Controller ها باشند (مثل SPI، USART، PWM و...).
به همین خاطر باید همون مقداری که در *AT91C_PIOA_SODR و *AT91C_PIOA_CODR میریزید رو در *AT91C_PIOA_PER قرار بدید و نه مقدار 0x00000004 که باید در AT91C_BASE_PMC->PMC_PCER بریزید.
مگر این که AT91SAM7S128 از لحاظ معماری تفاوت اساسی با AT91SAM7X256 داشته باشه، که مطمئنم این طور نیست!

-- ویرایش: فایلی که ضمیمه کردم نمونه پروژه برای AT91SAM7S64 هست. اول هدر رو تغییر بدید و مجدد کامپایل کنید. بعد تست کنید. امیدوارم مشکلتون حل بشه

pirozy
16-04-2013, 12:12
از سر کنجکاوی می پرسم، اضافه کردن سطر زیر به ابتدای main() مشکل رو حل نمی کنه؟

AT91C_BASE_PMC->PMC_PCER = 1 << AT91C_ID_PIOA;شما در کد اولتون این دو چیز رو با هم یکی فرض کرده بودید:
AT91C_BASE_PMC->PMC_PCER
و *AT91C_PIOA_PER
در حالیکه دو چیز متفاوت هستند. در واقع اولی کلاک کل واحد PIO رو می تونه کنترل کنه. اما دومی مشخص می کنه که کدام پینهای بورد در اختیار واحد PIO باشند (یعنی GPIO بشند و بتونید توسط *AT91C_PIOA_SODR و *AT91C_PIOA_CODR مقدارشون رو 0 یا 1 کنید) و کدام پینها در اختیار Peripheral Controller ها باشند (مثل SPI، USART، PWM و...).
به همین خاطر باید همون مقداری که در *AT91C_PIOA_SODR و *AT91C_PIOA_CODR میریزید رو در *AT91C_PIOA_PER قرار بدید و نه مقدار 0x00000004 که باید در AT91C_BASE_PMC->PMC_PCER بریزید.
مگر این که AT91SAM7S128 از لحاظ معماری تفاوت اساسی با AT91SAM7X256 داشته باشه، که مطمئنم این طور نیست!

-- ویرایش: فایلی که ضمیمه کردم نمونه پروژه برای AT91SAM7S64 هست. اول هدر رو تغییر بدید و مجدد کامپایل کنید. بعد تست کنید. امیدوارم مشکلتون حل بشه

با سلام و تشکر
مثل اینکه این فایل یادت رفته

#include "..\Board.h"

aref3006
16-04-2013, 21:47
خواهش می کنم.
متوجه نشدم که آیا مشکل حل شده؟ یا کامپایل نشد؟

pirozy
16-04-2013, 22:45
خواهش می کنم.
متوجه نشدم که آیا مشکل حل شده؟ یا کامپایل نشد؟

نه دوست عزیز موقع کامپایل می گه این فایل

Board.h
موجود نیست راستم میگه تو فایل هایی که گذاشتی فایلی با این اسم موجود نیسیت.

aref3006
16-04-2013, 23:24
فایل board.h که ضمیمه کردم رو باید کنار پوشه Blinky قرار بدی.
اگه از Keil استفاده می کنی، این مثال به همراه چند مثال دیگه در شاخه زیر موجود هست:
C:\Keil\ARM\Boards\Atmel\AT91SAM7S-EK
(البته با این فرض که Keil رو در C:\Keil نصبش کرده باشی)