Mundarija:

AVR mikrokontroller. Bosish tugmachasi yordamida LEDni yoqing. Bosish tugmachasi: 4 qadam
AVR mikrokontroller. Bosish tugmachasi yordamida LEDni yoqing. Bosish tugmachasi: 4 qadam

Video: AVR mikrokontroller. Bosish tugmachasi yordamida LEDni yoqing. Bosish tugmachasi: 4 qadam

Video: AVR mikrokontroller. Bosish tugmachasi yordamida LEDni yoqing. Bosish tugmachasi: 4 qadam
Video: LDmicro 14: I2C LCD & DS3231 Real-Time Clock (Microcontroller PLC Ladder Programming with LDmicro) 2024, Dekabr
Anonim
Image
Image

Bu bo'limda biz ATMega328PU tugmachasining kalitiga ko'ra uchta LED holatini o'zgartirish uchun C kodini qanday yasashni o'rganamiz. Bundan tashqari, biz "Switch Bounce" muammosining echimini topdik. Odatdagidek, biz dastur kodining ishlashini tekshirish uchun AVR ATmega328 bazasida elektr zanjirini yig'amiz.

1 -qadam: Integral Development Platform Atmel Studio 7 yordamida C kodida AVR mikrokontroller dasturini yozish va yaratish

Atmel Studio 7 integratsiyalashgan rivojlanish platformasi yordamida AV kodli AVR mikrokontroller dasturini yozish va qurish
Atmel Studio 7 integratsiyalashgan rivojlanish platformasi yordamida AV kodli AVR mikrokontroller dasturini yozish va qurish
Atmel Studio 7 integratsiyalashgan ishlab chiqish platformasi yordamida AV kodli mikrokontroller dasturini yozish va qurish
Atmel Studio 7 integratsiyalashgan ishlab chiqish platformasi yordamida AV kodli mikrokontroller dasturini yozish va qurish
Atmel Studio 7 integratsiyalashgan rivojlanish platformasi yordamida AV kodli AVR mikrokontroller dasturini yozish va qurish
Atmel Studio 7 integratsiyalashgan rivojlanish platformasi yordamida AV kodli AVR mikrokontroller dasturini yozish va qurish

Agar sizda Atmel Studio bo'lmasa, uni yuklab olishingiz va o'rnatishingiz kerak.

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

Birinchi qatorlar bizda ba'zi kompilyatorlar tomonidan belgilanadi.

F_CPU Hertzda soat chastotasini belgilaydi va avr-libc kutubxonasidan foydalanadigan dasturlarda keng tarqalgan. Bunday holda, u kechiktirish tartibida vaqtni kechiktirishni qanday hisoblash kerakligini aniqlash uchun ishlatiladi.

#ifndef F_CPU

#define F_CPU 16000000UL // nazorat qiluvchi kristal chastotasini aytib berish (16 MGts AVR ATMega328P) #endif

#include // sarlavhasi pinlar ustidan ma'lumotlar oqimini boshqarishni yoqish uchun. Pim, port va boshqalarni belgilaydi.

Birinchi qo'shilgan fayl avr-libc tarkibiga kiradi va siz ishlayotgan AVR loyihalarida ishlatiladi. io.h siz foydalanadigan protsessorni aniqlaydi (shuning uchun siz kompilyatsiya paytida qismni ko'rsatasiz) va o'z navbatida biz foydalanadigan chip uchun mos keladigan IO ta'rifi sarlavhasini o'z ichiga oladi. Bu sizning barcha pinlaringiz, portlaringiz, maxsus registrlaringiz va boshqalar uchun doimiylarni belgilaydi.

#include // header dasturda kechiktirish funksiyasini yoqish uchun

Kutubxona util/delay.h qisqa kechikishlar uchun ba'zi tartiblarni o'z ichiga oladi. Biz ishlatadigan funksiya _delay_ms ().

Biz tugmachani va LED portlarini va pinlarini e'lon qilish uchun ta'riflardan foydalanamiz. Bu kabi ta'riflardan foydalanish, agar biz LEDni boshqa kirish-chiqish piniga o'tkazsak yoki boshqa AVRdan foydalansak, topish oson bo'lgan 3 qatorni o'zgartirishimiz mumkin bo'ladi.

#define BUTTON1 1 // tugmachasi B pin 1 portiga ulangan

#define LED1 0 // Led1 B piniga ulangan 0 #LED2 1ni aniqlang // Led2 C portiga ulangan 1 #LEDni belgilang 2 2 // Led3 D pin 2 ga ulangan.

Oxirgi ikkita tugmachani boshqa bosishga ruxsat berishdan oldin kalitni o'chirish va kutish vaqtini millisekundlarda belgilash vaqtini belgilaydi. Chiqib ketish vaqtini raqamli balandlikdan raqamli pastgacha o'tish vaqtiga moslashtirish kerak. O'tish harakati har bir kommutatsiyadan farq qiladi, lekin odatda 20-30 millisekund etarli.

#debine DEBOUNCE_TIME 25 // "o'chirish" tugmachasini kutish vaqti

#define LOCK_INPUT_TIME 300 // tugmani bosgandan keyin kutish vaqti

bekor init_ports_mcu ()

{

Bu funksiya dastur boshida biz kiritadigan kirish chiqish pinlarini ishga tushirish uchun atigi bir marta chaqiriladi.

Tugma uchun biz yozish va o'qish uchun PORT va PIN -registrlardan foydalanamiz. AVR -lar yordamida biz PINx -registr yordamida pinni o'qiymiz va PIN -kodga PORTx -registr yordamida yozamiz. Biz tortishishni yoqish uchun tugma registriga yozishimiz kerak.

LED uchun biz faqat yozish uchun PORT registridan foydalanishimiz kerak, lekin bizga ma'lumot yo'nalishi registri (DDR) kerak, chunki kirish -chiqish pinlari sukut bo'yicha kirish sifatida o'rnatiladi.

Birinchidan, biz LEDlarning kirish/chiqish pinlarini ma'lumot yo'nalishi registri yordamida chiqish sifatida o'rnatamiz.

DDRB = 0xFFu; // PORTB ning barcha pinlarini chiqish sifatida o'rnating.

Keyinchalik, tugma pinini kirish sifatida aniq o'rnating.

DDRB & = ~ (1 <

Keyinchalik, uni yoqish uchun PORTB pinlari yuqori (+5 volt) ga o'rnatiladi. Chiqish pimlari dastlab baland, va bizning LED faol yuqori simi bo'lgani uchun, agar biz uni aniq o'chirmasak, u yoqiladi.

Va nihoyat, biz tugmachamiz uchun ishlatiladigan kirish pinidagi ichki tortish qarshiligini yoqamiz. Bu faqat bittasini portga chiqarish orqali amalga oshiriladi. Kirish sifatida konfiguratsiya qilinganida, bu tortishishlarni faollashtirishga olib keladi va chiqish sifatida konfiguratsiya qilinsa, bu shunchaki yuqori kuchlanishni chiqaradi.

PORTB = 0xFF; // PORTBning barcha pinlarini YUQORI qilib belgilang. Led yoqilgan, // shuningdek, birinchi pinli PORTB ichki tortish qarshiligi yoqilgan. DDRC = 0xFFu; // PORTC ning barcha pinlarini chiqish sifatida o'rnating. PORTC = 0x00u; // PORTC -ning barcha pinlarini pastroq qilib qo'ying, u o'chadi. DDRD = 0xFFu; // PORTD ning barcha pinlarini chiqish sifatida o'rnating. PORTD = 0x00u; // PORTD -ning barcha pinlarini pastroq qilib qo'ying, u o'chadi. }

imzosiz char tugmasi_state ()

{

Bu funksiya tugma bosilgan yoki bosilmaganligini ko'rsatuvchi mantiqiy qiymatni qaytaradi. Bu kod bloki doimiy ravishda infinat tsiklida bajariladi va shu bilan tugma holatini so'roq qiladi. Bu erda biz kalitni bekor qilamiz.

Endi esda tutingki, biz kalitni bosganimizda, kirish pimi erga tortiladi. Shunday qilib, biz pin pastga tushishini kutmoqdamiz.

/ * BUTTON1 biti bo'sh bo'lganda tugma bosiladi */

agar (! (PINB va (1 <

Biz buni bit aniqligini tekshirish orqali qilamiz. Agar bit aniq bo'lsa, bu tugma bosilganligini ko'rsatadi, biz avval DEBOUNCE_TIME tomonidan aniqlangan vaqtni 25 msga kechiktiramiz va tugma holatini yana tekshiramiz. Agar 25 soniyadan keyin tugma bosilsa, bu o'chirilgan deb hisoblanadi va voqeani boshlashga tayyor, shuning uchun biz qo'ng'iroq tartibiga 1 ni qaytaramiz. Agar tugma bosilmasa, biz 0 -ni qo'ng'iroq tartibiga qaytaramiz.

_delay_ms (DEBOUNCE_TIME);

agar (! (PINB va (1 <

int main (bekor)

{

Bizning asosiy tartibimiz. Asosiy funktsiya noyob va boshqa funktsiyalardan ajralib turadi. Har bir C dasturida aynan bitta main () funktsiyasi bo'lishi kerak. Asosiysi, AVR sizning kodingizni birinchi marta ishga tushganda ishga tushiradi, shuning uchun bu dasturning kirish nuqtasi.

imzosiz char n_led = 1; // dastlab LED raqami hozir yoniq

Kiritilgan kirish -chiqish pinlarini ishga tushirish uchun funktsiyani chaqirish:

init_ports_mcu ();

bizning dasturimiz ishlaydigan cheksiz pastadir:

vaqt (1)

{

Button_state tugma bosilganini va o'chirilganligini ko'rsatuvchi bittasini qaytarsa, n_led parametriga muvofiq LEDlarning hozirgi holatini o'zgartiradi.

if (button_state ()) // Agar tugma bosilsa, LED holatini o'zgartiring va 300ms kechiktiring (#define LOCK_INPUT_TIME)

{switch (n_led) {1 -holat: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); tanaffus;

Ushbu bayonotlar C bitwise operatorlaridan foydalanadi. Bu safar eksklyuziv OR operatoridan foydalaniladi. Agar siz portni bit qiymatiga o'tkazishni xohlasangiz, bitta bit boshqa bitlarga ta'sir qilmasdan o'zgartiriladi.

2 -holat:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); tanaffus; 3 -holat: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // LED raqamining uzilishini tiklash; } n_led ++; // keyingi LED _delay_ms (LOCK_INPUT_TIME) yonadi; }} qaytish (0); }

Shunday qilib, endi siz ushbu dasturni ishga tushirganingizda, siz LED tugmachalarini bosib o'tishingiz kerak. LOCK_INPUT_TIME tomonidan aniqlangan kechikishimiz tufayli siz tugmachani bosib turishingiz mumkin, bu esa svetodiodlar mos keladigan tezlikda (har 275 msdan biroz ko'proq) o'chadi va o'chadi.

Dasturlash tugallandi.

Keyingi qadam, avrdude dasturi yordamida loyiha va hex faylini mikrokontrolderga yaratish.

Main.c faylini c kodli dastur bilan yuklab olishingiz mumkin:

2 -qadam: dasturning HEX faylini chipning flesh xotirasiga o'tkazish

Dasturning HEX faylini chipning flesh xotirasiga o'tkazish
Dasturning HEX faylini chipning flesh xotirasiga o'tkazish
Dasturning HEX faylini chipning flesh xotirasiga o'tkazish
Dasturning HEX faylini chipning flesh xotirasiga o'tkazish

AVRDUDE -ni yuklab oling va o'rnating. Eng so'nggi versiya 6.3: zip faylini yuklab oling

Birinchidan, dasturning o'n oltilik faylini AVRDUDE katalogiga nusxalash. Mening holimda bu ButtonAVR.hex

Keyin, DOS buyruqlar oynasiga buyruqni kiriting: avrdude –c [dasturchining ismi] –p m328p –u –U flesh: w: [hex faylingizning nomi].

Mening holimda bu: avrdude –c ISPProgv1 –p m328p –u –U flesh: w: ButtonAVR.hex

Bu buyruq olti burchakli faylni mikrokontroller xotirasiga yozadi.

Videoni mikrokontroller flesh xotirasining yonishi haqida batafsil tavsif bilan tomosha qiling:

Mikrokontroller flesh xotirasi yonmoqda…

Ok! Endi mikrokontroller dasturimiz ko'rsatmalariga muvofiq ishlaydi. Keling, buni tekshirib ko'ramiz!

3 -qadam: Uskuna kalitini o'chirish

Uskuna kalitini o'chirish
Uskuna kalitini o'chirish

Dasturiy ta'minotni o'chirishdan tashqari, biz apparatni o'chirish texnikasidan foydalanishimiz mumkin. Bunday texnikaning asosiy g'oyasi - bu uzatish signalidagi tez o'zgarishlarni filtrlash uchun kondansatkichdan foydalanish.

Kondensator qanday qiymatni tanlashi kerak? Bu oxir -oqibat tugmachaning ushbu muammoning qanchalik yomon ishlashiga bog'liq bo'ladi. Ba'zi tugmalar juda zo'r burilish xatti -harakatini aks ettirishi mumkin, boshqalari esa juda kam bo'ladi. 1.0 nanofarad kabi past kondansatör qiymati juda tez ta'sir qiladi, zıplamaya deyarli ta'sir qilmaydi. Aksincha, 220 nanofarad kabi kondansatkichning yuqori qiymati (bu hali kondansatkichlar jihatidan juda kichik) boshidan oxirigacha (5 voltdan 0 voltgacha) sekin o'tishni ta'minlaydi. 220 nanofaradli o'tish tezligi real ma'noda juda tezdir, shuning uchun uni yomon ishlaydigan tugmalarda ishlatish mumkin.

4 -qadam: Elektr davri

Elektr davri
Elektr davri
Elektr davri
Elektr davri
Elektr davri
Elektr davri

Komponentlarni sxematik sxema bo'yicha ulang.

Tavsiya: