امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
شروع با کد ویژن و مشکلات اون
نویسنده پیام
joker آفلاین
کاربر با تجربه
****

ارسال‌ها: 798
موضوع‌ها: 67
تاریخ عضویت: آذر ۱۳۸۵

تشکرها : 849
( 3655 تشکر در 908 ارسال )
ارسال: #1
شروع با کد ویژن و مشکلات اون
امروز گفتم بیخیال بیسیک بشم و بیام سراغ کدویژن
ببینید مشکل کد من چیه
اول یک متغیر از نوع Int به اسم i تعریف کردم با مقدار 0
کد:
int i = 0;

بعد خواستم یک حلقه فور بنویسی که مثلا 100 بار یه کاری را انجام بده ، بعد که از حلفه اومد بیرون یه کار دیگه .
کد:
while (1)
{
// Place your code here
for (i=1;i=100;i++)
{

PORTB.0 = 1;
PORTB.1 = 1;
delay_ms(50);

};

PORTB.0 =0;
PORTB.1 = 0;
delay_ms(2150);

};
}

ولی ظاهرا هیچ وقت از حلقه بیرون نمیاد ، و یک وارنینگ هم میده موقع کامپایل تحت عنوان :
Warning:d\F2\abc.c(125): possibly incorrect assignment

پیوست : ا چرا کدها راست چین شدن ؟


