Мазмуну:

AVR микроконтроллери. Баскыч баскычын колдонуп LEDди өчүрүү. Баскыч баскычын чыгаруу: 4 кадам
AVR микроконтроллери. Баскыч баскычын колдонуп LEDди өчүрүү. Баскыч баскычын чыгаруу: 4 кадам

Video: AVR микроконтроллери. Баскыч баскычын колдонуп LEDди өчүрүү. Баскыч баскычын чыгаруу: 4 кадам

Video: AVR микроконтроллери. Баскыч баскычын колдонуп LEDди өчүрүү. Баскыч баскычын чыгаруу: 4 кадам
Video: Lesson 2: Getting Arduino Software and using Documentation for SunFounder Arduino Kit | SunFounder 2024, Июль
Anonim
Image
Image

Бул бөлүмдө биз ATMega328PU программасынын C кодун баскычты которгучтун киргизүүсүнө ылайык үч LEDдин статусун которууну үйрөнөбүз. Ошондой эле, биз "Switch Bounce" көйгөйүнүн чечилишин изилдедик. Адаттагыдай эле, биз программалык коддун ишин текшерүү үчүн AVR ATmega328 базасында электр схемасын чогултабыз.

1 -кадам: Интегралдык өнүктүрүү платформасын колдонуп, C кодунда AVR микроконтроллерин жазуу жана куруу Atmel Studio 7

Atmel Studio 7 интеграцияланган өнүктүрүү платформасын колдонуп, C кодунда AVR микроконтроллер тиркемесин жазуу жана куруу
Atmel Studio 7 интеграцияланган өнүктүрүү платформасын колдонуп, C кодунда AVR микроконтроллер тиркемесин жазуу жана куруу
Atmel Studio 7 интеграцияланган өнүктүрүү платформасын колдонуп, C кодунда AVR микроконтроллер тиркемесин жазуу жана куруу
Atmel Studio 7 интеграцияланган өнүктүрүү платформасын колдонуп, C кодунда AVR микроконтроллер тиркемесин жазуу жана куруу
Atmel Studio 7 интеграцияланган өнүктүрүү платформасын колдонуп, C кодунда AVR микроконтроллер тиркемесин жазуу жана куруу
Atmel Studio 7 интеграцияланган өнүктүрүү платформасын колдонуп, C кодунда AVR микроконтроллер тиркемесин жазуу жана куруу

Эгерде сизде 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 // header, пиндердин үстүндө маалымат агымын башкарууну иштетүү үчүн. Пиндерди, портторду ж.

Биринчи файл avr-libcтин бир бөлүгү болуп саналат жана сиз иштеп жаткан AVR долбоорунда колдонулат. io.h сиз колдонгон CPUны аныктайт (ошондуктан компиляция учурунда бөлүгүн көрсөтөсүз) жана өз кезегинде биз колдонгон чипке тиешелүү IO аныктамасынын башын камтыйт. Бул жөн гана бардык казыктарыңыздын, порттордун, атайын реестрлердин ж.

Программада кечигүү функциясын иштетүү үчүн #include // header

Китепкана util/delay.h кыска кечигүү үчүн кээ бир тартиптерди камтыйт. Биз колдоно турган функция _delay_ms ().

Биз баскычты жана LEDдин портторун жана казыктарын жарыялоо үчүн аныктамаларды колдонобуз. Ушул сыяктуу аныктамаларды колдонуу, эгерде биз LEDди башка I/O пинине жылдырсак же башка AVR колдонсок, табууга оңой 3 линияны өзгөртүүгө гана мүмкүндүк берет.

#define BUTTON1 1 // баскычы B порт 1 пин туташтырылган

#define LED1 0 // Led1 порт B pin 0го туташкан #define LED2 1 // Led2 порт C C pin 1ге #define LED3 2 // Led3 D pin 2 портуна туташкан

Акыркы эки билдирүүнү орнотуу убактысын миллисекундта аныктайт, баскычты баскандан кийин баскычты басуу үчүн убакытты күтөт жана убакытты күтөт. Чыгуу убактысы, бардык секирүүдөн кийин санариптик бийиктен санариптик төмөнгө өтүү убактысына туураланышы керек. Секирүү жүрүм-турушу которуштуруудан башкача болот, бирок адатта 20-30 миллисекунд жетиштүү.

#debine DEBOUNCE_TIME 25 // "де-секирүү" баскычы күтүлгөн убакыт

