شاید تا حالا براتون پیش اومده باشه که بخواهید کدهای دیگرون رو ببینید و تحلیلشون کنید. مثلا خود من واسم جالب بود ببینم دیگران چطور کد می نویسن. دقت کنید منظورم استفاده از عبارات و حرفه ای نوشتن هستش.
شما وقتی بخواهید کد برای یک برنامه بنویسید میایید و از یک کامپایلر استفاده می کنید. بسته به سخت افزار هرکسی یک نوع کد و کامپایلر رو استفاده می کنه. مثلا یکی میاد و AVR رو انتخاب می کنه. بعد میاد و از بین دو تا زبون برامه نویسی C و بسکام، C رو انتخاب می کنه (نشون میده قصدش ادامه دادن برنامه نویسی تو آینده هستش). بعد میاد و از بین کامپایلرا بکی رو انتخاب می کنه. مثلا کدویژن کار رو برای برنامه نویس راحت می کنه. محیطش ساده است. یکی میاد و میره با Atmel stodio کار می کنه یکی میاد. هر کدوم مزیت های خودشو داره اما نکته ای که مهمه اینه که :
مهم نیست با چه زبونی و چه کامپایلری می نوسی، مهم اینه که خوانا بنویسی تا بعدا خودت و دیگران اذیت نشن.
چون اکثرا از کدویژن استفاده می کنند من چند نمونه رو میگم. البته این نکاتی رو که من میگم می تونید تو کامپایلرای دیگه هم استفاده کنید.
1. مقداردهی به رجیسترا :
فرض کنید میخواهید یک پورت رو انتخاب کنید و چند تا از پایه هاشو خاموش کنید یا اصلا یک رجیستری رو انتخاب کردید و دارید باهاش کار می کنید. بهش مقدار میدید. به چن روش میشه این کارو انجام داد. یا عدد معادل دهدهی نوشته بشه یا باینری و یا هگز. مثلا رجیستر ما 8 بیتی هستش و برای مقدار دادن به پورت A از میکروکنترلر ATmega32. خوب حالا چند روش رو تو شکل زیر می تونید ببینید:
1 2 3 |
PORTA = 170 ; PORTA = 0b10101010 ; PORTA = 0xAA ; |
فرض کنید کد رو نوشتید و یکی میاد از شما می پرسه کدوم پایه یک هست (یا مثلا کدوم پایه یک هستش). شما خط اول رو نگاه می کنید !! هیچی ازش فهمیده نمیشه. خط سوم هم خیلی نشون نمیده خودشو. میمونه خط دوم که خوب نشون میده اما یک ذره طولانیه و زیاد هم حرفه ای نیست.
اگر همون بنده خدا کمی اذیت کنه و بگه مثلا پایه 5 رو یک کن، پایه 8 رو 0 کن و …. . اون وقت شما اگر از خط اول و سوم استفاده کرده باشید باید چند دقیقه وقت بزارید و معادلشو پیدا کنید. اگر از دومی استفاده می کنید
کارتون راحته اما گفتم حرفه ای نیست.
یک راه حل رو من بهتون میگم سعی کنید همیشه ازش استفاده کنید. من کد بالارو به یک روش دیگه می نویسم.
1 |
PORTA=(1<<PORTA7) | (0<<PORTA6) | (1<<PORTA5) | (0<<PORTA4) | (1<<PORTA3) | (0<<PORTA2) | (1<<PORTA1) | (0<<PORTA0); |
ظاهر کد بالا کمی سخته. نوشتنش هم طولانی هستش. اما حالا کد خوانا و حرفه ای هست. کد بالا از یک دستور اصلی به اسم شیفت دادن استفاده کرده. دستور شیفت میاد و یک بیت رو به اندازه دلخواه چپ و راست میبره.
جهت اون دو تا علامت هم جهت شیفت رو مشخص می کنه. اگر << باشه یعنی شیفت به راست و >> یعنی شیفت به چپ.
1 |
(1<<PORTA7) |
عبارت بالا میگه یک رو به اندازه PORTA7 تا شیفت بده سمت چپ. حالا این PORTA7 چیه ؟ این تیکه داخل همون هدری که اول برنامه استفاده کردید تعریف شده و مقدارش برابر هست با 7. یعنی این دو تا با هم یکی هستن و هر دو 1 رو به اندازه 7 بیت به سمت چپ شیفت میدن.
1 2 |
(1<<PORTA7) (1<<7) |
حالا اگر چند تا از اینارو با هم استفاده کنید و با هم OR کید ( | ) ، میشه همون مقداری که بابا داشتیم یعنی 0x11.
حالا اگر همون بنده خدا بیاد و این خط رو نگاه کنه میفهمه که هر پایه چه مقداری داره. اگر بخواهید مقدار یک پایه رو همون جا صفر یا یک کنید کافیه صفر یا یک رو شیفت بدید به جای پورت خواسته شده.
1 2 3 4 5 |
DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (1<<DDA4) | (1<<DDA3) | (0<<DDA2) | (1<<DDA1) | (1<<DDA0); // Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=Out Bit2=Out Bit1=Out Bit0=Out DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0); // State: Bit7=P Bit6=P Bit5=P Bit4=P Bit3=0 Bit2=0 Bit1=0 Bit0=0 PORTB=(1<<PORTB7) | (1<<PORTB6) | (1<<PORTB5) | (1<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); |
حالا تو یک جای برنامه می خواهید با این روش یک بیت رو صفر یا یک کنید. همه می دونیم وقتی یک بیت با یک منطقی OR بشه، حاصل یک منطقی هست و وقتی یک بیت (هر چی میخواد باشه) یا صفر منطقی AND بشه، حاصل صفر میشه. (بدون توجه به اینکه چی بوده).
برای یک کردن کافیه اون عددتون را با یکی که به مقدار لازم شیفت دادین OR کنید. مثلا :
1 |
PORTA |= (1<<3) ; DDRB |= (1<<6) ; |
همین، به سادگی اون بیت مورد نظرتون یک میشه و دیگه نیازی نیست که برید و از نو مقدار براش حساب کنید. عبارت بالا هم میگه که PORTA برابر است با PORTA ار (OR) شده با عدد جلوی مساوی.
برای صفر کردن هم از دستور زیر استفاده کنید :
1 |
PORTA &= ~(1<<7) ; DDRB &= ~(1<<4) ; |
علامت ~ میاد و بیت رو مکمل می کنه یعنی یک رو صفر و صفر رو یک می کنه. بعدش ما یک عدد 8 بیتی داریم که بیت مورد نظر ما توش صفره و بقیه یک هستن. این عدد بوجود آمده اگر در عدد دلواهی مثلا PORTA ، بیاد و AND بشه اون جایگاه بیت مورد نظر صفر میشه (چون هر چی بوده با صفر AND شده و حالا صفر هست) و بقیه بدون تغییر باقی میمونن.
حالا یکی میاد میگه چه کاریه بیاییم و از دستور پایین استفاده کنیم :
1 2 |
PORTA.4=1; DDRB.3=0; |
از این کار هم میشه استفاده کرد اما بهتون بگم وقتی برید سراغ کامپایلرای دیگه مثل keil برای ARM یا اگر یک برنامه نویس حرفه ای برنامه تون رو ببینه، به مشکل بر میخورید !!! همین قسمت تو خودش چند تا نته داشت اما همش شد 1 !!!!
تو قسمت بعدی نکات دیگه رو خواهم گفت ..
مهمان
تفاوت این دو تا چیه؟؟
من امتحان کردم فرقی نکرد!
DDRA |= (1<<DDRA0);
DDRA = (1<<DDRA0);
اینا چه فرقی دارن؟؟؟
http://uplod.ir/ndps37vlzxas/DDRA.mp4.htm
مدیر سایت
کد خط 1 : تو کدنویسی c کاراکتر | یعنی OR بیتی ( & یعنی AND بیتی )
درباره این دو تو نت مطالب زیاده، اما خلاصه بگم که وقتی میخوای مقدار یه بیت ( بیت DDRA0 ) از یک بایت ( رجیستر DDRA ) رو تغییر بدی ( در این جا : 1 کنی )، باید اینطوری کد بزنی.
این مطلب هم فک کنم مرتبط باشه : تغییر و یا خوندن یه بیت از یک متغیر
اما کد خط 2 : در این جا مقدار بیت فوق 1 میشه، اما مقدار بقیه بیت ها 0 میشه.!!!
مهمان
ممنون از شما! اینم مفید بود –> [این مطلب هم فک کنم مرتبط باشه : تغییر و یا خوندن یه بیت از یک متغیر]
یه سوال دیگه حالا نمیدونم شاید اینم تو مطالب قبل گذاشته باشید
اگه پورت ها رو مقدار دهی نکنیم مقدارشون ۰ هست یا ۱ ؟
مدیر سایت
طبیعتا باید 0 باشه ولی خب میتونی دیتاشیت رو هم بررسی کنی، مقدار پیشفرض رو ذکر کرده برا هر رجیستر.
مهمان
Tri-state (Hi-Z)
این یعنی همون High impedance خودمون؟
مدیر سایت
بله / وضعیت 3 حالته : 0، 1 و High impedance
مهمان
سلام
تو این جا راست و چپ رو برعکس گفتین؟!
جهت اون دو تا علامت هم جهت شیفت رو مشخص می کنه. اگر <> یعنی شیفت به راست.
نه؟
مدیر سایت
سلام – اصلاح شد – ممنون.
مهمان
سلام
یه سوال داشتم
اگه بخوایم به روش شیفت دادن کل بیت های یک ÷ورت مثلا هشت بیت یا 16 بیتی را یک کنیم چطوری میشه نوشت
یعنی مثالهای ک زدید برای یک یا صفر کردن تک پین بود حالا برا همش یعنی باید تک تک شیفت بدم بعد اور کنم؟؟
مرسی
مهمان
سلام خدا خیرت بده
مهمان
سلام میشه یه پروژه داخل کد ویژن بنویسین که از ۴ تا سون سگمنت استفاده کنه و کیبورد ،یه دکمه رو که روی کیبورد فشار بدیم روی سون سگمنت اول نشون بده دکمه بعدیو که بزنیم عدد اول بره روی سون سگمنت دوم و عدد جدید بره روی سون سگمنت اول بعد از ۴ بار تکرار این عمل از نو شروع کنه
مهمان
سلام میشه یه پروژه داخل کد ویژن بنویسین که از ۴ تا سون سگمنت استفاده کنه و کیبورد ،یه دکمه رو که روی کیبورد فشار بدیم روی سون سگمنت اول نشون بده دکمه بعدیو که بزنیم عدد اول بره روی سون سگمنت دوم و عدد جدید بره روی سون سگمنت اول بعد از ۴ بار تکرار این عمل از نو شروع کنه
مهمان
سلام من یک ای سی atmega328p دارم ولی نمیتونم تو کد ویژن معرفیش کنم مینویسم <include <mega328p.h# ولی ارور میده
نمیدونم چرا لطفا راهنمایی کنید تا کد درستشو بنویسم 
مدیر سایت
سلام
یه پروژه جدید ایجاد کن – از کدویزارد میکرو مد نظرتو انتخاب کن و …
مهمان
خدا خیرت بده
امیدوارم هم خودت هم سایتت همیشه پاینده باشید
مهمان
سلام
ایا تم ها ی آماده هم برای کدویژن هست؟؟
مدیر سایت
سلام
من ندیدم – سرچ کنید
مهمان
آقا من میخوام back ground صفحمو تو کد ویزن سیاه کنم چون سفید باشه اذیت میکنه چشامو
چیکا کنم سفید شه؟
مدیر سایت
تغییر رنگ پس زمینه کدویژن ( تغییر تم کدویژن ، یا همونی که گفتی
)
setting > editor > Text > Default Background Color
مهمان
return 7
البته
اشتباه تایپ شد
مهمان
آهان،فهمیدم