edited : توی قسمت for باید حتما بنویسیم بزرگتر یا کوچکترومساوری فلان عدد.!!!
for (i=1;i<=10;i++)
این سی یه حالیه :((

[تصویر:  sajdelogo.gif]
(آخرین ویرایش در این ارسال: ۲۲-مرداد-۱۳۸۹, ۰۰:۲۵:۴۸، توسط joker.)
۲۲-مرداد-۱۳۸۹, ۰۰:۱۴:۱۶
ارسال‌ها
پاسخ
salehjg آفلاین
مدیر بخش
*****

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

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #2
RE: شروع با کد ویژن و مشکلات اون
(۲۲-مرداد-۱۳۸۹, ۰۰:۱۴:۱۶)joker نوشته است: امروز گفتم بیخیال بیسیک بشم و بیام سراغ کدویژن
ببینید مشکل کد من چیه
اول یک متغیر از نوع Int به اسم i تعریف کردم با مقدار 0
کد:
int i = 0;

بعد خواستم یک حلقه فور بنویسی که مثلا 100 بار یه کاری را انجام بده ، بعد که از حلفه اومد بیرون یه کار دیگه .
کد:
while (1)
{
// Place your code here
for (i=1;i=100;i++)
{

PORTB.0 = 1;
PORTB.1 = 1;
delay_ms(50);

};

PORTB.0 =0;
PORTB.1 = 0;
delay_ms(2150);

};
}

ولی ظاهرا هیچ وقت از حلقه بیرون نمیاد ، و یک وارنینگ هم میده موقع کامپایل تحت عنوان :
Warning:d\F2\abc.c(125): possibly incorrect assignment

پیوست : ا چرا کدها راست چین شدن ؟


edited : توی قسمت for باید حتما بنویسیم بزرگتر یا کوچکترومساوری فلان عدد.!!!
for (i=1;i<=10;i++)
این سی یه حالیه :((

سلام
تاحالا با کدویژن کار نکردم اما یه چیزایی از سی بلدم.
این حلقه ای که شما نوشتید دو تا ایراد داره:
- کدویژن رو نمی دونم اما در سی برای مقایسه ی دو مقدار از لحاظ تساوی باید دوتا مساوی قرار دهید یعنی == پس i=100 به i==100 تبدیل شود.
- بنا بر شرط شما متغیر i تازمانی 1 واحد افزایش خواهد یافت که مساوی 100 باشد. پس شرط حلقه اشتباه هست.

حالا اگر می خواهید تا 100 بشمارد:
کد:
for(i = 0 ; i <=100; i++)
(آخرین ویرایش در این ارسال: ۲۲-مرداد-۱۳۸۹, ۰۱:۳۰:۴۱، توسط salehjg.)
۲۲-مرداد-۱۳۸۹, ۰۱:۲۱:۴۷
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : joker, محمد حسینی, t3r!p3000, reza555
محمد حسینی آفلاین
کاربر فعال بخش رباتیک
****

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

تشکرها : 974
( 1781 تشکر در 620 ارسال )
ارسال: #3
RE: شروع با کد ویژن و مشکلات اون
برای بلوک for ، اگرم نمیخوای دستوری بنویسی، لااقل آکولاد باز و بسته یا سمی کالن بذار. این که نوشتی یه طوریه!! شایدم جواب بده ولی...

ضمنا حالا که داری میای سراغ c حتما winavr کار کن. حیف وقتی که بذاری واسه کدویژن...

به راه بادیه رفتن، به از نشستن باطل ------------- اگرچه وصل نیابم، بقدر وسع بکوشمRolleyes
۲۲-مرداد-۱۳۸۹, ۰۱:۴۰:۱۵
ارسال‌ها
پاسخ
تشکر شده توسط : salehjg, t3r!p3000, رسول, reza555
HENAS آفلاین
كاربر دو ستاره
**

ارسال‌ها: 170
موضوع‌ها: 6
تاریخ عضویت: فروردین ۱۳۸۹

تشکرها : 131
( 407 تشکر در 152 ارسال )
ارسال: #4
RE: شروع با کد ویژن و مشکلات اون
خوبه راه افتادن بچه ها
- هیچ وقت در طول اجرای یک برنامه یه متغیر رو دوبار مقدار دهی اولیه نکن
- joker این حلقه که شما نوشتی تا بینهایت اجرا میشه چون گفتی هر بار که حلقه اجرا شد یه واحد به i اضافه بشه که حلقت شرط پایان نداره درستش همونیه که صالح گفته یعنی
(++i=1;i<=100;i)

تویه این چرخه ی سردرگم، من میچرخم یا چرخ گردون خدا میدونه!!!!
(آخرین ویرایش در این ارسال: ۲۲-مرداد-۱۳۸۹, ۰۲:۰۳:۲۱، توسط HENAS.)
۲۲-مرداد-۱۳۸۹, ۰۲:۰۱:۳۴
ارسال‌ها
پاسخ
تشکر شده توسط : salehjg, t3r!p3000, reza555
salehjg آفلاین
مدیر بخش
*****

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

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #5
RE: شروع با کد ویژن و مشکلات اون
(۲۲-مرداد-۱۳۸۹, ۰۲:۰۱:۳۴)HENAS نوشته است: - joker این حلقه که شما نوشتی تا بینهایت اجرا میشه چون گفتی هر بار که حلقه اجرا شد یه واحد به i اضافه بشه که حلقت شرط پایان نداره درستش

درسته که روی سخن با آقا joker هست اما تیکه ی بالایی رو قبول ندارم.
شرط اجرای دستورات حلقه true بودن شرط حلقه هست.
برای مثال وقتی شرط حلقه i<=100 باشد ، حلقه تا زمانی ادامه می یابد که i کوچکتر یا مساوی 100 باشه.(یعنی:
کد php:
(i<=100) == true 
)
ولی چون i==100 از همون اولش false هست پس دستورات حلقه اجرا نمیشه.

از دوستان کسی هست که با iar کار کرده باشه(avr)؟
۲۲-مرداد-۱۳۸۹, ۰۲:۱۲:۳۹
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000, رسول, reza555
joker آفلاین
کاربر با تجربه
****

ارسال‌ها: 798
موضوع‌ها: 67
تاریخ عضویت: آذر ۱۳۸۵

تشکرها : 849
( 3655 تشکر در 908 ارسال )
ارسال: #6
RE: شروع با کد ویژن و مشکلات اون
والا اول تصمیم داشتم با AVR STUDIO کار کنم ( بابا بالاسر winavr ) ولی انگار مشکلات زیادی من باهاش توی لود هدر فایلها داشتم
دهن خودموسرویس کردم یک FreeRTOS را بدون استفاده از سمپلهای خودش لود کنم نشد که نشد... و الا اگه مشکلات اسلام و مسلمینش را پیدا میکردم بهتر بود

[تصویر:  sajdelogo.gif]
۲۲-مرداد-۱۳۸۹, ۱۱:۱۴:۱۸
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000, salehjg
HENAS آفلاین
كاربر دو ستاره
**

ارسال‌ها: 170
موضوع‌ها: 6
تاریخ عضویت: فروردین ۱۳۸۹

تشکرها : 131
( 407 تشکر در 152 ارسال )
ارسال: #7
RE: شروع با کد ویژن و مشکلات اون
(۲۲-مرداد-۱۳۸۹, ۰۲:۱۲:۳۹)salehjg نوشته است:
(۲۲-مرداد-۱۳۸۹, ۰۲:۰۱:۳۴)HENAS نوشته است: - joker این حلقه که شما نوشتی تا بینهایت اجرا میشه چون گفتی هر بار که حلقه اجرا شد یه واحد به i اضافه بشه که حلقت شرط پایان نداره درستش

درسته که روی سخن با آقا joker هست اما تیکه ی بالایی رو قبول ندارم.
شرط اجرای دستورات حلقه true بودن شرط حلقه هست.
برای مثال وقتی شرط حلقه i<=100 باشد ، حلقه تا زمانی ادامه می یابد که i کوچکتر یا مساوی 100 باشه.(یعنی:
کد php:
(i<=100) == true 
)
ولی چون i==100 از همون اولش false هست پس دستورات حلقه اجرا نمیشه.

از دوستان کسی هست که با iar کار کرده باشه(avr)؟
بله ایشون درست میگن
من اون نقطه سمی کالن(;) رو با سمی کالن تنها (,) اشتباه گرفتم

اما اجرا نشدن حلقه در اثر خطاست نه اشتباه بودن شرط!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


تویه این چرخه ی سردرگم، من میچرخم یا چرخ گردون خدا میدونه!!!!
(آخرین ویرایش در این ارسال: ۲۲-مرداد-۱۳۸۹, ۱۶:۵۹:۰۸، توسط HENAS.)
۲۲-مرداد-۱۳۸۹, ۱۶:۴۸:۴۴
ارسال‌ها
پاسخ
تشکر شده توسط : salehjg
joker آفلاین
کاربر با تجربه
****

ارسال‌ها: 798
موضوع‌ها: 67
تاریخ عضویت: آذر ۱۳۸۵

تشکرها : 849
( 3655 تشکر در 908 ارسال )
ارسال: #8
RE: شروع با کد ویژن و مشکلات اون
یک سورسی دارم که البته معتبره ولی یه جاش مشکل دارم نمیفهمم چرااینطوری مینویسن:

کد:
// LED
/* enable PB1, LED as output */
DDRC|= (1<<DDC0);

/* set output to Vcc, LED off */
PORTC|= (1<<PC0);

// the transistor on PD7
DDRD|= (1<<DDD7);
PORTD &= ~(1<<PD7);// transistor off
خط آخر خب درست پورت d را داره کنترل میکنه
ولی خط اول چطوری PB1 را با رجیستر DDRC دست خودش گرفته ؟

سوال دوم
کلا توی سورسهای سی چرا اینطوری مینویسن : مثلا : 1<<DDD7
؟

و این یکی چرا اینطوری مینویسن :
کد:
PORTD &= ~(1<<PD7);// transistor off

این &=~ منظورمه :)

[تصویر:  sajdelogo.gif]
(آخرین ویرایش در این ارسال: ۲۶-مرداد-۱۳۸۹, ۱۳:۳۷:۴۵، توسط joker.)
۲۶-مرداد-۱۳۸۹, ۱۳:۳۶:۲۶
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000
salehjg آفلاین
مدیر بخش
*****

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

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #9
RE: شروع با کد ویژن و مشکلات اون
تاپیکی که لینکش پائین گذاشتم فکر کنم مشکلتون رو حل میکنه کامل.

آموزش سی

{
چندتا مثال:(همین طوری نوشتم)
کد:
1<<2 = 100
1<<4 = 10000
کد:
a = 101011
b = 010001

c= a|b
d= a&b

c = 111011
d = 000001

خلاصه:
" | " : or بیتی
" & " : and بیتی
" ~ " : not بیتی
"<< و >> " : شیفت

& و && باهم فرق دارند همان طوری که | و || باهم فرق می کنند.
&& : and منطقی : 10 && 0 = 0 و 10 && 10 = 1
|| : or منطقی : 10 || 0 = 1 و 10 || 10 = 1 و 0 || 0 = 0
مثال | و & هم بالا نوشتم(توی کد)

}
(آخرین ویرایش در این ارسال: ۲۶-مرداد-۱۳۸۹, ۱۶:۵۳:۱۰، توسط salehjg.)
۲۶-مرداد-۱۳۸۹, ۱۶:۴۴:۱۶
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000, reza555
amir00 آفلاین
كاربر دو ستاره
**

ارسال‌ها: 78
موضوع‌ها: 6
تاریخ عضویت: تير ۱۳۸۷

تشکرها : 42
( 129 تشکر در 48 ارسال )
ارسال: #10
RE: شروع با کد ویژن و مشکلات اون
کد php:
for (i=1;!= 100;i++) 


حافظ خلوت نشین دوش به میخانه شد از سر پیمان گذشت بر سر پیمانه شد
(آخرین ویرایش در این ارسال: ۲۷-مرداد-۱۳۸۹, ۰۱:۲۹:۳۹، توسط amir00.)
۲۷-مرداد-۱۳۸۹, ۰۱:۱۹:۰۵
ارسال‌ها
پاسخ
تشکر شده توسط : t3r!p3000, reza555, salehjg, joker
محمد حسینی آفلاین
کاربر فعال بخش رباتیک
****

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

تشکرها : 974
( 1781 تشکر در 620 ارسال )
ارسال: #11
RE: شروع با کد ویژن و مشکلات اون
joker تکلیف خودتو روشن کن! میخوای کدویژن کار کنی یا winavr (avr studio)

می بینم که حسابی با c حال میکنی! Biggrin

نگران نباش اوایل یکم تلخ هست اما کم کم اونقدر برات شیرین میشه که تشویق میشی همینطوری جلوتر بری و بیشتر یاد بگیری. مخصوصا اگه winavr کار کنی

حقیقت اینه که دستورات به ظاهر خوش آب و رنگ بیسکام و در مواردی کدویژن، در نهایت تبدیل به همین کدها میشن!
بیبین مثلا تو کدویژن مینویسیم PORTA.2=1
اما درحقیقت میکرو همچین امکانی نداره که بتونه مستقیم به بیت از رجیستر رو یک کنه و اصلا این دستور که با نقطه به یه بیت دسترسی پیدا کرده در c استاندارد نیست! میکرو برای یک کردن اون پایه میاد PORTA رو با 100 باینری or میکنه. دقت کن که هر بیت که با صفر or بشه تغییر نمیکنه و or شدن با 1 نتیجه 1 شدن میده. این باعث میشه بیت شماره 2 یک بشه و بقیه بیت ها تغییر نکنن.
این کد رو درنظر بگیر : PORTA.2=0
برای صفر کردن بیت شماره 2، PORTA با 1111011 باینری and میشه. بیتی که با 0 and بشه، صفر میشه. این نکته مهمه که باید سمت چپ اونقدر 1 داشته باشیم که کامل رجیستر رو پوشش بده. یعنی اگه مثلا PORTA 8 بیتی باشه و با 011 AND بشه، چهار بیت بالا هم صفر میشن. پس باید همه بیت ها رو با 1 and کنیم به جز بیت مورد نظرمون که میخوایم صفر بشه.
با این توصیفات، برای یک کردن از or و برای صفر کردن از and استفاده میکنیم.
خب حالا ببینیم کدهایی که تو c مخصوصا تو winavr میبینم چطوری عمل میکنن
دستور PORTA.2=1 رو با توجه به توضیحاتی که دادم میتونیم اینطوری بنویسیم:
PORTA = PORTA | 0b100
یا
PORTA |= 0b100
مقدار 0b100 رو میتونیم با شیفت به چپ درست کنیم. عدد 1 رو 2 بیت به چپ شیف میدیم
کد:
1<<2
کدمون اینطوری میشه:
کد:
PORTA |= (1<<2);
دلیلش چیه؟
توی هدرهای هر میکرو اومدن یه سری ثابت معرفی کردن که مکان هر بیت در رجیسترها رو مشخص میکنن. مثل PA2 یعنی بیت 2 از پورت A . اینطوری لازم نیست مکان بیت ها رو حفظ کنیم و کد خواناتر میشه. البته اینجا که مکشلی نیست. بهرحال کد اینطوری میشه:
کد:
PORTA |= (1<<PA2);
فرض کن میخوایم بیت OCIE3A از رجیستر ETIMSK مربوط به وقفه تایمر هست رو یک کنیم. اینطوری :
کد:
ETIMSK |= 1<<OCIE3A;
خب حالا این کد رو در نظر بگیر :
PORTA.2=0
باید and کنیم تا صفر بشه دیگه
کد:
PORTA &= ...
باید با عددی and بشه که بیت شماره 2 اون صفر و بقیه بیت ها 1 باشن. (همه بیت های سمت چپ یا بیت های پر ارزش باید تا بینهایت 1 باشه)
خیلی ساده از همون شیفت به چپ عدد 1 استفاده میکنیم. با این تفاوت که یه not بیتی هم پشتش میذاریم
کد:
PORTA &= ~(1<<PA2);

اگه یه گشتی تو کتابخونه ها بزنی یه دستور دیگه هم میبینی که زیاد استفاده شده: _BV
این ماکرو همون عمل شیفت 1 به چپ رو انجام میده
کد:
PORTA |= _BV(PA2);

خلاصه اینکه هرجا |= دیدی بدون که میخواد 1 کنه و &= هم یعنی صفر کردن.

عجب طوماری نوشتم!! شرمنده اگه زیاد ابتدایی و سطح پایین گفتم. میخواستم اگه کسی میخواد بیاد طرف c و مخصوصا winavr، سردرگم نباشه و شکل علامت تعجب نشه!! چیز عجیبی نداریم! Biggrin

به راه بادیه رفتن، به از نشستن باطل ------------- اگرچه وصل نیابم، بقدر وسع بکوشمRolleyes
(آخرین ویرایش در این ارسال: ۲۷-مرداد-۱۳۸۹, ۱۲:۳۴:۳۹، توسط محمد حسینی.)
۲۷-مرداد-۱۳۸۹, ۱۲:۲۹:۴۰
ارسال‌ها
پاسخ
تشکر شده توسط : joker, reza555, salehjg, t3r!p3000


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  [سوال] مشکلات نویز گرفتن میکرو کنترلر avr عابد مقدسیان 5 1,973 ۱۷-آبان-۱۳۹۷, ۱۸:۰۰:۱۸
آخرین ارسال: alimogmov
  درخواست کمک درباره کد ویژن ashagh21 1 1,882 ۲۸-تير-۱۳۹۳, ۰۰:۵۶:۰۸
آخرین ارسال: md3848
  برنامه کد ویژن ارسال sms kendab 2 2,869 ۲۱-اردیبهشت-۱۳۹۳, ۱۲:۵۵:۳۵
آخرین ارسال: kendab
  آموزش روتین کد ویژن saeed450 1 2,215 ۰۷-تير-۱۳۹۲, ۱۶:۴۹:۵۵
آخرین ارسال: aKaReZa75
  درخواست راهنمایی در مورد کد ویژن sinastar 1 2,402 ۱۱-آبان-۱۳۹۱, ۱۱:۳۲:۰۵
آخرین ارسال: behzady
  کمک برای شروع با کد ویژن SBRE77 3 3,700 ۲۷-اسفند-۱۳۹۰, ۲۱:۳۸:۵۴
آخرین ارسال: sharin
Cool کمک برای شروع alihes 7 4,699 ۲۲-بهمن-۱۳۹۰, ۲۲:۲۸:۵۵
آخرین ارسال: alihes
  [سوال] کمک در مورد lcd , rs232 در کد ویژن و تولید فایل hex برای پروتئوس m.sh.gh 5 8,748 ۳۱-خرداد-۱۳۹۰, ۰۰:۰۷:۳۵
آخرین ارسال: m.sh.gh
  کمک در تبدیل glcd بسکام به کد ویژن javad606 1 3,424 ۲۴-اردیبهشت-۱۳۹۰, ۱۶:۵۷:۰۲
آخرین ارسال: javad606
  دستورات بیسکام در کد ویژن معادل دارند؟؟ amir00 4 4,548 ۱۵-دى-۱۳۸۹, ۲۳:۱۷:۴۸
آخرین ارسال: h0x00i

پرش به انجمن:


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

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