#define LOCK_INPUT_TIME 300 // баскычты баскандан кийин күтүү убактысы

жараксыз init_ports_mcu ()

{

Бул функция биздин программанын башында биз колдонгон кирүү казыктарын инициализациялоо үчүн бир эле жолу чакырылат.

Баскыч үчүн биз PORT жана PIN регистрлерин жазуу жана окуу үчүн колдонобуз. AVRлер менен биз PINx регистрин колдонуп, PIN кодду окуйбуз жана PORTx регистринин жардамы менен пинге жазабыз. Биз тартууну иштетүү үчүн баскычтын регистрине жазышыбыз керек.

Светодиод үчүн биз PORT регистрин гана жазышыбыз керек, бирок биз маалыматтын багытынын регистрине (DDR) да муктажбыз, анткени I/O казыктары демейки шартта киргизүү катары орнотулган.

Биринчиден, биз LEDдин I/O төөнөгүчтөрүн маалымат багытынын регистрин колдонуп чыгуу катары орнотуп жатабыз.

DDRB = 0xFFu; // PORTBтин бардык казыктарын чыгаруу катары коюңуз.

Андан кийин, баскычтын төөнөгүчүн ачык түрдө кириш катары коюңуз.

DDRB & = ~ (1 <

Андан кийин, PORTB казыктары аны күйгүзүү үчүн бийик (+5 вольт) коюлган. Чыгуу казыктары башында жогору, жана биздин LED активдүү бийик зымдуу болгондуктан, биз аны ачык өчүрбөсөк күйгүзүлөт.

Акыр-аягы, биз баскыч үчүн колдонуп жаткан киргизүү пининдеги ички тартма каршылыгын иштетебиз. Бул портко бирөөсүн чыгаруу менен гана жасалат. Киргизүү катары конфигурацияланганда, муну менен тартууну иштетет, ал эми чыгаруу катары конфигурацияланганда, бул жөн эле жогорку чыңалуусун чыгарат.

PORTB = 0xFF; // ПОРТБдун бардык төөнөгүчтөрүн БИЙИК деп коюңуз. Led күйүп турат, // ошондой эле PORTB биринчи пиндин ички Pull Up каршылыгы иштетилген. DDRC = 0xFFu; // PORTC бардык казыктарын чыгаруу катары коюңуз. PORTC = 0x00u; // PORTC бардык казыктарын өчүрүп коюңуз. DDRD = 0xFFu; // PORTDдин бардык казыктарын чыгаруу катары коюңуз. PORTD = 0x00u; // PORTD бардык казыктарын өчүрүп коюңуз. }

белгиси жок char button_state ()

{

Бул функция логикалык маанини кайтарат же баскыч басылганын көрсөтөт. Бул код блогу дайыма инфиналдык циклде аткарылып, баскычтын абалын сурап жатат. Бул жерде биз которууну жокко чыгарабыз.

Эми, биз которгучту басканда, кириш чыккычы жерге тартылганын унутпаңыз. Ошентип, биз пин төмөн түшүп кетишин күтүп жатабыз.

/ * баскыч BUTTON1 бит ачык болгондо басылат */

эгер (! (PINB & (1 <

Биз муну биттин ачык -айкындыгын текшерүү менен жасайбыз. Эгерде бит так болсо, баскыч басылганын көрсөтүп, биз алгач DEBOUNCE_TIME тарабынан аныкталган убакытты 25 мс кечиктирип, анан баскычтын абалын кайра текшеребиз. Эгерде баскыч 25 мүнөттөн кийин басылса, анда которуу дебюндалган жана окуяны баштоого даяр деп эсептелет, ошондуктан биз 1ди чалуу тартибибизге кайтарабыз. Эгерде баскыч басылбаса, биз 0 чалуу тартибибизге кайтып келебиз.

_delay_ms (DEBOUNCE_TIME);

эгер (! (PINB & (1 <

int main (боштук)

{

Биздин негизги күнүмдүк. Негизги функция уникалдуу жана башка функциялардан айырмаланат. Ар бир C программасында так бир main () функциясы болушу керек. Негизги нерсе, AVR сиздин кодуңузду иштете баштаганда, бул биринчи жолу күйгүзүлгөндө, бул программанын кирүү чекити.

белгисиз char n_led = 1; // башында LED номери азыр күйүп турат

Колдонулуп жаткан I/O казыктарын инициализациялоо үчүн функцияга чакыруу:

init_ports_mcu ();

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

учурда (1)

{

Button_state баскычы басылганын жана басылганын көрсөткөн бирөөнү кайтарып бергенде, LEDдин учурдагы абалын n_led параметрине ылайык алмаштырат.

if (button_state ()) // Эгерде баскыч басылса, LEDдин абалын которуңуз жана 300msге кечиктириңиз (#define LOCK_INPUT_TIME)

{switch (n_led) {case 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); тыныгуу;

Бул билдирүүлөрдө C биттик операторлору колдонулат. Бул жолу эксклюзивдүү ЖЕ операторун колдонуп жатат. Портту алмаштыргыңыз келген биттин мааниси менен XOR кылсаңыз, анда бир бит башка биттерге таасир этпестен өзгөртүлөт.

2 -жагдай:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); тыныгуу; 3 -жагдай: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // баштапкы абалга келтирүү LED номери; } n_led ++; // кийинки LED _delay_ms күйөт (LOCK_INPUT_TIME); }} return (0); }

Эми, бул программаны иштеткенде, сиз баскычты басууга жөндөмдүү болушуңуз керек. LOCK_INPUT_TIME тарабынан аныкталган кечигүүбүзгө байланыштуу, сиз LEDди өчүрүп -күйгүзө турган баскычты басып турсаңыз болот (ар бир 275 мсден бир аз көбүрөөк).

Программалоо аяктады.

Кийинки кадам avrdude программасын колдонуу менен долбоорду жана он алтылык файлды микроконтроллерге куруу.

Main.c файлын c кодундагы программа менен жүктөп алсаңыз болот:

2 -кадам: Программанын HEX файлын чиптин эс тутумуна өткөрүп берүү

Программанын HEX файлын чиптин флэш -эсине өткөрүп берүү
Программанын HEX файлын чиптин флэш -эсине өткөрүп берүү
Программанын HEX файлын чиптин флэш -эсине өткөрүп берүү
Программанын HEX файлын чиптин флэш -эсине өткөрүп берүү

AVRDUDE жүктөп алып, орнотуңуз. Акыркы версиясы 6.3: zip файлын жүктөп алыңыз

Биринчиден, программанын он алтылык файлын AVRDUDE каталогуна көчүрүңүз. Менин учурда бул ButtonAVR.hex

Андан кийин, DOS чакыруу терезесине төмөнкү буйрукту териңиз: avrdude –c [программисттин аты] –p m328p –u –U flash: w: [hex файлыңыздын аты].

Менин учурда бул: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Бул буйрук он алтылык файлды микроконтроллердин эсине жазат.

Микроконтроллердин флэш -эсинин күйүп жатышы жөнүндө толук сүрөттөмөсү бар видеону көрүңүз:

Микроконтроллердин флэш эси күйүп жатат…

Макул! Эми микроконтроллер биздин программанын көрсөтмөсүнө ылайык иштейт. Кел, аны текшерип көрөлү!

3 -кадам: Аппараттык которуу дебюгу

Аппараттык которуштуруу
Аппараттык которуштуруу

Программалык камсыздоону өчүрүүдөн тышкары, биз аппараттык которуштуруу техникасын колдоно алабыз. Мындай техниканын артындагы негизги идея - бул конденсатордун жардамы менен сигналдын тез өзгөрүүсүн чыпкалоо.

Кандай конденсатор тандоо керек? Бул, акыры, бул көйгөй боюнча баскычтын канчалык начар иштегенине жараша болот. Кээ бир баскычтар чоң секирүү жүрүм -турумун көрсөтө алат, ал эми башкаларында өтө аз болот. 1.0 нанофарад сыяктуу конденсатордун баасы абдан тез реакция кылат, секирүүгө эч кандай таасири жок. Тескерисинче, 220 нанофарад сыяктуу конденсатордун жогорку мааниси (бул конденсаторлор боюнча дагы эле кичинекей) башынан аягына чейинки чыңалууга (5 вольттон 0 вольтко чейин) жай өтүүнү камсыз кылат. 220 нанофараддык кубаттуулук менен өткөн өткөөл реалдуу мааниде дагы деле абдан тез, ошондуктан начар иштеген баскычтарда колдонулушу мүмкүн.

4 -кадам: Электр схемасы

Электр микросхемасы
Электр микросхемасы
Электр микросхемасы
Электр микросхемасы
Электр микросхемасы
Электр микросхемасы

Схемалык схемага ылайык компоненттерди туташтырыңыз.

Сунушталууда: