والا من در جریان آرم و این مزه ها نیستم ولی از نظر زبون C میگم
-
اگر استراکچر داشته باشید و اشاره گر است
برای مثال
کد:
struct MyType {
int alpha;
double beta;
};
int main()
{
MyType y;
MyType *p;
p = &y;
y.alpha = 33;
p->beta = 2.25; // same effect as y.beta = 2.25;
return 0;
}
اون متغییر y اشاره گر نیست و با نقطه استفاده میشه
ولی اگه متغییر p رو ببینید اشاره گر هست برای همین از -> استفاده شده (هیچ ستاره و ... هم نداره)
پس
نقل قول: اين خط زير رو ببين ( از برنامه اي هست كه نوشتي )
کد:
while( (*(AT91C_RTTC_RTSR) & 0x1) ==0);
به اين شكل بنويسش:
1)
کد:
while( (AT91C_BASE_RTTC->RTTC_RTSR & 0x1) ==0);
اون اولین کد نشون میده متغییر "AT91C_RTTC_RTSR" است ولی کد بعدی اونو زیر مجموعه یک استراکچر بیان می کنه
اگر "AT91C_BASE_RTTC" یک استراکچر است و "AT91C_RTTC_RTSR" زیر مجموعه ی اون پس کد شماره 1 صحیح تر ولی اگه نه کد اولیه درست است
-
اما استفاده از پرانتز
همیشه در اعمال بیتی از پرانتز اتفاده کنید که اشتباه نشه به قول معروف کار از محکم کاری عیب نمی کنه
اولویت عملگر ها رو مشاهده کنید
پس کد شما
کد:
while( (*(AT91C_RTTC_RTSR) & 0x1) ==0);
اگه پرانتز رو بر دارید ابتدا 1 برابر 0 میشه که نتیجه 0 میشه سپس با متغییر"AT91C_RTTC_RTSR" اند میشه
برای همین بدون پرانتز جواب نمیده
اما تفاوتی بین
و این وجود داره
در مورد دوم متغییر است که بهش اشاره میشه (همون کاری که همیشه می کنیم)
ولی اولی به نتیجه هر آنچه که درون پرانتز است اشاره میکنه که الان چیزی نیست ولی اگه مثلا این طوری بود
حالا به 4 بلاک بعد میرفت
---
حالا که گفتم اینم بگم که اگه مثلا این طوری بود
کد:
(char *)AT91C_RTTC_RTSR
این میگه متغییر ما به یه آدرس 8 بیتی اشاره میکنه فارغ از اینکه واقعا به چند بیت اشاره میکنه
برای اطلاعات بیشتر و اشاره به تابع و ...
(۰۱-اردیبهشت-۱۳۹۲, ۲۱:۲۷:۴۱)sharin نوشته است: [ -> ]يكي در مورد inline__ توضيح بدهه لطفا ، اگر تابع رو معمولي بنويسيم چه تفاوتي با زماني دارهه كه از inline__ استفاده مي كنيم؟
http://www.keil.com/support/man/docs/arm...bgcdcb.htm
برای اطلاعات بیشتر مطالعه کنید
Inline function
Inline expansion
Inline functions(KEIL Help)
-
در حالت عادی شما یک تابع که می نویسید در قسمتی از حافظه ذخیره میشه و هر بار که تابع فراخوانی میشه به اون قسمت از حافظه پرش انجام میشه اگه از این دستور استفاده کنید بجای این کار هر بار که تابع فرا خوانی میشه خود تابع جایگزین میشه مثل این که خود شما اون قسمت از کد رو کپی کنید! مثلا 10 جا تابع فرا خوانی شده تو این ده جا کل تابع کپی میشه و هیچ پرشی انجام نمیشه
این یک سری ویژگی هایی داره خلاصه
سرعت رو بالا میبره چون برشی نیست و قسمت های ابتدایی و انتهایی تابع وجود ندارن
به کامپایلر این امکان داده میشه که بهینه سازی رو نسبت به مکان انجام بده و ...
(مشاهده لینک های داده شده)
@مرتضی & بهزاد:
آقایون... ممنونم...
ببخشید یکم دیر رسیدم جواب بدم...
@مرتضی:
آقا مرتضی برام جالب بود... گفتم بگم شما هم شاید خوشتون بیاد...
چند وقت پیش داشتم سورس کد یه پروژه خارجکی رو مرور میکردم..
دیدم طرف توضیح داده که برای افزایش سرعت اجرای یه تابع خاص رو که بهش نیاز بود ، اون تابع رو در sram اجرا میکرد... خیلی برام جالب بود...
الان نتونستم پیداش کنم...
ولی خودمم میخواد بفهمم چطوری کرده این کارو...
نظری دارین آقا مرتضی؟
آقا بهزاد شما چیزی در این مورد میدونید؟
(۰۱-اردیبهشت-۱۳۹۲, ۲۱:۴۸:۱۶)salehjg نوشته است: [ -> ]@مرتضی & بهزاد:
آقایون... ممنونم...
ببخشید یکم دیر رسیدم جواب بدم...
@مرتضی:
آقا مرتضی برام جالب بود... گفتم بگم شما هم شاید خوشتون بیاد...
چند وقت پیش داشتم سورس کد یه پروژه خارجکی رو مرور میکردم..
دیدم طرف توضیح داده که برای افزایش سرعت اجرای یه تابع خاص رو که بهش نیاز بود ، اون تابع رو در sram اجرا میکرد... خیلی برام جالب بود...
الان نتونستم پیداش کنم...
ولی خودمم میخواد بفهمم چطوری کرده این کارو...
نظری دارین آقا مرتضی؟
آقا بهزاد شما چیزی در این مورد میدونید؟
باید ببینیم
خیلی کار ها میشه کرد ولی در کل منظورش این نبوده که کل تابع تو Sram باشه(البته شدنی هم نیست
)
تو avr که سرعت دسترسی به فلش و رم یکی هست!(فکر می کنم
)
به هر حال جالبه دوست دارم ببینم چه کرده! حتما سورس کدش رو پیدا کردید اینجا هم بزارید!
(۰۲-اردیبهشت-۱۳۹۲, ۱۳:۰۲:۰۰)salehjg نوشته است: [ -> ]پیدا کردم
http://www.pro-qwerty.com/files/wav_player_main.c.txt
__ramfunc
چه جالب!
فکر کنم این قابلیت تو AVR نیست
بله این تابع رو توی رم ذخیره میکنه به جای اینکه توی FLASH ذخیره بشه
و بله سرعت رو افزایش میده
ولی خاصیتش بیشتر جایی مشخص میشه که شما می خوای هنگام اجرای برنامه توی FLASH تغییر ایجاد کنی که تابعی که این کار رو میکنه توی رم میاری تا بشه تغییر داد
جالب بود:d
جالب تر اینکه توی برنامه ی شما هست
سرعت اجرا رو می خواسته زیاد کنه؟
بازم از این نکات دیدید بیارید یاد بگیریم
سلام
برای راه اندازی کی پد و نمایش اطلاعات بر روی 7سگمنت
یه برنامه نوشتم ولی نمیدونم مشکلش کجاست رو سخت افزار اجرا نمیشه
کد:
#include <AT91SAM7X256.H>
#include <delay.h>
char seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int main(void)
{
int i;
AT91C_BASE_PMC->PMC_PCER=(1<<AT91C_ID_PIOA);
AT91C_BASE_PIOA->PIO_PER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7);
AT91C_BASE_PIOA->PIO_ODR=(1<<0|1<<1|1<<2|1<<3);
AT91C_BASE_PIOA->PIO_OER=(1<<4|1<<5|1<<6|1<<7);
/////////////////
AT91C_BASE_PMC->PMC_PCER=(1<<AT91C_ID_PIOB);
AT91C_BASE_PIOB->PIO_PER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6);
AT91C_BASE_PIOB->PIO_OER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6);
/////////////////
while(1){
AT91C_BASE_PIOA->PIO_SODR=(1<<4|1<<5|1<<6|1<<7);
AT91C_BASE_PIOA->PIO_CODR=(1<<0|1<<1|1<<2|1<<3);
AT91C_BASE_PIOA->PIO_CODR=(1<<4);
delay_ms(5);
if (AT91C_BASE_PIOA->PIO_CODR==(1<<0)){i=7;}
if (AT91C_BASE_PIOA->PIO_CODR==(1<<1)){i=4;}
if (AT91C_BASE_PIOA->PIO_CODR==(1<<2)){i=1;}
/////////////////
AT91C_BASE_PIOA->PIO_SODR=(1<<4|1<<5|1<<6|1<<7);
AT91C_BASE_PIOA->PIO_CODR=(1<<0|1<<1|1<<2|1<<3);
AT91C_BASE_PIOA->PIO_CODR=(1<<5);
delay_ms(5);
if (AT91C_BASE_PIOA->PIO_CODR==(1<<0)){i=8;}
if (AT91C_BASE_PIOA->PIO_CODR==(1<<1)){i=5;}
if (AT91C_BASE_PIOA->PIO_CODR==(1<<2)){i=2;}
if (AT91C_BASE_PIOA->PIO_CODR==(1<<3)){i=0;}
/////////////////
AT91C_BASE_PIOA->PIO_SODR=(1<<4|1<<5|1<<6|1<<7);
AT91C_BASE_PIOA->PIO_CODR=(1<<0|1<<1|1<<2|1<<3);
AT91C_BASE_PIOA->PIO_CODR=(1<<6);
delay_ms(5);
if (AT91C_BASE_PIOA->PIO_CODR==(1<<0)){i=9;}
if (AT91C_BASE_PIOA->PIO_CODR==(1<<1)){i=6;}
if (AT91C_BASE_PIOA->PIO_CODR==(1<<2)){i=3;}
/////////////////
AT91C_BASE_PIOB->PIO_CODR=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6);
AT91C_BASE_PIOB->PIO_SODR=seg[i];
}
}
هدف این بود این برنامه تو کدویژن رو تو keil پیاده کنم »
کد:
#include <mega8.h>
#include <delay.h>
char seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main(void)
{
int i;
PORTA=0xF0;
DDRA=0xF0;
PORTB=0x00;
DDRB=0xff;
while (1)
{
PORTA=0b11110000;
PORTA.4=0;
delay_ms(5);
if (PINA.0==0){i=7;} //7
if (PINA.1==0){i=4;} //4
if (PINA.2==0){i=1;} //1
PORTA=0b11110000;
PORTA.5=0;
delay_ms(5);
if (PINA.0==0){i=8;} //8
if (PINA.1==0){i=5;} //5
if (PINA.2==0){i=2;} //2
if (PINA.3==0){i=0;} //0
PORTA=0b11110000;
PORTA.6=0;
delay_ms(5);
if (PINA.0==0){i=9;} //9
if (PINA.1==0){i=6;} //6
if (PINA.2==0){i=3;} //3
PORTB=seg[i];
};
}
بدون خطا کامپایل میشه ولی رو سخت افزار جواب نمیده
مقاومت های پول آپ رو هم گذاشتم تاثیری نداشت
سلام
الان کامل بررسی نکردم
آخر شب پست میزنم...
اما گفتم چیزایی که گرفتم، بگم شاید مشکل تنها اونا باشن
خل if های درون حلقه اشتباهه
اگه هدف اینکه یک بودن یک پین خاص از پورت a، بررسی بشه، اشتباهه
Reg&(1<<5) ==1<<5
با این کار یک بودن pa05 یا pb05 بررسی میشه.(بسته به این که رجیستر مال کدوم باشه)
Reg هم باید رجیستر status مربوط به pio باشه ( اسمشو حفظ نیستم... از توی اون هدر فایل میکرو، نگاه کنی مشخصه)
اميد جان خروجي پايه ها رو بافر كن.
شرط هات هم اشتباه هستن.
مثلا اين غلط هست.
کد php:
if (AT91C_BASE_PIOA->PIO_CODR==(1<<3)){i=0;}
بايد اينطوري بنويسي.
براي خوندن پايه:
کد php:
num = AT91C_BASE_PIOA->PIO_PDSR;
if((num & (1<<3)) == (1<<3))
i=0;
سپاس صالح جان+سپاس مرتضی جان:)
الان به اینصورت درسته؟
کد:
#include <AT91SAM7X256.H>
#include <delay.h>
char seg[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
int main(void)
{
int i;
unsigned int k;
AT91C_BASE_PMC->PMC_PCER=(1<<AT91C_ID_PIOA);
AT91C_BASE_PIOA->PIO_PER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6|1<<7);
AT91C_BASE_PIOA->PIO_ODR=(1<<0|1<<1|1<<2|1<<3);
AT91C_BASE_PIOA->PIO_OER=(1<<4|1<<5|1<<6|1<<7);
/////////////////
AT91C_BASE_PMC->PMC_PCER=(1<<AT91C_ID_PIOB);
AT91C_BASE_PIOB->PIO_PER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6);
AT91C_BASE_PIOB->PIO_OER=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6);
/////////////////
while(1){
AT91C_BASE_PIOA->PIO_SODR=(1<<4|1<<5|1<<6|1<<7);
AT91C_BASE_PIOA->PIO_CODR=(1<<0|1<<1|1<<2|1<<3);
AT91C_BASE_PIOA->PIO_CODR=(1<<4);
delay_ms(5);
k = AT91C_BASE_PIOA->PIO_PDSR;
if (k & (1<<0)==(1<<0))
i=7;
k = AT91C_BASE_PIOA->PIO_PDSR;
if (k & (1<<1)==(1<<1))
i=4;
k = AT91C_BASE_PIOA->PIO_PDSR;
if (k & (1<<2)==(1<<2))
i=1;
/////////////////
AT91C_BASE_PIOA->PIO_SODR=(1<<4|1<<5|1<<6|1<<7);
AT91C_BASE_PIOA->PIO_CODR=(1<<0|1<<1|1<<2|1<<3);
AT91C_BASE_PIOA->PIO_CODR=(1<<5);
delay_ms(5);
k = AT91C_BASE_PIOA->PIO_PDSR;
if (k & (1<<0)==(1<<0))
i=8;
k = AT91C_BASE_PIOA->PIO_PDSR;
if (k & (1<<1)==(1<<1))
i=5;
k = AT91C_BASE_PIOA->PIO_PDSR;
if (k & (1<<2)==(1<<2))
i=2;
k = AT91C_BASE_PIOA->PIO_PDSR;
if (k & (1<<3)==(1<<2))
i=0;
/////////////////
AT91C_BASE_PIOA->PIO_SODR=(1<<4|1<<5|1<<6|1<<7);
AT91C_BASE_PIOA->PIO_CODR=(1<<0|1<<1|1<<2|1<<3);
AT91C_BASE_PIOA->PIO_CODR=(1<<6);
delay_ms(5);
k = AT91C_BASE_PIOA->PIO_PDSR;
if (k & (1<<0)==(1<<0))
i=9;
k = AT91C_BASE_PIOA->PIO_PDSR;
if (k & (1<<1)==(1<<1))
i=6;
k = AT91C_BASE_PIOA->PIO_PDSR;
if (k & (1<<2)==(1<<2))
i=3;
/////////////////
AT91C_BASE_PIOB->PIO_CODR=(1<<0|1<<1|1<<2|1<<3|1<<4|1<<5|1<<6);
AT91C_BASE_PIOB->PIO_SODR=seg[i];
}
}
این برنامه هم بدون خطا کامپایل شد ولی رو سخت افزار اجرا نمیشه
مقاومت پول آپ ها رو نیازه بذارم؟
نقل قول: اميد جان خروجي پايه ها رو بافر كن.
بصورت سخت افزاری؟