Мазмуну:
- 1 -кадам: Интегралдык өнүктүрүү платформасын колдонуп, C кодунда AVR микроконтроллерин жазуу жана куруу Atmel Studio 7
- 2 -кадам: Программанын HEX файлын чиптин эс тутумуна өткөрүп берүү
- 3 -кадам: Аппараттык которуу дебюгу
- 4 -кадам: Электр схемасы
Video: AVR микроконтроллери. Баскыч баскычын колдонуп LEDди өчүрүү. Баскыч баскычын чыгаруу: 4 кадам
2024 Автор: John Day | [email protected]. Акыркы өзгөртүү: 2024-01-30 10:40
Бул бөлүмдө биз ATMega328PU программасынын C кодун баскычты которгучтун киргизүүсүнө ылайык үч LEDдин статусун которууну үйрөнөбүз. Ошондой эле, биз "Switch Bounce" көйгөйүнүн чечилишин изилдедик. Адаттагыдай эле, биз программалык коддун ишин текшерүү үчүн AVR ATmega328 базасында электр схемасын чогултабыз.
1 -кадам: Интегралдык өнүктүрүү платформасын колдонуп, C кодунда AVR микроконтроллерин жазуу жана куруу 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 // 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 файлын чиптин эс тутумуна өткөрүп берүү
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 -кадам: Электр схемасы
Схемалык схемага ылайык компоненттерди туташтырыңыз.
Сунушталууда:
Баскыч (Баскыч); // An Arduino LCD оюну: 5 кадам (сүрөттөр менен)
Баскыч (Баскыч); // An Arduino ЖК оюну: Жакында Скауттарда мен Оюн Дизайнынын татыктуу бейджиги менен иштедим. Талаптардын бири үчүн, мен бул оюнду LED Rocker Game'ге негизделген Arduino менен кургам. Оюндун мааниси мүмкүн болгон эң көп упай топтоо. Т -дын башында
STM32L100 баскычын басуу менен LEDди Atollic TrueStudio-Switch: 4 кадам
STM32L100 аркылуу баскычты басуу менен LEDди Atollic TrueStudio-Switch: STM32нин бул окуу куралында мен сизге STM32L100 GPIO пинин кантип окуу керектигин айтып берейин, андыктан бул жерде мен Led жаркылдайт баскычын басуу
AVR микроконтроллери. Таймерди колдонуп LED жарыгы. Таймерлер үзгүлтүккө учурайт. Таймер CTC режими: 6 кадам
AVR микроконтроллери. Таймерди колдонуп LED жарыгы. Таймерлер үзгүлтүккө учурайт. Таймер CTC режими: Салам баарына! Таймерлер - электроника тармагындагы маанилүү түшүнүк. Ар бир электрондук компонент убакыттын негизинде иштейт. Бул убакыт базасы бардык иштерди синхрондоштурууга жардам берет. Бардык микроконтроллерлер алдын ала белгиленген саат жыштыгында иштешет
CloudX M633 менен алып баруу жана өчүрүү баскычын колдонуу: 3 кадам
CloudX M633 менен алып баруу жана өчүрүү баскычын колдонуу: < img src = " https: //www.instructables.com/files/deriv/FLC/57B2…"/> Сиз баскычты басканыңызда LEDди күйгүзүү үчүн CloudX M633 колдоно алаарыңызды билчү белеңиз? Бул долбоордо баскычты кантип ӨЧҮРҮҮ жана ӨЧҮРҮҮ үчүн колдонсо болорун көрсөтөм. эмне
Өзгөчө белгилерди ЖКга кантип 8051 микроконтроллери менен басып чыгаруу керек: 4 кадам
8051 Микроконтроллери менен ЖКда Өзгөчөлөштүрүлгөн Белгилерди Кантип Басуу керек: Бул долбоордо биз 8051 микроконтроллерди колдонуп, 16 * 2 ЖКда бажы тамгасын кантип басып чыгаруу керектигин айтып бермекчибиз. Биз LCDди 8 бит режиминде колдонобуз. Биз дагы 4 бит режиминде ушундай кыла алабыз