سلام به دوستان
atmel studio 6 با تمام عشوه گری برنامه نویس ها را به خود جذب می کند.ولی وقتی از کدویژن به atmel studio 6 کوچ می کنیم چند مشکل باعث دلسردی شود.
اول نداشتن یه جادوگر کد و دوم نداشتن کتابخانه های آنچنانی و جامع برای ماژول ها مختلف.
از آنجای که atmel studio 6 به صورت مجانی ارائه می شود (و ای کاش می توانستیم پلاگین برای آن تهیه کنیم) و بسیار عالی عمل می کند. به نظر من به تمام زرق و برق های کدوِیژن می ارزد.پس بیاید دست به دست هم بدهیم و کتابخانه مفید برای atmel studio 6 تهیه کنیم.
کتابخانه DEDACO CODE MASKING به برنامه نویس امکان دسترسی بیتی با روش "ماسک کردن" را می دهد.
ماسک کردن اطلاعات چیست؟
فرض کنید شما می خواهید فقط بیت چهارم پورت A را یک یا صفر کنید.و بقیه بیت ها پورت A تغییر نکنند.
راه حل:
می دانیم که
AND هر عبارت منطقی با عدد صفر منطقی، صفر منطقی می شود
AND هر عبارت منطقی با عدد یک منطقی ، همان عبارت می شود
X = X & 1
0 = X & 0
همچنین
OR هر عبارت منطقی با عدد صفر منطقی، همان عبارت می شود
OR هر عبارت منطقی با عدد یک منطقی ، یک منطقی می شود
1 = X | 1
X = X | 0
پس برای صفر کردن بیت چهارم پورت برنامه زیر را استفاده می کنم
PORTA&=0b11101111;
و برای یک کردن بیت چهارم پورت برنامه زیر را استفاده می کنم
PORTA|=0b00010000;
حالا می توان با استفاده از ماکرو کاربرد راحت تر به ماسک کد ها داد.
\\ DEDACO masking code
#define PORTA_4(bit) ((bfit) == (0) ? (PORTA &=~ 0x10) : (PORTA |= 0x10) )
ماکرو بالا مانند یک تابع است(فقط از لحاظ ظاهر نه عملکرد) که یک مقدار ورودی دریافت می کند.در صورتی که صفر باشد بیت چهارم پورت A را صفر می کن در غیر اینصورت آن را یک می کند.
پس به جای دو دستور بالا می توان به صورت زیر نوشت
PORTA_4(1);
بیت چهارم پورت A یک شد
PORTA_4(0);
بیت چهارم پورت a صفر شد
این دستور تنها در یک سیکل انجام می شود. و دستور خواندن از پورت تنها در دو سیکل انجام می شود.
کتابخانه دسترسی بیتی ریجیستر ها را از اینجا دانلود کنید.
dcm_iobit.h - 19 KB
http://uplod.ir/2fajodwa7h5t/dcm_iobit.h.htm
به مثال های زیر توجه کنید
یک کردن پورت آ بیت 0
[tt]#include <avr/io.h>
#include <C:\...\dcm_iobit.h>
int main(void)
{
DDRA_0( 1 ); // PORTA.0 -> output
PORTA_0( 1 ); // set PORTA.0
}[/tt]
خواندن از پین آ
[tt]#include <avr/io.h>
#include <C:\...\dcm_iobit.h>
int main(void)
{
DDRA_0( 1 ); // PORTA.0 -> output
char a0;
a0 = PINA_0; // a0 <== PINA.0
}[/tt]
تولید شکل موج مربع بر روی پورت آ بیت 0
[tt]#include <avr/io.h>
#include <C:\...\dcm_iobit.h>
#define F_CPU 1000000UL
#include <util\delay.h>
int main(void)
{
while(1)
{
//TODO:: Please write your application code
PORTB_0( !( PINB_0 )); //010101010101010...
_delay_ms(100);
}
}[/tt]
--------------------------------------------------------------------------------
مشکلات DEDACO CODE MASKING
1- نمی توان یک ماکرو را خواندنی و نوشتنی تعریف کرد.
(البته شاید بتوان با گرانبار گردن عملگر "." این عمل را انجام داد)
بقیه مشکلات را دوستان اضافه کنید :redface:
نکات مثبت
1- به تمام ریجیستر ها و متغییر ها قابل گسترش است.(اگر به خاطر بیاورید در کدویژن مشکل دسترسی بیتی به پورت G و ریجستر ها تایمر/کانتر آنالوگ به دیجیتال و ... بود که با این کد قابل حل است)
2- سرعت اجرای بالای دارد (یک سیکل برای نوشتن در خروجی ، دوسیکل برای خواندن از ورودی)
3-مستقل از نوع میکرو است(با تعریف چند ماکرو می توان از این کتابخانه برای میکروهای به غیر از AVR استفاده کرد.)
ارتقای کتابخانه : برای حل مشکل و بهبود عملکرد ماکرو باید از آدرس ، ارجاع و اشاره گر استفاده کرد.(به امید خدا در ورژن بعدی)
توجه
کتابخانه برای atmel studio 6 نوشته شده است و تست شده.همچنین این کتابخانه وابسته به کتابخانه io.h می باشد.در صورتی که کتابخانه io.h را تعریف کنید کامپایلر به شما خطا خواهد داد.
در صورتی که از atmel studio استفاده نمی کنید وارد کتابخانه شوید و عبارت زیر را پاک کنید.
#ifndef _AVR_IO_H_
# error "Include <avr/io.h> instead of this file."
#endif
برای بهبود کتابخانه دسترسی بیتی ما را یاری کنید
atmel studio 6 با تمام عشوه گری برنامه نویس ها را به خود جذب می کند.ولی وقتی از کدویژن به atmel studio 6 کوچ می کنیم چند مشکل باعث دلسردی شود.
اول نداشتن یه جادوگر کد و دوم نداشتن کتابخانه های آنچنانی و جامع برای ماژول ها مختلف.
از آنجای که atmel studio 6 به صورت مجانی ارائه می شود (و ای کاش می توانستیم پلاگین برای آن تهیه کنیم) و بسیار عالی عمل می کند. به نظر من به تمام زرق و برق های کدوِیژن می ارزد.پس بیاید دست به دست هم بدهیم و کتابخانه مفید برای atmel studio 6 تهیه کنیم.
کتابخانه DEDACO CODE MASKING به برنامه نویس امکان دسترسی بیتی با روش "ماسک کردن" را می دهد.
ماسک کردن اطلاعات چیست؟
فرض کنید شما می خواهید فقط بیت چهارم پورت A را یک یا صفر کنید.و بقیه بیت ها پورت A تغییر نکنند.
راه حل:
می دانیم که
AND هر عبارت منطقی با عدد صفر منطقی، صفر منطقی می شود
AND هر عبارت منطقی با عدد یک منطقی ، همان عبارت می شود
X = X & 1
0 = X & 0
همچنین
OR هر عبارت منطقی با عدد صفر منطقی، همان عبارت می شود
OR هر عبارت منطقی با عدد یک منطقی ، یک منطقی می شود
1 = X | 1
X = X | 0
پس برای صفر کردن بیت چهارم پورت برنامه زیر را استفاده می کنم
PORTA&=0b11101111;
و برای یک کردن بیت چهارم پورت برنامه زیر را استفاده می کنم
PORTA|=0b00010000;
حالا می توان با استفاده از ماکرو کاربرد راحت تر به ماسک کد ها داد.
\\ DEDACO masking code
#define PORTA_4(bit) ((bfit) == (0) ? (PORTA &=~ 0x10) : (PORTA |= 0x10) )
ماکرو بالا مانند یک تابع است(فقط از لحاظ ظاهر نه عملکرد) که یک مقدار ورودی دریافت می کند.در صورتی که صفر باشد بیت چهارم پورت A را صفر می کن در غیر اینصورت آن را یک می کند.
پس به جای دو دستور بالا می توان به صورت زیر نوشت
PORTA_4(1);
بیت چهارم پورت A یک شد
PORTA_4(0);
بیت چهارم پورت a صفر شد
این دستور تنها در یک سیکل انجام می شود. و دستور خواندن از پورت تنها در دو سیکل انجام می شود.
کتابخانه دسترسی بیتی ریجیستر ها را از اینجا دانلود کنید.
dcm_iobit.h - 19 KB
http://uplod.ir/2fajodwa7h5t/dcm_iobit.h.htm
به مثال های زیر توجه کنید
یک کردن پورت آ بیت 0
[tt]#include <avr/io.h>
#include <C:\...\dcm_iobit.h>
int main(void)
{
DDRA_0( 1 ); // PORTA.0 -> output
PORTA_0( 1 ); // set PORTA.0
}[/tt]
خواندن از پین آ
[tt]#include <avr/io.h>
#include <C:\...\dcm_iobit.h>
int main(void)
{
DDRA_0( 1 ); // PORTA.0 -> output
char a0;
a0 = PINA_0; // a0 <== PINA.0
}[/tt]
تولید شکل موج مربع بر روی پورت آ بیت 0
[tt]#include <avr/io.h>
#include <C:\...\dcm_iobit.h>
#define F_CPU 1000000UL
#include <util\delay.h>
int main(void)
{
while(1)
{
//TODO:: Please write your application code
PORTB_0( !( PINB_0 )); //010101010101010...
_delay_ms(100);
}
}[/tt]
--------------------------------------------------------------------------------
مشکلات DEDACO CODE MASKING
1- نمی توان یک ماکرو را خواندنی و نوشتنی تعریف کرد.
(البته شاید بتوان با گرانبار گردن عملگر "." این عمل را انجام داد)
بقیه مشکلات را دوستان اضافه کنید :redface:
نکات مثبت
1- به تمام ریجیستر ها و متغییر ها قابل گسترش است.(اگر به خاطر بیاورید در کدویژن مشکل دسترسی بیتی به پورت G و ریجستر ها تایمر/کانتر آنالوگ به دیجیتال و ... بود که با این کد قابل حل است)
2- سرعت اجرای بالای دارد (یک سیکل برای نوشتن در خروجی ، دوسیکل برای خواندن از ورودی)
3-مستقل از نوع میکرو است(با تعریف چند ماکرو می توان از این کتابخانه برای میکروهای به غیر از AVR استفاده کرد.)
ارتقای کتابخانه : برای حل مشکل و بهبود عملکرد ماکرو باید از آدرس ، ارجاع و اشاره گر استفاده کرد.(به امید خدا در ورژن بعدی)
توجه
کتابخانه برای atmel studio 6 نوشته شده است و تست شده.همچنین این کتابخانه وابسته به کتابخانه io.h می باشد.در صورتی که کتابخانه io.h را تعریف کنید کامپایلر به شما خطا خواهد داد.
در صورتی که از atmel studio استفاده نمی کنید وارد کتابخانه شوید و عبارت زیر را پاک کنید.
#ifndef _AVR_IO_H_
# error "Include <avr/io.h> instead of this file."
#endif
برای بهبود کتابخانه دسترسی بیتی ما را یاری کنید

دیدگاه