نکته ای در کدنویسی:
برای آن که بتوانیم از یک کد با کمترین تغییرات برای آرایش های سخت افزاری مختلف استفاده کنیم، ابتدا می توانیم تعاریفی را برای آرایش سخت افزاری انجام دهیم به گونه ای که در صورت تغییر پورت ها یا پین ها ، نیازی به تغییر در جزییات کد اصلی نباشد. بهتر است تعاریف مربوط به آزایش سخت افزاری را در فایل جداگانه ای در پروژه قرار دهیم.
مثلا فرض کنیم یک LED در AVR با واسطه یک مقاومت به PA3 متصل باشد و بخواهیم کد نویسی برای روشن و خاموش کردن این LED را به یک شکل عمومی بنویسیم. اگر ابتدا تعریف کنیم :
#define LED_PORT PORTA
#define LED_DDR DDRA
#define LED_bp 3
#define LED_bm (1«LED_bp)
در اینصورت برای خروجی کردن پین متصل به LED می توان نوشت:
LED_DDR|=LED_bm;
یک کردن پین متصل به LED:
LED_PORT|=LED_bm;
صفر کردن پین متصل به LED:
LED_PORT&=~LED_bm;
مزیت این روش این است که اگر آرایش سخت افزاری تغییر کند و هر پورت و پین دیگری هم مورد استفاده قرار بگیرد، با تغییر آن تعاریف اولیه می توانیم از یک کد مشترک استفاده کنیم. البته همانطور که قبلا در یکی از پست های آموزشی اشاره شد( https://telegram.me/KnowledgePlus/139 )، استفاده از این روش در مواردی می تواند منجر به کند شدن روند اجرای برنامه شود.
@KnowledgePlus
برای آن که بتوانیم از یک کد با کمترین تغییرات برای آرایش های سخت افزاری مختلف استفاده کنیم، ابتدا می توانیم تعاریفی را برای آرایش سخت افزاری انجام دهیم به گونه ای که در صورت تغییر پورت ها یا پین ها ، نیازی به تغییر در جزییات کد اصلی نباشد. بهتر است تعاریف مربوط به آزایش سخت افزاری را در فایل جداگانه ای در پروژه قرار دهیم.
مثلا فرض کنیم یک LED در AVR با واسطه یک مقاومت به PA3 متصل باشد و بخواهیم کد نویسی برای روشن و خاموش کردن این LED را به یک شکل عمومی بنویسیم. اگر ابتدا تعریف کنیم :
#define LED_PORT PORTA
#define LED_DDR DDRA
#define LED_bp 3
#define LED_bm (1«LED_bp)
در اینصورت برای خروجی کردن پین متصل به LED می توان نوشت:
LED_DDR|=LED_bm;
یک کردن پین متصل به LED:
LED_PORT|=LED_bm;
صفر کردن پین متصل به LED:
LED_PORT&=~LED_bm;
مزیت این روش این است که اگر آرایش سخت افزاری تغییر کند و هر پورت و پین دیگری هم مورد استفاده قرار بگیرد، با تغییر آن تعاریف اولیه می توانیم از یک کد مشترک استفاده کنیم. البته همانطور که قبلا در یکی از پست های آموزشی اشاره شد( https://telegram.me/KnowledgePlus/139 )، استفاده از این روش در مواردی می تواند منجر به کند شدن روند اجرای برنامه شود.
@KnowledgePlus
نکاتی از زبان برنامه نویسی C:
در برنامه نویسی C از طریق اپراتور پیش پردازنده ## در ماکروها می توان عبارت ها را به یکدیگر چسباند یا به اصطلاح Concatenate کرد. مثلا مطابق تعریف ماکرو زیر:
#define P(a,b) a##b
عبارت
P(1,2)
معادل با 12 خواهد بود. یا عبارت
P(abc,d)
معادل با abcd خواهد بود. به عنوان یک مثال پیشرفته تر، مطابق تعریف ماکرو زیر:
#define a(b) void f##b(unsigned char b)
عبارت
a(x)
معادل با عبارت زیر است:
void fx(unsigned char x)
@KnowledgePlus
در برنامه نویسی C از طریق اپراتور پیش پردازنده ## در ماکروها می توان عبارت ها را به یکدیگر چسباند یا به اصطلاح Concatenate کرد. مثلا مطابق تعریف ماکرو زیر:
#define P(a,b) a##b
عبارت
P(1,2)
معادل با 12 خواهد بود. یا عبارت
P(abc,d)
معادل با abcd خواهد بود. به عنوان یک مثال پیشرفته تر، مطابق تعریف ماکرو زیر:
#define a(b) void f##b(unsigned char b)
عبارت
a(x)
معادل با عبارت زیر است:
void fx(unsigned char x)
@KnowledgePlus
نکاتی از زبان برنامه نویسی C:
در برنامه نویسی C معمول است که ثابت های تعریف شده توسط ماکروها با حروف بزرگ نوشته شوند. مثال:
#define MINIMUM 0
#define MAXIMUM 100
#define BUFFER_SIZE 512
همچنین اعضای enum هم معمول است که با حروف بزرگ نوشته شوند. مثال:
enum color{RED,BLUE,GREEN,BLACK,WHITE};
@KnowledgePlus
در برنامه نویسی C معمول است که ثابت های تعریف شده توسط ماکروها با حروف بزرگ نوشته شوند. مثال:
#define MINIMUM 0
#define MAXIMUM 100
#define BUFFER_SIZE 512
همچنین اعضای enum هم معمول است که با حروف بزرگ نوشته شوند. مثال:
enum color{RED,BLUE,GREEN,BLACK,WHITE};
@KnowledgePlus
در سورس های نوشته شده تحت winavr یا AtmelStudio برای خواندن یک بایت از حافظه فلش از pgm_read_byte استفاده می شود که برای مطابقت دادن این سورس ها با CodeVision یا IAR می توانیم از ماکرو زیر استفاده کنیم:
#define pgm_read_byte(x) (*((unsigned char __flash *)(x)))
@KnowledgePlus
#define pgm_read_byte(x) (*((unsigned char __flash *)(x)))
@KnowledgePlus