راه اندازی سون سگمنت با AVR

توسط | 15 آذر, 1398 | میکروکنترلر | 26 دیدگاه ها

راه اندازی سون سگمنت با AVR، روش مقدار دهی به پورت IO، نمایش اعداد روی سون سگمنت آند مشترک و کاتد مشترک، تابع برای راه اندازی سون سگمنت، تابع برای راه اندازی سون سگمنت 4 رقمی، حذف delay از برنامه، رفع چشمک زدن سون سگمنت، تمرین راه اندازی سون سگمنت
راه-اندازی-سون-سگمنت-avr

راه اندازی سون سگمنت با AVR مانند راه اندازی آن با میکروکنترلرهای دیگر معمولاً نیاز به کار با پورت های IO دارد. در راه اندازی سون سگمنت با پورت های IO، لازم است پایه های آن پورت ها خروجی و به شیوه ای مشخص مقدار دهی شوند. بنابراین عدد یا حرفی مشخص روی سون سگمنت نمایش داده می شود. روش های مختلفی برای مقدار دهی به پورت های IO و در نتیجه راه اندازی سون سگمنت وجود دارد.

ما در این نوشته به بیان یک روش راه اندازی پورت های IO در AVR برای کار با سون سگمنت 4 تایی می پردازیم. برای درک بهتر این شیوۀ راه اندازی، لازم است با پورت های IO در میکروکنترلرهای AVR آشنایی داشته باشیم. همان طور که خواهیم دید برای راه اندازی سون سگمنت از تابعی به نام SegmentPuts استفاده می کنیم. در این تابع با استفاده از تعدادی ماکرو به رجیسترهای پورت IO مقدار می دهیم. یکی از دلایل استفاده از این ماکروها این است که در توابع برنامه از مقدار دهی مستقیم به رجیسترها پرهیز کنیم.

برنامۀ راه اندازی سون سگمنت با AVR در این نوشته در نرم افزار اتمل استودیو نوشته شده است. در این نوشته برنامه را طوری می نویسیم که در کدویژن نیز قابل استفاده باشد. البته این برنامه صرفاً برای راه اندازی سون سگمنت است و فقط جنبۀ آموزشی دارد. فایل های شبیه سازی در نرم افزار پروتئوس و فایل های برنامه در اتمل استودیو و کدویژن در پیوست قرار دارند. در ادامه ابتدا روش مقدار دهی به رجیسترهای پورت IO را با استفاده از چند ماکرو توضیح می دهیم. سپس راه اندازی سون سگمنت یک رقمی را شرح و در نهایت به راه اندازی سون سگمنت 4 رقمی می پردازیم.

راه اندازی سون سگمنت با آردوینو

فیلم آموزش آردوینو مقدماتی

چند-سون-سگمنت

تصویر 1 – چند نمونه سون سگمنت

مقدار دهی به رجیسترهای پورت IO با ماکرو

در راه اندازی سون سگمنت با AVR با چند ماکرو به رجیسترهای پورت IO در AVR مقدار می دهیم. توجه داشته باشید که در اتمل استودیو نمی توانیم به طور مثال برای یک کردن پایۀ صفرم پورت A بنویسیم: PORTA.0=1. مقدار دهی به رجیسترهای AVR به این روش تنها در کدویژن میسر است. بنابراین با استفاده از ماکروهایی که خواهیم دید، به رجیسترهای پورت IO مقدار می دهیم. این ماکروها هم در اتمل استودیو و هم در کدویژن قابل استفاده اند. به مثال زیر توجه کنید:

#define SegmentDig3DdrNum       DDRA

#define SegmentDig3PortNum      PORTA

#define SegmentDig3Bit          0

#define SegmentDig3Ddr(x)  ((x) ? (SegmentDig3DdrNum |= (1 << SegmentDig3Bit) ) :(SegmentDig3DdrNum&= (~(1 << SegmentDig3Bit)) ));

#define SegmentDig3Port(x) ((x) ? (SegmentDig3PortNum |= (1 << SegmentDig3Bit) ) : (SegmentDig3PortNum&= (~(1 << SegmentDig3Bit)) ));


با استفاده از SegmentDig3Ddr(x) می توانیم پایۀ مشترک رقم سوم (دهگان) سون سگمنت را ورودی یا خروجی کنیم. با استفاده از SegmentDig3Port(x) نیز می توانیم آن را صفر یا یک کنیم. کافی است به جای x صفر یا 1 قرار دهیم. سه سطر اول نیز دیفاین هایی برای استفاده در دو دیفاین آخر است. و در آنها پایۀ مشترک رقم سوم سون سگمنت را روی پایۀ PA0 قرار داده ایم. در دو دیفاین آخر ماکروها به این صورت هستند:

(x) ? (SegmentDig3DdrNum |= (1 << SegmentDig3Bit) ) :      (SegmentDig3DdrNum&= (~(1 << SegmentDig3Bit)))

(x) ? (SegmentDig3PortNum |= (1 << SegmentDig3Bit) ) :      (SegmentDig3PortNum&= (~(1 << SegmentDig3Bit)))

که در اولی اگر x برابر 1 باشد، دستور SegmentDig3DdrNum |= (1 << SegmentDig3Bit) اجرا می شود. این دستور با توجه به دیفاین های سه سطر اول معادل است با:

DDRA|=(1<<0)

اگر x صفر باشد، دستور SegmentDig3DdrNum&= (~(1 << SegmentDig3Bit)) اجرا می شود. که معادل است با:

DDRA&=~(1<<0)

که با این دو دستور مقدار بیت صفرم رجیستر DDRA بدون تغییر بیت های دیگر، یک و صفر می شود. مقدار بیت صفرم رجیستر PORTA نیز به همین روش تغییر می کند. روش استفاده از این دیفاین ها به صورت زیر است. در سطر اول PA0 را خروجی کرده ایم و در سطر دوم به آن مقدار صفر داده ایم.

SegmentDig3Ddr (1);

SegmentDig3Port (0);

راه-اندازی-یک-رقم

تصویر 2 – نمایش عدد 8 در رقم صدگان سون سگمنت آند مشترک با صفر کردن پایه های a تا g و یک کردن پایۀ مشترک

برای بررسی دیفاین های مربوط به پایه های دیگر، فایل های برنامه را که در پیوست قرار دارد، مشاهده نمایید.

نمایش اعداد روی سون سگمنت

برای راه اندازی سون سگمنت با AVR یا هر میکروکنترلر دیگر ابتدا باید روش نمایش روی یک رقم از سون سگمنت را بیاموزیم. برای نمایش اعداد صفر تا 9 و برخی حروف روی سون سگمنت لازم است که برخی سگمنت ها روشن و برخی خاموش باشند. در سون سگمنت های آند مشترک لازم است پایۀ مشترک که آند است به VCC متصل شود. بنابراین برای روشن کردن هر سگمنت، باید پایۀ مربوط را صفر کرد. در سون سگمنت های کاتد مشترک، پایۀ مشترک به زمین وصل می شود. برای روشن کردن هر سگمنت باید به پایۀ مربوط مقدار 1 داد. در جدول 1 وضعیت پایه های هر سگمنت برای نمایش اعداد صفر تا 9 مشخص شده است.

مدار-داخلی-سون-سگمنت

تصویر 3 – مدار داخلی سون سگمنت آند مشترک(سمت راست) و کاتد مشترک (سمت چپ)

Common Cathode Common Anode
a b c d e f g a b c d e f g
0 1 1 1 1 1 1 0 0 0 0 0 0 0 1
1 0 1 1 0 0 0 0 1 0 0 1 1 1 1
2 1 1 0 1 1 0 1 0 0 1 0 0 1 0
3 1 1 1 1 0 0 1 0 0 0 0 1 1 0
4 0 1 1 0 0 1 1 1 0 0 1 1 0 0
5 1 0 1 1 0 1 1 0 1 0 0 1 0 0
6 1 0 1 1 1 1 1 0 1 0 0 0 0 0
7 1 1 1 0 0 0 0 0 0 0 1 1 1 1
8 1 1 1 1 1 1 1 0 0 0 0 0 0 0
9 1 1 1 1 0 1 1 0 0 0 0 1 0 0

جدول 1 – وضعیت پایه های سون سگمنت برای نمایش اعداد صفر تا 9

استفاده از ماکروها برای نمایش اعداد در سون سگمنت

برای نمایش اعداد روی سون سگمنت باید مطابق جدول بالا به پایه های a تا g سون سگمنت مقدار بدهیم. مثلاً برای نمایش عدد 1 در سون سگمنت های آند مشترک، لازم است پایه های b و c صفر و پایه های دیگر سگمنت ها 1 باشد. در این صورت اگر آند (پایۀ مشترک) این سون سگمنت به VCC متصل شده باشد، عدد 1 نمایش داده می شود. برای راه اندازی سون سگمنت با AVR، کافی است از دیفاین هایی که نوشتیم استفاده کنیم. مثلاً برای نمایش عدد 1 در رقم هزارگان (رقم اول) سون سگمنت 4 تایی آند مشترک، باید مطابق دستورهای زیر عمل کنیم.

ابتدا پایه های مورد نظر را خروجی می کنیم. سپس همان طور که گفتیم باید پایۀ مشترک این رقم از سون سگمنت به VCC متصل شود. ما به جای اتصال به VCC، به آن مقدار 1 می دهیم. با صفر کردن پایۀ سگمنت های b و c و یک کردن پایۀ دیگر سگمنت ها، عدد 1 روی رقم مورد نظر نمایش داده می شود. در کدهای زیر OutPut و Set و Clear در ابتدای برنامه دیفاین شده اند.

SegmentDig1Ddr (OutPut);

SegmentADdr (OutPut);

SegmentBDdr (OutPut);

SegmentCDdr (OutPut);

SegmentDDdr (OutPut);

SegmentEDdr (OutPut);

SegmentFDdr (OutPut);

SegmentGDdr (OutPut);

SegmentDig1Port (Set);

SegmentAPort (Set);

SegmentBPort (Clear);

SegmentCPort (Clear);

SegmentDPort (Set);

SegmentEPort (Set);

SegmentFPort (Set);

SegmentGPort (Set);

نمایش-عدد-سون-سگمنت

تصویر 4 – نمایش عدد 1 در رقم هزارگان سون سگمنت

نوشتن تابع برای راه اندازی سون سگمنت با AVR

در ابتدا باید تابعی بنویسیم که عددی را در ورودی بگیرد و با استفاده از ماکروهای پیشین، به پایه های هر سگمنت مقدار بدهد. می توان یک ورودی دیگر برای تعیین رقم مورد نظر تعریف کرد. بنابراین تابعی به صورت زیر خواهیم داشت. چهار شرط اول برای بررسی مقدار Digit است. این متغیر که ورودی تابع است مقادیر 1 تا 4 را می پذیرد. اگر مقدارش 1 باشد، عدد نمایش داده شده در سون سگمنتِ 4 تایی، روی رقم هزارگان خواهد بود. اگر مقدارش 2 باشد، عدد روی رقم صدگان نمایش داده می شود. برای مقادیر 3 و 4 نیز به ترتیب، عدد روی ارقام دهگان و یکان نمایش داده می شود.

در ده شرط بعدی، متغیر Number که ورودی تابع است، مورد بررسی قرار می گیرد. این متغیر می تواند اعداد صفر تا 9 باشد و برای هر کدام از این مقادیر یک شرط تعریف شده است. اگر Number برابر صفر باشد، دستورات شرط اول اجرا می شود، که در آن پایۀ همۀ سگمنت ها به غیر از سگمنت g، صفر می شود. در این صورت عدد صفر روی سون سگمنت نمایش داده می شود. برای شرط های دوم تا دهم نیز به همین شکل اعداد 1 تا 9 نمایش داده می شوند. دستورات درون این شرط ها مطابق جدول 1 برای نمایش روی سون سگمنت آند مشترک هستند. این تابع به شکلی دیگر برای راه اندازی سون سگمنت با STM32 به کار گرفته شده است. برای اطلاعات بیشتر به نوشتۀ «راه اندازی سون سگمنت با STM32، رجیستری و HAL» مراجعه نمایید.

void SegmentPutsDigit (char Number , char Digit)

{

if (Digit == 1)

{

SegmentDig1Port (Set);

SegmentDig2Port (Clear);

SegmentDig3Port (Clear);

SegmentDig4Port (Clear);

}

else if (Digit == 2)

{

SegmentDig1Port (Clear);

SegmentDig2Port (Set);

SegmentDig3Port (Clear);

SegmentDig4Port (Clear);

}

else if (Digit == 3)

{

SegmentDig1Port (Clear);

SegmentDig2Port (Clear);

SegmentDig3Port (Set);

SegmentDig4Port (Clear);

}

else if (Digit == 4)

{

SegmentDig1Port (Clear);

SegmentDig2Port (Clear);

SegmentDig3Port (Clear);

SegmentDig4Port (Set);

}

if (Number == 0)

{

SegmentAPort (Clear);

SegmentBPort (Clear);

SegmentCPort (Clear);

SegmentDPort (Clear);

SegmentEPort (Clear);

SegmentFPort (Clear);

SegmentGPort (Set);

SegmentDpPort (Set);

}

else if (Number == 1)

{

SegmentAPort (Set);

SegmentBPort (Clear);

SegmentCPort (Clear);

SegmentDPort (Set);

SegmentEPort (Set);

SegmentFPort (Set);

SegmentGPort (Set);

SegmentDpPort (Set);

}

else if (Number == 2)

{

SegmentAPort (Clear);

SegmentBPort (Clear);

SegmentCPort (Set);

SegmentDPort (Clear);

SegmentEPort (Clear);

SegmentFPort (Set);

SegmentGPort (Clear);

SegmentDpPort (Set);

}

else if (Number == 3)

{

SegmentAPort (Clear);

SegmentBPort (Clear);

SegmentCPort (Clear);

SegmentDPort (Clear);

SegmentEPort (Set);

SegmentFPort (Set);

SegmentGPort (Clear);

SegmentDpPort (Set);

}

else if (Number == 4)

{

SegmentAPort (Set);

SegmentBPort (Clear);

SegmentCPort (Clear);

SegmentDPort (Set);

SegmentEPort (Set);

SegmentFPort (Clear);

SegmentGPort (Clear);

SegmentDpPort (Set);

}

else if (Number == 5)

{

SegmentAPort (Clear);

SegmentBPort (Set);

SegmentCPort (Clear);

SegmentDPort (Clear);

SegmentEPort (Set);

SegmentFPort (Clear);

SegmentGPort (Clear);

SegmentDpPort (Set);

}

else if (Number == 6)

{

SegmentAPort (Clear);

SegmentBPort (Set);

SegmentCPort (Clear);

SegmentDPort (Clear);

SegmentEPort (Clear);

SegmentFPort (Clear);

SegmentGPort (Clear);

SegmentDpPort (Set);

}

else if (Number == 7)

{

SegmentAPort (Clear);

SegmentBPort (Clear);

SegmentCPort (Clear);

SegmentDPort (Set);

SegmentEPort (Set);

SegmentFPort (Set);

SegmentGPort (Set);

SegmentDpPort (Set);

}

else if (Number == 8)

{

SegmentAPort (Clear);

SegmentBPort (Clear);

SegmentCPort (Clear);

SegmentDPort (Clear);

SegmentEPort (Clear);

SegmentFPort (Clear);

SegmentGPort (Clear);

SegmentDpPort (Set);

}

else if (Number == 9)

{

SegmentAPort (Clear);

SegmentBPort (Clear);

SegmentCPort (Clear);

SegmentDPort (Clear);

SegmentEPort (Set);

SegmentFPort (Clear);

SegmentGPort (Clear);

SegmentDpPort (Set);

}

}

نمایش-چهار-رقم-سون-سگمنت

تصویر 5 – عملکرد چهار شرط ابتدای تابع و تغییر متغیر Digit در نمایش عدد 1

راه اندازی سون سگمنت 4 تایی با تابع

برای نمایش عدد چهار رقمی باید در هر لحظه تنها یکی از ارقام فعال باشد. در همین لحظه باید عدد مربوط به آن رقم، روی سون سگمنت قرار بگیرد. چرا که پایه های مربوط به سگمنت های a تا g بین هر چهار رقم سون سگمنت 4 تایی، مشترک است. راه اندازی سون سگمنت با AVR یا هر میکروکنترلر یا المان دیگر به این صورت است که پایۀ مشترک (آند یا کاتد) یک رقم برای نمایش، مقدار دهی می شود. در همین لحظه عدد مربوط به آن رقم، با مقدار دهی به پایه های a تا g، روی سون سگمنت نمایش داده می شود. در این لحظه باید ارقام دیگر خاموش باشند.

در لحظۀ بعد باید رقم بعدی فعال شود و پایه های a تا g طوری مقدار بگیرند که عدد مربوط به آن رقم، نمایش داده شود. بنابراین با نمایش عدد مربوط به هر رقم در یک لحظه، عدد چهار رقمی نمایش داده می شود. آنچه که مهم است، زمانی است که هر رقم عددی را نمایش می دهد. اگر بخواهیم سون سگمنت با فرکانس مثلاً 60 هرتز رفرش شود، باید مدت زمانی که هر رقم عددی را نمایش می دهد برابر حدوداً 4 میلی ثانیه باشد. در این صورت 16 میلی ثانیه طول می کشد که سون سگمنت رفرش شود. که این رفرش شدن با فرکانس 62.5 هرتز خواهد بود.

به تابع زیر دقت کنید. ابتدا ارقام عدد ورودی تفکیک می شوند. سپس با تأخیرهای 4 میلی ثانیه در تابع SegmentPutsDigit قرار می گیرند. Hezargan و Sadgan و Dahgan و Yekan در ابتدای برنامه دیفاین شده اند. استفاده از این تابع مشکلاتی به همراه دارد. در ادامه آنها را توضیح می دهیم و روشی برای رفع آن بیان می کنیم.

void SegmentPutsNumber(unsigned int Number)

{

unsigned char Dig1Num=0,  Dig2Num=0, Dig3Num=0, Dig4Num=0;

Dig4Num=Number%10;

Dig3Num=(Number/10)%10;

Dig2Num=(Number/100)%10;

Dig1Num= Number/1000;

SegmentPutsDigit (Dig1Num,Hezargan);

_delay_ms(4);

SegmentPutsDigit (Dig2Num,Sadgan);

_delay_ms(4);

SegmentPutsDigit (Dig3Num,Dahgan);

_delay_ms(4);

SegmentPutsDigit (Dig4Num,Yekan);

_delay_ms(4);

}

نمایش-عدد-چهار-مرحله

تصویر 6 – نمایش عدد 1234 روی ارقام سون سگمنت در چهار مرحله

شرح برنامۀ راه اندازی سون سگمنت با AVR

پس از نوشتن دیفاین ها و توابع راه اندازی سون سگمنت، باید آنها را در تابع main به کار ببریم. ابتدا لازم است که پایه های پورت IO که به سون سگمنت متصل هستند، خروجی شوند. این کار با استفاده از ماکروهایی که تعریف کردیم امکان پذیر است. تابع main به صورت زیر خواهد بود. ابتدا پایه های میکروکنترلر که به پایه های مشترک (آندها) ارقام سون سگمنت متصل است، خروجی می شوند. پس از آن پایه های a تا g نیز خروجی می شوند. در ادامه پایه های مشترک یک می شوند و پس از آن پایه های a تا g صفر می شوند. در این صورت در لحظۀ اول عدد 8888 به مدت 1 ثانیه نمایش داده می شود.

در حلقۀ while تابع SegmentPutsNumber نوشته شده که می توانیم در ورودی آن عدد صفر تا 9999 را قرار دهیم. ایرادی که این برنامه دارد، تابع SegmentPutsNumber است. در این تابع چهار تأخیر 4 میلی ثانیه ای وجود دارد. برای نمایش یک عدد چند رقمی روی سون سگمنت، لازم است این تابع دائماً اجرا شود. و اگر دستورات دیگری در حلقۀ while داشته باشیم با دورۀ زمانی 16 میلی ثانیه اجرا خواهند شد. همچنین اگر دستورات درون while زمانبر باشند، دیگر عدد چند رقمی روی سون سگمنت نمایش داده نخواهد شد و چشمک زدن سون سگمنت قابل مشاهده خواهد بود. در ادامه روشی را برای رفع این مشکل بیان می کنیم.

int main(void)

{

SegmentDig1Ddr (OutPut);

SegmentDig2Ddr (OutPut);

SegmentDig3Ddr (OutPut);

SegmentDig4Ddr (OutPut);

SegmentADdr (OutPut);

SegmentBDdr (OutPut);

SegmentCDdr (OutPut);

SegmentDDdr (OutPut);

SegmentEDdr (OutPut);

SegmentFDdr (OutPut);

SegmentGDdr (OutPut);

SegmentDig1Port (Set);

SegmentDig2Port (Set);

SegmentDig3Port (Set);

SegmentDig4Port (Set);

SegmentAPort (Clear);

SegmentBPort (Clear);

SegmentCPort (Clear);

SegmentDPort (Clear);

SegmentEPort (Clear);

SegmentFPort (Clear);

SegmentGPort (Clear);

_delay_ms(1000);

while (1)

{

SegmentPutsNumber(5678);

}

}

نکته: در نرم افزار پروتئوس با تأخیر 4 میلی ثانیه عدد به صورت کامل روی سون سگمنت نمایش داده نمی شود. اما در عمل برنامه به طور صحیح کار می کند (تصویر 8). برای نمایش عدد روی سون سگمنت در پروتئوس باید تأخیرها در تابع SegmentPutsNumber زیاد شوند. که در این صورت هر رقم با تأخیر نمایش داده می شود.

عدم-نمایش-کامل-سون-سگمنت

تصویر 7 – عدم نمایش کامل عدد چهار رقمی

حذف delay از برنامه و رفع چشمک زدن سون سگمنت

همان طور که از متن تابع SegmentPutsNumber مشخص است، اگر این تابع دائماً اجرا نشود، عددی چند رقمی در سون سگمنت نمایش داده نمی شود. این تابع باید در حلقۀ while برنامه به تنهایی اجرا شود تا بتواند عددی چند رقمی را به طور پیوسته نمایش دهد. بنابراین نمی توانیم بگوییم راه اندازی سون سگمنت با AVR به طور کامل انجام شده است. از جمله راه هایی که می توان این مشکل را حل کرد، استفاده از تایمر است. تایمر کانترها در AVR می توانند تعدادی روتین وقفه داشته باشند. می توان تایمر را طوری تنظیم کرد که هر 4 یا 5 میلی ثانیه یک بار، وقفه ای اتفاق بیفتد. در روتین وقفه می توان کدهای درون تابع SegmentPutsNumber را پیاده کرد. طوری که هر بار وقفه ای اتفاق می افتد، یکی از ارقام نمایش داده شود.

ایجاد تأخیر با تایمر در میکروکنترلرها، می تواند روشی برای نمایش اعداد روی سون سگمنت چند رقمی باشد. با این روش دیگر لازم نیست تابعی برای نمایش روی سون سگمنت در حلقۀ while قرار دهیم. همچنین دیگر نیازی به استفاده از delay نیست. بنابراین می توان در حلقۀ while دستورها و توابع را پشت سر هم و بدون تأخیر اجرا کرد. و این دستورها و توابع تأثیری در نمایش سون سگمنت نخواهند داشت. چشمک زدن سون سگمنت نیز با تنظیم صحیح زمان تایمر، مشاهده نخواهد شد. از طرفی اجرای دستورات دیگر حلقۀ while بدون تأخیر انجام می شود. در صورتی که برای نمایش ارقام از وقفۀ تایمر استفاده شود، نیاز است که متغیر Number به صورت volatile عمومی تعریف شود. دلیل volatile بودن این متغیر در نوشته های «انواع متغیر در C» و «کلاس های حافظه در C و C++» تشریح شده است.

نمایش-عدد-چهار-رقمی

تصویر 8 – نمایش عدد چهار رقمی روی سون سگمنت بدون چشمک زدن

تایمر صفر در AVR

تایمر 2 در AVR

تایمر 1 و 3 در AVR

راه اندازی سون سگمنت با AVR در عمل

در تصویر زیر یک سون سگمنت آند مشترک 4 تایی روی برد توسعۀ ATmega64pin یوبرد قرار گرفته است. نحوۀ اتصال پایه های سون سگمنت به میکروکنترلر، مطابق دیفاین های ابتدای برنامه است. همان طور که مشاهده می شود، عدد 5678 که در برنامه قرار داده ایم، و اعداد دیگر به طور صحیح نمایش داده می شود. با توجه به برنامه ای که نوشتیم، سون سگمنت با فرکانس 62.5 هرتز رفرش می شود. اگرچه با این فرکانس در پروتئوس نتوانستیم عدد را کامل مشاهده کنیم، ولی در عمل، عدد بدون مشکل نمایش داده می شود.

نکته: پایه های سون سگمنت می توانند به هر کدام از پایه های پورت IO متصل شوند. کافی است  DDRx و PORTx و بیت هر پورت در دیفاین های ابتدای برنامه، برای پایه های سون سگمنت تغییر کند.

نکته: راه اندازی سون سگمنت کاتد مشترک نیز مانند راه اندازی سون سگمنت آند مشترک است. در سون سگمنت کاتد مشترک باید مقدار پایۀ مشترک هر رقم، صفر شود. همچنین مقدار قرار گرفته روی پایه های a تا g باید مطابق جدول 1 در ستون Common Cathode باشد.

نمایش-سون-سگمنت-در-عمل

تصویر 9 – نتیجۀ راه اندازی سون سگمنت با AVR روی برد توسعۀ AVR یوبرد

چند تمرین برای راه اندازی سون سگمنت

در این بخش برای درک بهتر مطالب گفته شده چند تمرین طرح می کنیم. بهتر است ابتدا تمرین 1 انجام شود و در تمرین های دیگر از کتابخانه ای که حین تمرین 1 ساخته می شود، استفاده شود. به این شکل اگر در کتابخانه ای که حین تمرین 1 ساخته می شود، ایرادی وجود داشته باشد، در طول تمرین های بعدی برطرف می شود.

تمرین 1 – ساخت کتابخانه برای سون سگمنت: با استفاده از مطالب نوشتۀ «ساخت کتابخانه در C» برای سون سگمنت یک کتابخانه بنویسید. این کتابخانه را طوری بنویسید که اعداد اعشاری را نیز نمایش دهد و صفر قبل از عدد نمایش داده نشود.

تمرین 2 – ساخت شمارنده با سون سگمنت: برنامه ای بنویسید که با استفاده از وقفۀ خارجی و نکات بیان شده در نوشتۀ «وقفه در AVR»، با استفاده از کلیدهایی، یک متغیر کم و زیاد شود و مقدار آن در سون سگمنت نمایش داده شود.

تمرین 3 – ولت متر با سون سگمنت: با استفاده از مطالب نوشتۀ «ADC در AVR» و راه اندازی سون سگمنت با AVR که در این نوشته بررسی شد، یک ولت متر دیجتال و یا یک دماسنج دیجیتال بسازید.

تمرین 4 – سون سگمنت به جای LCD: نمایشگر پروژه ای را که در نوشتۀ «موج سینوسی با AVR و DAC0800» انجام شده است، از LCD به سون سگمنت تغییر دهید.

تمرین 5 – نمایش حروف در سون سگمنت: حروف A و b و C و d و E و F را روی سون سگمنت نمایش دهید.

نمایش-حروف-سون-سگمنت

تصویر 10 – نمایش حروف انگلیسی روی سون سگمنت

نتایج راه اندازی سون سگمنت با AVR

  1. برای نمایش اعداد و برخی حروف روی سون سگمنت، لازم است پایه های سون سگمنت مطابق یک الگو مقدار دهی شوند.
  2. یکی از روش های مقدار دهی به رجیسترهای پورت IO، مقدار دهی با استفاده از ماکروهایی است که نوشتیم. استفاده از این ماکروها خوانایی و درک برنامه را بیشتر می کند. همچنین دیگر نیاز نیست در توابع برنامه به رجیسترها مقدار دهی مستقیم داشته باشیم. این ماکروها هم در کدویژن قابل استفاده اند و هم در اتمل استودیو.
  3. راه اندازی سون سگمنت با کدویژن نیز شبیه راه اندازی سون سگمنت با اتمل استودیو است. در برنامه ای که بررسی کردیم، تنها تفاوت هایی که وجود دارد، نوع تعیین فرکانس میکروکنترلر و سینتکس نوشتاری تابع delay است.
  4. مقدار قرار گرفته روی پایه های سون سگمنت آند مشترک برای نمایش یک عدد، Not شدۀ مقدار مشابه آن برای سون سگمنت کاتد مشترک است.
  5. برای راه اندازی سون سگمنت کاتد مشترک باید پایۀ مشترک صفر شود. برای روشن شدن هر سگمنت نیز باید پایۀ مربوط 1 شود.
  6. برای راه اندازی سون سگمنت آند مشترک باید پایۀ مشترک 1 شود. برای روشن شدن هر سگمنت نیز باید پایۀ مربوط صفر شود.
  7. مناسب ترین راه برای برنامه نویسی سون سگمنت چند رقمی، استفاده از یک تابع برای مقدار دهی به پایه های آن متناسب با مقدار نمایش و یک زمان بندی برای نمایش در ارقام سون سگمنت است. طوری که این زمان بندی تأثیری در اجرای برنامه نداشته باشد و روند برنامه نیز در این زمان بندی تأثیری نداشته باشند.
  8. یکی از راه های زمان بندی نمایش ارقام سون سگمنت در راه اندازی سون سگمنت مالتی پلکس، استفاده از تأخیرهایی است که با وقفۀ تایمر به وجود می آیند.

رضا اسدی

رضا اسدی

مدیر یوبرد، خالق و توسعه دهندۀ پلتفرم یوبرد، مجری پروژه های الکترونیکی، فعال در صنعت آسانسور، سابقه فعالیت در صنعت خودرو و همکاری در صنعت پزشکی و صنایع دیگر، آموزگار آموزش های یوبرد

آموزش میکروکنترلرهای ARM سری STM32 یوبرد

آموزش میکروکنترلرهای AVR یوبرد

آموزش میکروکنترلرهایARM سری LPC یوبرد

آموزش Arduino یوبرد

خدمات برنامه نویسی میکروکنترلر یوبرد

راه-اندازی-dac-stm32

راه اندازی DAC در STM32

راه اندازی DAC در STM32، ویژگی های DAC در میکروکنترلرهای STM32F1، بلوک دیاگرام DAC در STM32، اتصالات راه اندازی DAC در میکروکنترلر STM32F107VC، نمونه کد رجیستری راه اندازی واحد DAC در میکروکنترلرهای STM32F1، ساخت موج سینوسی با STM32، راه اندازی مبدل دیجیتال به آنالوگ STM32 با توابع HAL

راه-اندازی-سون-سگمنت-با-آردوینو

راه اندازی سون سگمنت با آردوینو

راه اندازی سون سگمنت با آردوینو UNO، راه اندازی سون سگمنت 4 تایی آند مشترک با آردوینو، اتصال سون سگمنت به آردوینو، کتابخانۀ سون سگمنت برای آردوینو، نمونه کد راه اندازی سون سگمنت، نمایش اعداد در سون سگمنت 4 تایی، نکات راه اندازی سون سگمنت

راه-اندازی-adc-در-آردوینو

راه اندازی ADC در آردوینو

راه اندازی ADC در آردوینو، راه اندازی LCD گرافیکی KS0108 با کتابخانۀ U8g2، اتصالات لازم برای راه اندازی ADC و LCD گرافیکی KS0108، نمونه کد راه اندازی ADC آردوینو، فرمول محاسبۀ دما با TMP36، راه اندازی سنسور دما با آردوینو، راه اندازی فتوسل (LDR) با آردوینو

کنترل موتور براشلس با STM32

از ویژگی‌های تایمرهای Advanced میکروکنترلرهای STM32، امکان ایجاد PWM شش مرحله‌ای است. PWM شش مرحله‌ای در کنترل موتورهای براشلس کاربرد دارد و در STM32 می‌توان با تایمرهای Advanced، موتورهای براشلس را کنترل کرد. PWM شش مرحله‌ای نسبت به روش‌های دیگر کنترل موتور براشلس، عملکرد بهتر، مصرف انرژی کمتر و سطح ایمنی بالاتری را فراهم می‌آورد.

از مباحث آموزش STM32

فیوزبیت EESAVE

برای جلوگیری از پاک شدن محتوای حافظۀ EEPROM داخلی میکروکنترلرهای AVR در هنگام پاک کردن حافظۀ فلش آن، فیوزبیتی به نام EESAVE وجود دارد که باید فعال شود. در غیر این صورت، هر بار که حافظۀ فلش پاک می‌شود، حافظۀ EEPROM نیز پاک می‌شود. فیوزبیت EESAVE به صورت پیش‌فرض غیر فعال است و برای حفظ محتوای EEPROM باید فعال شود. حفظ محتوای EEPROM در بسیاری از پروژه‌ها ضروری است.

از مباحث آموزش AVR

تفاوت Event با وقفه در STM32

در میکروکنترلرهای STM32، علاوه بر وقفه‌های خارجی، Eventهای خارجی هم وجود دارند. تفاوت Event خارجی با وقفۀ خارجی این است که در وقفۀ خارجی، اجرای کد وجود دارد و با اتفاق افتادن آن، کدهای روتین وقفه اجرا می‌شوند، اما در Event خارجی، اجرای کد وجود ندارد و اتفاق افتادن آن فقط باعث می‌شود  میکروکنترلر از مد کاهش مصرف توان خارج شود.

از مباحث آموزش STM32

کلاک خروجی در STM32

در میکروکنترلرهای STM32، قابلیتی وجود دارد که می‌توان از برخی قسمت‌های واحد RCC، یک سیگنال کلاک را انتخاب کرد و آن را روی یک پایۀ خروجی تحت عنوان MCO قرار داد. سیگنال کلاک خروجی می‌تواند از قسمت‌هایی نظیر کلاک سیستم، خروجی PLLها، خروجی اسیلاتورهای HSE و HSI یا از بخش‌هایی دیگر باشد. این سیگنال خروجی می‌تواند برای سنکرون سازی و یا تأمین کلاک یک مدار یا آی سی دیگر به کار رود.

از مباحث آموزش STM32

وقفۀ Pin change در AVR

در برخی میکروکنترلرهای AVR، وقفه‌های Pin change وجود دارند که تفاوتشان با وقفۀ خارجی این است که در وقفۀ خارجی می‌توان تعیین کرد وقفه با لبۀ پایین‌رونده یا بالارونده یا تغییر سطح اتفاق بیفتد، اما وقفۀ Pin change با هر لبه یا تغییر سطح سیگنال اتفاق می‌افتد. همچنین هر وقفۀ خارجی با تحریک تنها یک پایۀ ورودی اتفاق می‌افتد. اما هر وقفۀ Pin change، چند پایۀ ورودی دارد و تحریک هر یک از آنها، باعث اتفاق افتادن وقفۀ Pin change می‌شود.
از مباحث آموزش آردوینو

خواندن فرکانس و دیوتی سایکل با آردوینو

یک روش برای خواندن Duty Cycleو فرکانس موج PWM ، قابلیت Capture تایمرهاست. برای بردهای آردوینو مبتنی بر AVR، کتابخانۀ TimerOne،  فاقد قابلیت کپچر است. اما در کتابخانۀ HardwareTimer میکروکنترلرهای STM32 در آردوینو، می‌توان از کپچر استفاده کرد و مد input PWM تایمرهای STM32 را فعال کرد و دو کپچر را به کار گرفت و فرکانس و دیوتی سایکل موج ورودی را خواند.

از مباحث آموزش آردوینو

اولویت وقفه‌ها در STM32

 

از مباحث آموزش stm32در میکروکنترلرهای STM32، قابلیتی وجود دارد که می‌توان از برخی قسمت‌های واحد RCC، یک سیگنال کلاک را انتخاب کرد و آن را روی یک پایۀ خروجی تحت عنوان MCO قرار داد. سیگنال کلاک خروجی می‌تواند از قسمت‌هایی نظیر کلاک سیستم، خروجی PLLها، خروجی اسیلاتورهای HSE و HSI یا از بخش‌هایی دیگر باشد. این سیگنال خروجی می‌تواند برای سنکرون سازی و یا تأمین کلاک یک مدار یا آی سی دیگر به کار رود.

از مباحث آموزش STM32

26 دیدگاه ها

  1. درود و احترام آیا پروژه هم انجام میدهید ؟؟؟؟؟

    پاسخ
  2. درود و احترام آیا پروژه هم انجام میدهید ؟؟؟؟؟
    در مورد پروژه
    1-ریموت کنترل کد لرن یا هاپینگ کد
    2- استفاده از سیم 800 در پروژه
    3- استفاده از آِسی ATMEGA16 در پروژه
    4- سورس برنامه با کد ویژن نوشته شود که پس از بازدید از سایت شما ملاحظه کردم نمونه کدهای نوشته شده شما توسط کد ویژن هست .
    لطفا پیام خصوصی برای ایمیل بنده بدهید یا تلفن خود را بدهید تا راجب پروژه با شما مشورت کنم .

    پاسخ
  3. سلام ممنون از آموزشتون
    یه سوال دارم
    من تعداد 4 عدد سون سگمنت 4 تایی توی مدارم دارم
    وقتی روشن می کنم :
    اولا سون سگمنت ها به اصطلاح پر پر می زنن؟؟
    دوما، اگر بخوام فرکانس رو بالا ببرم ، سون سگمنت ها کم نور هستن
    چه راهکاری رو پیشنهاد می کنید؟
    ممنون

    پاسخ
    • سلام. خواهش میکنم. فرکانس رو که باید بالا ببرید. برای نور سگمنت ها هم اگه امکانش هست مقدار مقاومت های متصل به سگمنت ها رو کم کنید. 

      پاسخ

یک دیدگاه بنویسید

نشانی ایمیل شما منتشر نخواهد شد.

ضبط پیام صوتی

زمان هر پیام صوتی 4 دقیقه است