;if( ( PINE | ~(1<<۴) )!=۰xff ) return 4
اما حقیقتا،اصن جرات نمیکنم بهش نگا کنم،آدم وحشت میکنه از این جمله
راه ساده تری ندارین
مهمان
سلام،اولا دمتون گرم با این سایتتون


دوما مطلب خیلی خوبی بود
و اما حالا اصل کاری:
اگه ما بخوایم این کد رو به این شکلی که شما گفتین استفاده کنیم،باید چی کار کنیم:
if(PINE.4==0) return 7;
منظورم اینه که بدون این نقطه و تنها با عملگراهای منطقی مثل or و and چه جوری میشه اینو نوشت؟
مهمان
سلام مهندس،میشه بیشتر توضیح بدی این روش رو برام؟چون دقیقا موافقم با شما که خوانا و کاربردی تر،و البته خط های برنامه کمتر و در نتیجه سرعت اجرا بالاتر می شود.
من نحوه شیفت دادن و and و or و not کردناشو نمیفهمم
توضیحات خوب بودن و لی اگر امکانش هست چنتا مثال دیگه بزنی ممنونت میشم
در کل برای پیشنهادت در این روش تشکر میکنم
نویسنده این مطلب
نحوه شیفت دادن و عملیاتی که گفتید معروف هستند به عملیات منطقی. یک سرچ کوچولو بزنید در موردش بیشتر آشنا میشید.
جدا از سرعت و خوانا تر شدن کد، شما تو کامپایلرای دیگه مثل keil و atmel studio هم دیگه اذیت نمیشی.
مثال هم خودت بشین کدایی که تا حالا زدی رو به این شکل در بیار.
نویسنده این مطلب
ببین زبون برنامه نویسی C هستش. اما کامپایلر کدویژن ظاهر قشنگی داره و استفاده ازش راحت هستش. شرکت hp از یک سری کدهایی استفاده می کنه تا برنامه نویسا اذیت نشن !!
مثلا همین که بعد از رجیستر نقطه میزاری و شماره بیت رو می نویسی. اگر با کسی که نرم افزار خونده صحبت کنی و این رو نشونش بدی، از این کار سر در نیماره. جون فقط تو کدویژنه که اینجوریه !! کدویزارد خود hp هم تو ورژنای جدید روشی که من گفتم رو پیشنهاد میکنه.
تو کامپایلرای دیگه از این روش استفاده نمیشه و از روشی که گفتم استفاده می کنن. توی یک برنامه چشمک زن و کوتاه مشکلی نداره، اما سعی کن که این روشی که گفتم رو پیاده کنی تا تو کامپایلرای دیگه هم به مشکل برنخوری.
مدیر سایت
یه چیز…
تو آخر مطلب گفتی کد ها به صورت زیر نباشه
PORTA.4=1;
DDRB.3=0;
چون
“وقتی برید سراغ کامپایلرای دیگه مثل keil برای ARM یا اگر یک برنامه نویس حرفه ای برنامه تون رو ببینه، به مشکل بر میخورید”
دلیلش رو هم میشه بگی لطفا………
مدیر سایت
با اجازت عکس رو آپلود کردم تو سایت….
مدیر سایت
داش محسن عکس ها و فایل ها رو تو خود سایت آپلود کن….الان این اولین عکس مطلبت نمایش داده نمیشه…