فهرست مطالب:

میکروکنترلر AVR با استفاده از کلید فشاری ، LED ها را تغییر دهید. فشردن دکمه: 4 مرحله
میکروکنترلر AVR با استفاده از کلید فشاری ، LED ها را تغییر دهید. فشردن دکمه: 4 مرحله

تصویری: میکروکنترلر AVR با استفاده از کلید فشاری ، LED ها را تغییر دهید. فشردن دکمه: 4 مرحله

تصویری: میکروکنترلر AVR با استفاده از کلید فشاری ، LED ها را تغییر دهید. فشردن دکمه: 4 مرحله
تصویری: LDmicro 11: Serial LCD Temperature Controller (Microcontroller PLC Ladder Programming with LDmicro) 2024, دسامبر
Anonim
Image
Image

در این بخش ، نحوه ایجاد کد برنامه C برای ATMega328PU را یاد می گیریم تا وضعیت سه LED را با توجه به ورودی یک کلید تغییر دهد. همچنین ، ما راه حلی برای مشکل "Switch Bounce" بررسی کرده ایم. طبق معمول ، ما مدار الکتریکی را بر اساس AVR ATmega328 مونتاژ می کنیم تا کار کد برنامه را بررسی کنیم.

مرحله 1: نوشتن و ایجاد برنامه میکروکنترلر AVR در کد C با استفاده از پلت فرم توسعه یکپارچه Atmel Studio 7

نوشتن و ایجاد برنامه میکروکنترلر AVR در کد C با استفاده از پلتفرم توسعه یکپارچه Atmel Studio 7
نوشتن و ایجاد برنامه میکروکنترلر AVR در کد C با استفاده از پلتفرم توسعه یکپارچه Atmel Studio 7
نوشتن و ایجاد برنامه میکروکنترلر AVR در کد C با استفاده از پلت فرم توسعه یکپارچه Atmel Studio 7
نوشتن و ایجاد برنامه میکروکنترلر AVR در کد C با استفاده از پلت فرم توسعه یکپارچه Atmel Studio 7
نوشتن و ایجاد برنامه میکروکنترلر AVR در کد C با استفاده از بستر توسعه یکپارچه Atmel Studio 7
نوشتن و ایجاد برنامه میکروکنترلر AVR در کد C با استفاده از بستر توسعه یکپارچه Atmel Studio 7

اگر Atmel Studio ندارید ، باید آن را بارگیری و نصب کنید.

www.microchip.com/mplab/avr-support/atmel-studio-7

چند خط اول که برخی از کامپایلرها را تعریف می کنیم.

F_CPU فرکانس ساعت را در هرتز تعریف می کند و در برنامه هایی که از کتابخانه avr-libc استفاده می کنند متداول است. در این حالت از روال تاخیر برای تعیین نحوه محاسبه تاخیرهای زمانی استفاده می شود.

#ifndef F_CPU

#تعریف F_CPU 16000000UL // کنترل فرکانس کریستال کنترل (16 مگاهرتز AVR ATMega328P) #endif

#include // header برای فعال کردن کنترل جریان داده روی پین ها. پین ها ، پورت ها و غیره را تعریف می کند.

اولین فایل شامل بخشی از avr-libc است و تقریباً در هر پروژه AVR که روی آن کار می کنید استفاده می شود. io.h CPU مورد استفاده شما را تعیین می کند (به همین دلیل قسمت را هنگام کامپایل مشخص می کنید) و به نوبه خود هدر تعریف IO مناسب برای تراشه ای که ما استفاده می کنیم را شامل می شود. این به سادگی ثابت ها را برای همه پین ها ، پورت ها ، ثبت های ویژه و غیره تعریف می کند.

#include // header برای فعال کردن عملکرد تاخیری در برنامه

util/delay.h کتابخانه شامل برخی از روالها برای تاخیرهای کوتاه است. تابع مورد استفاده ما _delay_ms () است.

ما از defines برای اعلام دکمه و پورت ها و پین های LED خود استفاده می کنیم. اگر LED را به پین ورودی/خروجی دیگری منتقل کنیم یا از AVR متفاوتی استفاده کنیم ، استفاده از دستورات تعریف شده مانند این به ما این امکان را می دهد که فقط 3 خط آسان را پیدا کنیم.

#تعریف BUTTON1 1 // سوئیچ دکمه متصل به پورت B پین 1

#define LED1 0 // Led1 متصل به پین B پین 0 #تعریف LED2 1 // Led2 متصل به پورت C پین 1 #تعریف LED3 2 // Led3 متصل به پورت D پین 2

دو مورد آخر زمان راه اندازی دستورات را در میلی ثانیه تعریف می کنند تا سوئیچ را خاموش کرده و زمان انتظار برای فشار دادن مجدد دکمه را مشخص کنید. زمان خروج باید با زمانی که طول می کشد تا سوئیچ از بالاترین سطح دیجیتالی به کمترین رقم پس از همه پرش ها برسد ، تنظیم شود. رفتار گزاف گویی از سوئیچ به سوئیچ متفاوت است ، اما 20-30 میلی ثانیه به طور معمول کافی است.

#تعریف DEBOUNCE_TIME 25 // زمان منتظر ماندن در حالی که دکمه "bouncing" است

#تعریف LOCK_INPUT_TIME 300 // زمان منتظر ماندن پس از فشار یک دکمه

void init_ports_mcu ()

{

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

برای دکمه ، ما از ثبت PORT و PIN برای نوشتن و خواندن استفاده می کنیم. با AVR ها ، یک پین را با استفاده از ثبت PINx آن می خوانیم و با استفاده از ثبات PORTx آن را به پین می نویسیم. برای فعال کردن کشش ها باید به دکمه ثبت نام بنویسیم.

برای LED ما فقط باید از رجیستر PORT برای نوشتن استفاده کنیم ، اما ما همچنین نیاز به ثبت جهت داده (DDR) داریم زیرا پین های ورودی/خروجی به صورت پیش فرض به عنوان ورودی تنظیم شده اند.

ابتدا ، پین های ورودی/خروجی LED را به عنوان خروجی با استفاده از ثبت جهت داده های آن تنظیم می کنیم.

DDRB = 0xFFu ؛ // همه پین های PORTB را به عنوان خروجی تنظیم کنید.

بعد ، صراحتا پین دکمه را به عنوان ورودی تنظیم کنید.

DDRB & = ~ (1 <

در مرحله بعد ، پین های PORTB برای روشن شدن بالا (+5 ولت) تنظیم شده است. پایه های خروجی در ابتدا زیاد است و از آنجا که LED ما بصورت سیم دار فعال است ، روشن می شود مگر اینکه آن را به صراحت خاموش کنیم.

و در نهایت ، ما مقاومت کششی داخلی را روی پین ورودی که برای دکمه خود استفاده می کنیم فعال می کنیم. این کار به سادگی با خروجی یکی به پورت انجام می شود. هنگامی که به عنوان ورودی پیکربندی می شود ، انجام این کار باعث فعال شدن کشش ها می شود و هنگامی که به عنوان خروجی پیکربندی می شود ، انجام این کار به سادگی یک ولتاژ بالا را خروجی می دهد.

PORTB = 0xFF ؛ // همه پین های PORTB را به عنوان HIGH تنظیم کنید. LED روشن است ،

// همچنین مقاومت Pull Up داخلی اولین پورت PORTB فعال است. DDRC = 0xFFu ؛ // همه پین های PORTC را به عنوان خروجی تنظیم کنید. PORTC = 0x00u ؛ // همه پین های PORTC را کم کنید که آن را خاموش می کند. DDRD = 0xFFu ؛ // همه پین های PORTD را به عنوان خروجی تنظیم کنید. PORTD = 0x00u ؛ // همه پین های PORTD را کم کنید تا خاموش شود. }

دکمه char_state بدون امضا ()

{

این تابع مقدار بولین را نشان می دهد که آیا دکمه فشار داده شده است یا خیر. این بلوک کد است که به طور مداوم در حلقه بی نهایت اجرا می شود و بنابراین وضعیت دکمه را نظرسنجی می کند. این همان جایی است که ما سوئیچ را رد می کنیم.

اکنون ، به یاد داشته باشید که وقتی کلید را فشار می دهیم ، پین خروجی به زمین کشیده می شود. بنابراین ، ما منتظر پایین آمدن پین هستیم.

/ * وقتی دکمه 1 بیت روشن است فشار داده می شود */

اگر (! (PINB & (1 <

ما این کار را با بررسی اینکه آیا بیت واضح است انجام می دهیم. اگر بیت واضح است و نشان می دهد که دکمه فشرده شده است ، ابتدا مدت زمان تعریف شده توسط DEBOUNCE_TIME را که 25 میلی ثانیه است به تأخیر می اندازیم و سپس دوباره وضعیت دکمه را بررسی می کنیم. اگر دکمه بعد از 25 ثانیه فشرده شود ، در نظر گرفته می شود که سوئیچ خاموش شده و آماده ایجاد یک رویداد است ، بنابراین ما 1 را به روال تماس خود برمی گردانیم. اگر دکمه فشرده نشده باشد ، 0 را به روال عادی تماس خود برمی گردانیم.

_delay_ms (DEBOUNCE_TIME) ؛

اگر (! (PINB & (1 <

int main (باطل)

{

روال اصلی ما عملکرد اصلی منحصر به فرد است و از همه توابع جدا شده است. هر برنامه C باید دقیقاً یک تابع main () داشته باشد. اصلی جایی است که AVR هنگام شروع به کار کد شما را اجرا می کند ، بنابراین نقطه ورود برنامه است.

char بدون امضا n_led = 1؛ // در ابتدا شماره LED در حال حاضر روشن است

فراخوانی تابع برای راه اندازی پین های ورودی/خروجی مورد استفاده:

init_ports_mcu ()؛

حلقه بی نهایت جایی که برنامه ما اجرا می شود:

در حالی که (1)

{

هنگامی که button_state یکی را نشان می دهد که دکمه فشار داده شده و خارج شده است ، سپس وضعیت فعلی LED ها را به نوبه خود با توجه به پارامتر n_led تغییر می دهد.

if (button_state ()) // اگر دکمه فشار داده شود ، وضعیت LED را تغییر داده و 300 ثانیه به تأخیر بیندازید (#تعریف LOCK_INPUT_TIME)

{switch (n_led) {case 1: PORTB ^= (1 << LED1) ؛ PORTC ^= (1 << LED2] ؛ زنگ تفريح؛

این دستورات از عملگرهای C bitwise استفاده می کند. این بار از اپراتور منحصر به فرد OR استفاده می کند. وقتی PORT را با مقدار بیت بیتی که می خواهید تغییر دهید XOR می کنید ، آن بیت بدون تأثیر روی بیت های دیگر تغییر می کند.

مورد 2:

PORTC ^= (1 << LED2] ؛ PORTD ^= (1 << LED3] ؛ زنگ تفريح؛ مورد 3: PORTD ^= (1 << LED3] ؛ PORTB ^= (1 << LED1] ؛ n_led = 0 ؛ // تنظیم مجدد شماره LED؛ } n_led ++؛ // چراغ بعدی روشن است _delay_ms (LOCK_INPUT_TIME) ؛ }} return (0)؛ }

بنابراین ، وقتی این برنامه را اجرا می کنید ، باید بتوانید دکمه فشردن LED ها را تغییر دهید. با توجه به تأخیر ما در LOCK_INPUT_TIME ، می توانید دکمه را فشار داده و نگه دارید که باعث می شود LED ها با سرعت ثابت خاموش و روشن شوند (کمی بیشتر از هر 275 میلی ثانیه).

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

مرحله بعدی ساخت پروژه و برنامه نویسی فایل hex در میکروکنترلر با استفاده از برنامه avrdude است.

می توانید فایل main.c را با برنامه در کد c بارگیری کنید:

مرحله 2: انتقال فایل HEX برنامه به حافظه فلش مموری تراشه

انتقال فایل HEX برنامه به حافظه فلش مموری تراشه
انتقال فایل HEX برنامه به حافظه فلش مموری تراشه
انتقال فایل HEX برنامه به حافظه فلش مموری تراشه
انتقال فایل HEX برنامه به حافظه فلش مموری تراشه

AVRDUDE را بارگیری و نصب کنید. آخرین نسخه موجود 6.3 است: فایل zip را بارگیری کنید

ابتدا فایل hex برنامه را در فهرست AVRDUDE کپی کنید. در مورد من ButtonAVR.hex است

سپس ، در پنجره اعلان DOS دستور: avrdude –c [نام برنامه نویس] –p m328p –u –U flash: w: [نام فایل هگز خود را] تایپ کنید.

در مورد من این است: avrdude –c ISPProgv1 –p m328p –u –U فلش: w: ButtonAVR.hex

این دستور فایل hex را در حافظه میکروکنترلر می نویسد.

ویدیو را با شرح مفصل در مورد سوختن فلش حافظه میکروکنترلر تماشا کنید:

در حال سوختن فلش مموری میکروکنترلر…

خوب! در حال حاضر ، میکروکنترلر مطابق دستورالعمل برنامه ما کار می کند. بگذار چک کنیم!

مرحله 3: حذف سخت افزار تغییر حالت

حذف سخت افزار تغییر حالت
حذف سخت افزار تغییر حالت

علاوه بر حذف نرم افزار سوئیچ ، ما می توانیم از روش حذف سخت افزار سوئیچ استفاده کنیم. ایده اصلی پشت چنین تکنیکی استفاده از خازن برای فیلتر کردن تغییرات سریع در سیگنال سوئیچ است.

خازن چه مقداری را باید انتخاب کرد؟ این در نهایت به عملکرد ضعیف دکمه در مورد این مشکل بستگی دارد. برخی از دکمه ها می توانند رفتار پرش فوق العاده ای را نشان دهند ، در حالی که برخی دیگر بسیار کم عمل می کنند. مقدار خازن پایین مانند 1.0 نانوفاراد بسیار سریع واکنش نشان می دهد و تأثیر کمی بر روی تندرست دارد. برعکس ، مقدار خازن بالاتری مانند 220 نانو فاراد (که از نظر خازن هنوز بسیار کوچک است) یک انتقال آهسته از ولتاژ شروع به پایان (5 ولت تا 0 ولت) را فراهم می کند. انتقال با ظرفیت 220 نانو فاراد هنوز به معنای واقعی بسیار سریع است و بنابراین می تواند در دکمه های ضعیف استفاده شود.

مرحله 4: مدار الکتریکی

مدار الکتریکی
مدار الکتریکی
مدار الکتریکی
مدار الکتریکی
مدار الکتریکی
مدار الکتریکی

قطعات را مطابق نمودار شماتیک متصل کنید.

توصیه شده: