Съдържание:

AVR микроконтролер. Превключване на светодиодите чрез превключвател с бутон. Отстраняване на бутон: 4 стъпки
AVR микроконтролер. Превключване на светодиодите чрез превключвател с бутон. Отстраняване на бутон: 4 стъпки

Видео: AVR микроконтролер. Превключване на светодиодите чрез превключвател с бутон. Отстраняване на бутон: 4 стъпки

Видео: AVR микроконтролер. Превключване на светодиодите чрез превключвател с бутон. Отстраняване на бутон: 4 стъпки
Видео: ESP8266 ESP01 WIFI-UART | Програмиране на LDmicro-Roboremo 2024, Декември
Anonim
Image
Image

В този раздел ще научим как да направим код на програма C за ATMega328PU, за да превключва състоянието на трите светодиода според входа от превключвател с бутон. Също така проучихме решения на проблема с „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 определя тактовата честота в Hertz и е често срещано в програми, използващи библиотеката avr-libc. В този случай се използва от процедурите за забавяне, за да се определи как да се изчислят закъсненията.

#ifndef F_CPU

#define F_CPU 16000000UL // казваща кристална честота на кристала (16 MHz AVR ATMega328P) #endif

#include // заглавка за активиране на контрола на потока от данни върху щифтове. Определя щифтове, портове и др.

Първият включващ файл е част от avr-libc и ще се използва в почти всеки AVR проект, върху който работите. io.h ще определи процесора, който използвате (поради което посочвате частта при компилиране) и на свой ред ще включите подходящата IO заглавна дефиниция за чипа, който използваме. Той просто определя константите за всички ваши пинове, портове, специални регистри и т.н.

#include // заглавка за активиране на функцията за забавяне в програмата

Библиотеката util/delay.h съдържа някои подпрограми за кратки закъснения. Функцията, която ще използваме, е _delay_ms ().

Използваме дефиниции, за да декларираме портовете и пиновете на нашия бутон и LED. Използването на дефиниращи изявления по този начин ни позволява да променим само 3 лесни за намиране линии, ако преместим светодиода към друг I/O щифт или използваме различен AVR.

#define BUTTON1 1 // бутон превключвател, свързан към порт B пин 1

#define LED1 0 // Led1 свързан към порт B pin 0 #define LED2 1 // Led2 свързан към порт C pin 1 #define LED3 2 // Led3 свързан към порт D pin 2

Последните два дефинират времената за настройка на изявленията, в милисекунди, за премахване на превключвателя и времето за изчакване, преди да разрешите ново натискане на бутона. Времето за деблокиране трябва да се адаптира към времето, необходимо на превключването, за да премине от цифров максимум към цифров минимум след всички подскачащи. Поведението на отскачане ще се различава от превключвателя към превключвателя, но обикновено 20-30 милисекунди са напълно достатъчни.

#define DEBOUNCE_TIME 25 // време за изчакване, докато бутонът "de-bouncing"

#define LOCK_INPUT_TIME 300 // време за изчакване след натискане на бутон

void init_ports_mcu ()

{

Тази функция се извиква само веднъж в началото на нашата програма за инициализиране на входни изходни щифтове, които ще използваме.

За бутона ще използваме регистрите PORT и PIN за писане и четене. С AVR четем пин, използвайки неговия PINx регистър, и пишем на пин, използвайки неговия PORTx регистър. Трябва да напишем в регистъра на бутоните, за да активираме издърпванията.

За светодиода трябва само да използваме регистъра PORT за писане, но също така се нуждаем от регистър за посока на данни (DDR), тъй като I/O пиновете са настроени като входове по подразбиране.

Първо, ние настройваме I/O пиновете на LED като изход, като използваме неговия регистър за посока на данни.

DDRB = 0xFFu; // Задайте всички изводи на PORTB като изход.

След това изрично задайте щифта на бутона като вход.

DDRB & = ~ (1 <

След това щифтовете на PORTB са настроени високо (+5 волта), за да го включат. Изходните щифтове първоначално са високи и тъй като нашият светодиод е свързан активно с високо ниво, той ще бъде включен, освен ако не го изключим изрично.

И накрая, активираме вътрешния издърпващ резистор на входния щифт, който използваме за нашия бутон. Това става просто чрез извеждане на единица към порта. Когато се конфигурира като вход, това води до активиране на издърпвания и когато се конфигурира като изход, това просто ще изведе високо напрежение.

PORTB = 0xFF; // Задайте всички щифтове на PORTB като HIGH. Светодиодът е включен, // също така е разрешен вътрешният издърпващ резистор на първия извод PORTB. DDRC = 0xFFu; // Задайте всички изводи на PORTC като изход. PORTC = 0x00u; // Задайте ниски всички щифтове на PORTC, което го изключва. DDRD = 0xFFu; // Задайте всички изводи на PORTD като изход. PORTD = 0x00u; // Задайте ниски всички щифтове на PORTD, което го изключва. }

unsigned char button_state ()

{

Тази функция връща булева стойност, показваща дали бутонът е натиснат или не. Това е блокът с код, който непрекъснато се изпълнява в цикъла infinite и по този начин се проследява състоянието на бутона. Тук също отхвърляме превключвателя.

Сега не забравяйте, че когато натискаме превключвателя, входният изходен щифт се дърпа към земята. По този начин чакаме щифтът да се понижи.

/ * бутонът се натиска, когато бутонът BUTTON1 е ясен */

ако (! (PINB & (1 <

Правим това, като проверяваме дали битът е ясен. Ако битът е ясен, което показва, че бутонът е натиснат, първо забавяме за времето, определено от DEBOUNCE_TIME, което е 25ms и след това проверяваме отново състоянието на бутона. Ако бутонът е натиснат след 25ms, тогава превключвателят се счита за освободен и готов за задействане на събитие и затова се връщаме 1 към нашата рутина за обаждания. Ако бутонът не е натиснат, ние се връщаме 0 към нашата рутина за обаждания.

_ закъснение_ms (DEBOUNCE_TIME);

ако (! (PINB & (1 <

int main (void)

{

Основната ни рутина. Основната функция е уникална и отделена от всички останали функции. Всяка програма на C трябва да има точно една основна () функция. main е мястото, където AVR започва да изпълнява кода ви при първото включване на захранването, така че това е входната точка на програмата.

unsigned char n_led = 1; // първоначално светодиодният номер е включен сега

Извикване на функцията за инициализиране на използваните I/O пинове:

init_ports_mcu ();

безкраен цикъл, където работи нашата програма:

докато (1)

{

Когато button_state връща едно, което показва, че бутонът е бил натиснат и освободен, след това се променя текущото състояние на светодиодите на свой ред според параметъра n_led.

if (button_state ()) // Ако бутонът е натиснат, превключете състоянието на светодиода и забавете 300ms (#define LOCK_INPUT_TIME)

{switch (n_led) {случай 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); прекъсване;

Тези изявления използват C побитови оператори. Този път той използва изключителния оператор OR. Когато 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); }

Така че сега, когато стартирате тази програма, трябва да можете да натиснете бутона за превключване на светодиодите. Поради нашето забавяне, определено от LOCK_INPUT_TIME, можете да натиснете и задържите бутона, който ще накара светодиодите да се изключват и включват с постоянна скорост (малко повече от всеки 275ms).

Програмирането е завършено.

Следващата стъпка е изграждането на проекта и програмирането на шестнадесетичен файл в микроконтролера с помощта на програмата avrdude.

Можете да изтеглите main.c файл с програма в c код:

Стъпка 2: Прехвърляне на HEX файла на програмата във флаш паметта на чипа

Прехвърляне на HEX файла на програмата във флаш паметта на чипа
Прехвърляне на HEX файла на програмата във флаш паметта на чипа
Прехвърляне на HEX файла на програмата във флаш паметта на чипа
Прехвърляне на HEX файла на програмата във флаш паметта на чипа

Изтеглете и инсталирайте AVRDUDE. Последната налична версия е 6.3: Изтеглете zip файла

Първо копирайте шестнадесетичния файл на програмата в директорията AVRDUDE. В моя случай това е ButtonAVR.hex

След това въведете в прозореца за подкана DOS командата: avrdude –c [име на програмиста] –p m328p –u –U флаш: w: [име на вашия шестнадесетичен файл].

В моя случай това е: avrdude –c ISPProgv1 –p m328p –u –U флаш: w: Бутон AVR.hex

Тази команда записва шестнадесетичен файл в паметта на микроконтролера.

Гледайте видеоклипа с подробно описание на изгарянето на флаш паметта на микроконтролера:

Изгаряне на флаш памет на микроконтролер …

Добре! Сега микроконтролерът работи в съответствие с инструкциите на нашата програма. Нека го проверим!

Стъпка 3: Деблокиране на хардуерен превключвател

Деблокиране на хардуерен превключвател
Деблокиране на хардуерен превключвател

В допълнение към деблокирането на софтуерен превключвател можем да използваме техника за деблокиране на хардуерен превключвател. Основната идея зад тази техника е да се използва кондензатор за филтриране на бързи промени в сигнала на превключвателя.

Каква стойност на кондензатора трябва да се избере? Това в крайна сметка ще зависи от това колко лошо се представя бутонът по отношение на този конкретен проблем. Някои бутони могат да показват огромно подскачащо поведение, а други ще имат много малко. Ниска стойност на кондензатора, като 1.0 нанофарада, ще реагира много бързо, с малък или никакъв ефект върху подскачането. Обратно, по -висока стойност на кондензатора като 220 нанофарада (което все още е доста малко по отношение на кондензаторите) ще осигури бавен преход от началното към крайното напрежение (5 волта до 0 волта). Преходът, наблюдаван с капацитет от 220 нанофарада, все още е доста бърз в реалния смисъл на думата и по този начин може да се използва върху бутони с лоша производителност.

Стъпка 4: Електрическа верига

Електрическа верига
Електрическа верига
Електрическа верига
Електрическа верига
Електрическа верига
Електрическа верига

Свържете компонентите в съответствие със схематична диаграма.

Препоръчано: