Բովանդակություն:

AVR միկրոկոնտրոլեր: Միացրեք LED- ները ՝ սեղմելով կոճակի անջատիչը: Կոճակի վերացում. 4 քայլ
AVR միկրոկոնտրոլեր: Միացրեք LED- ները ՝ սեղմելով կոճակի անջատիչը: Կոճակի վերացում. 4 քայլ

Video: AVR միկրոկոնտրոլեր: Միացրեք LED- ները ՝ սեղմելով կոճակի անջատիչը: Կոճակի վերացում. 4 քայլ

Video: AVR միկրոկոնտրոլեր: Միացրեք LED- ները ՝ սեղմելով կոճակի անջատիչը: Կոճակի վերացում. 4 քայլ
Video: 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- ն կորոշի ձեր կողմից օգտագործվող պրոցեսորը (դրա համար էլ կազմման ժամանակ նշում եք մասը) և իր հերթին կներառի համապատասխան IO սահմանման վերնագիրը այն չիպի համար, որը մենք օգտագործում ենք: Այն պարզապես սահմանում է ձեր բոլոր կապումների, նավահանգիստների, հատուկ գրանցամատյանների և այլնի հաստատունները:

#include // header ծրագրում հետաձգման գործառույթը միացնելու համար

Գրադարանի util/delay.h պարունակում է որոշ ռեժիմներ կարճ ձգձգումների համար: Այն գործառույթը, որը մենք կօգտագործենք, _delay_ms () է:

Մենք օգտագործում ենք defines ՝ մեր կոճակը և LED- ի նավահանգիստներն ու կապումները հայտարարելու համար: Նման սահմանումներ պարունակող հայտարարությունների օգտագործումը մեզ թույլ է տալիս փոփոխել միայն 3 հեշտ գտվող տողերը, եթե LED- ն տեղափոխենք այլ մուտքի/ելքի պին կամ օգտագործենք այլ AVR:

#սահմանել BUTTON1 1 // կոճակի անջատիչը, որը միացված է B պին 1 պորտին

#սահմանել LED1 0 // Led1- ը միացված է B պին 0 -ին #սահմանել LED2 1 // Led2- ը միացված է C պին 1 -ին #սահմանել LED3 2 // Led3- ը միացված է D պին 2 պորտին

Վերջին երկուսը սահմանում են հայտարարությունների տեղադրման ժամանակը ՝ միլիվայրկյանում, անջատիչը անջատելու և կոճակի ևս մեկ սեղմում թույլ տալու համար սպասելու ժամանակը: Դեպոնսինգի ժամանակը պետք է հարմարեցվի այն ժամանակին, երբ ամբողջ ցատկումից հետո թվային բարձրից թվային ցածրի անցնելու համար անհրաժեշտ է: Ounատկման վարքագիծը տարբեր կլինի անջատիչից անջատիչ, բայց 20-30 միլիվայրկյանները սովորաբար բավական են:

#սահմանեք DEBOUNCE_TIME 25 // սպասելու ժամանակը «դե-ցատկել» կոճակին

#սահմանեք LOCK_INPUT_TIME 300 // կոճակը սեղմելուց հետո սպասելու ժամանակը

անվավեր init_ports_mcu ()

{

Այս գործառույթը մեր ծրագրի սկզբում կոչվում է ընդամենը մեկ անգամ `սկզբնականացնելու մուտքային ելքային կապերը, որոնք մենք օգտագործելու ենք:

Կոճակի համար մենք կօգտագործենք PORT և PIN գրանցամատյանները գրելու և կարդալու համար: AVR- ներով մենք կարդում ենք PIN- ը ՝ օգտագործելով PINx գրանցամատյանը և գրում ենք PIN- ին ՝ օգտագործելով PORTx գրանցամատյանը: Մենք պետք է գրենք կոճակների գրանցամատյանում `քաշքշուկները միացնելու համար:

LED- ի համար մեզ անհրաժեշտ է օգտագործել PORT գրանցամատյանը, սակայն մեզ անհրաժեշտ է նաև տվյալների ուղղության գրանցամատյան (DDR), քանի որ մուտքի/ելքի կապերը կանխադրված են որպես մուտքագրումներ:

Նախ, մենք LED- ի I/O կապումներն ենք որպես ելք ՝ օգտագործելով տվյալների ուղղության գրանցամատյանը:

DDRB = 0xFFu; // PORTB- ի բոլոր կապումներն ամրագրել որպես ելք:

Հաջորդը, հստակ սահմանեք կոճակի քորոցը որպես մուտք:

DDRB & = ~ (1 <

Հաջորդը, այն միացնելու համար PORTB կապում տեղադրված է բարձր (+5 վոլտ): Ելքային կապումներն ի սկզբանե բարձր են, և քանի որ մեր LED- ն միացված է ակտիվ-բարձր, այն կմիացվի, եթե այն հստակորեն չանջատենք:

Եվ, վերջապես, մենք միացնում ենք ներքին ձգվող դիմադրությունը մուտքի պինակի վրա, որը մենք օգտագործում ենք մեր կոճակի համար: Դա արվում է պարզապես մեկը նավահանգիստ դուրս բերելով: Երբ կազմաձևվում է որպես մուտքագրում, դա հանգեցնում է քաշքշուկների ակտիվացմանը և, երբ կազմաձևվում է որպես ելք, դա պարզապես բարձր լարման ելք կտա:

PORTB = 0xFF; // Սահմանեք PORTB- ի բոլոր կապումները որպես ԲԱՐՁՐ: Led- ը միացված է, // միացված է նաև առաջին կապի PORTB- ի ներքին Pull Up ռեզիստորը: DDRC = 0xFFu; // Սահմանեք PORTC- ի բոլոր կապումներն որպես ելք: PORTC = 0x00u; // Setածր դարձրեք PORTC- ի բոլոր կապումները, որն անջատում է այն: DDRD = 0xFFu; // Սահմանել PORTD- ի բոլոր կապումներն որպես ելք: PORTD = 0x00u; // Setածրացրեք PORTD- ի բոլոր կապումները, որն անջատում է այն: }

անստորագիր char button_state ()

{

Այս գործառույթը վերադարձնում է բուլյան արժեք ՝ նշելով կոճակը սեղմված է, թե ոչ: Սա այն կոդի բլոկն է, որն անընդհատ կատարվում է անվերջանալի օղակում և, հետևաբար, հարցում է կատարում կոճակի վիճակը: Սա նաև այն վայրն է, որտեղ մենք անջատում ենք անջատիչը:

Այժմ, հիշեք, որ երբ մենք սեղմում ենք անջատիչը, մուտքային ելքային կապը քաշվում է գետնին: Այսպիսով, մենք սպասում ենք, որ քորոցն իջնի:

/ * կոճակը սեղմվում է, երբ BUTTON1 բիթը պարզ է */

եթե (! (PINB & (1 <

Մենք դա անում ենք ՝ ստուգելով, արդյոք բիթը պարզ է: Եթե բիթը պարզ է ՝ նշելով, որ կոճակը սեղմված է, մենք նախ հետաձգում ենք DEBOUNCE_TIME- ով սահմանված ժամանակի համար, որը 25 մ է, այնուհետև նորից ստուգում ենք կոճակի վիճակը: Եթե կոճակը սեղմվում է 25 վայրկյանից հետո, ապա անջատիչը համարվում է անջատված և պատրաստ իրադարձություն սկսելու համար, ուստի մենք 1 -ը վերադառնում ենք մեր կանչող առօրյային: Եթե կոճակը սեղմված չէ, մենք 0 -ը վերադառնում ենք մեր զանգի ռեժիմին:

_delay_ms (DEBOUNCE_TIME);

եթե (! (PINB & (1 <

int հիմնական (անվավեր)

{

Մեր հիմնական առօրյան: Հիմնական գործառույթը եզակի է և տարբերվում է մյուս բոլոր գործառույթներից: Յուրաքանչյուր C ծրագիր պետք է ունենա մեկ հիմնական () գործառույթ: հիմնականը այն վայրն է, որտեղ AVR- ն սկսում է կատարել ձեր կոդը, երբ էներգիան առաջին անգամ միանում է, ուստի դա ծրագրի մուտքի կետն է:

անստորագիր նշան n_led = 1; // ի սկզբանե LED համարը այժմ միացված է

Օգտագործվող I/O կապում գործարկելու գործառույթի կանչը.

init_ports_mcu ();

անսահմանափակ հանգույց, որտեղ աշխատում է մեր ծրագիրը.

մինչդեռ (1)

{

Երբ button_state- ը վերադարձնում է մեկը ՝ նշելով, որ կոճակը սեղմվել և անջատվել է, այնուհետև LED- ների ընթացիկ կարգավիճակը միացնելով ՝ ըստ n_led պարամետրի:

եթե (button_state ()) // Եթե կոճակը սեղմված է, միացրեք LED- ի վիճակը և հետաձգեք 300 ms (#սահմանեք LOCK_INPUT_TIME)

{switch (n_led) {case 1: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); ընդմիջում;

Այս հայտարարությունները օգտագործում են բ բիթային օպերատորներ: Այս անգամ այն օգտագործում է բացառիկ OR օպերատորը: Երբ POR- ը 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); }} վերադարձ (0); }

Այսպիսով, այժմ, երբ գործարկում եք այս ծրագիրը, դուք պետք է կարողանաք սեղմել կոճակը LED- ների վրա: LOCK_INPUT_TIME- ով սահմանված մեր ուշացման պատճառով կարող եք սեղմել և պահել այն կոճակը, որը կհանգեցնի LED- ների անջատման և միացման կայուն արագությամբ (յուրաքանչյուր 275 մ -ից քիչ ավելի):

Programրագրավորումն ավարտված է:

Հաջորդ քայլը նախագծի կառուցումն է և ծրագրավորման վեցանկյուն ֆայլը միկրոկառավարիչի մեջ `օգտագործելով avrdude ծրագիրը:

Դուք կարող եք բեռնել main.c ֆայլը ծրագրով c կոդով ՝

Քայլ 2. HEրագրի HEX ֆայլը փոխանցել չիպի ֆլեշ հիշողության մեջ

Theրագրի HEX ֆայլը փոխանցելը չիպի ֆլեշ հիշողության մեջ
Theրագրի HEX ֆայլը փոխանցելը չիպի ֆլեշ հիշողության մեջ
Theրագրի HEX ֆայլը փոխանցելը չիպի ֆլեշ հիշողության մեջ
Theրագրի HEX ֆայլը փոխանցելը չիպի ֆլեշ հիշողության մեջ

Ներբեռնեք և տեղադրեք AVRDUDE- ը: Առկա վերջին տարբերակը 6.3 է: Ներբեռնեք zip ֆայլը

Նախ, պատճենեք ծրագրի վեցանկյուն ֆայլը AVRDUDE գրացուցակում: Իմ դեպքում դա ButtonAVR.hex է

Այնուհետև մուտքագրեք DOS- ի հուշման պատուհանը ՝ avrdude –c [ծրագրավորողի անունը] –p m328p –u –U flash: w: [ձեր վեցանկյուն ֆայլի անունը]:

Իմ դեպքում դա: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Այս հրամանը գրում է վեցանկյուն ֆայլ միկրոկառավարիչի հիշողության մեջ:

Դիտեք տեսանյութը միկրոկառավարիչի ֆլեշ հիշողության այրման մանրամասն նկարագրությամբ.

Միկրոկառավարիչի ֆլեշ հիշողությունը այրվում է…

Լավ! Այժմ, միկրոկառավարիչը աշխատում է մեր ծրագրի ցուցումներին համապատասխան: Եկեք ստուգենք այն:

Քայլ 3. Սարքաշարի անջատիչից հրաժարվելը

Սարքաշարի անջատիչից հանելուց
Սարքաշարի անջատիչից հանելուց

Softwareրագրային ապահովման անջատիչի ապամոնտաժումից բացի, մենք կարող ենք օգտագործել ապարատային անջատիչների ապամոնտաժման տեխնիկան: Նման տեխնիկայի հիմքում ընկած է կոնդենսատորի օգտագործումը անջատիչի ազդանշանի արագ փոփոխությունները զտելու համար:

Ո՞ր արժեքի կոնդենսատորը պետք է ընտրվի: Սա, ի վերջո, կախված կլինի նրանից, թե որքան վատ է աշխատում կոճակը տվյալ խնդրի վերաբերյալ: Որոշ կոճակներ կարող են ցուցադրել հսկայական ցատկող վարքագիծ, իսկ մյուսները ՝ շատ քիչ: Nanածր կոնդենսատորի արժեքը, ինչպիսին է 1.0 նանոֆարադը, շատ արագ կարձագանքի ՝ փոքր կամ առանց որևէ ազդեցության ցատկման վրա: Եվ հակառակը, կոնդենսատորի ավելի բարձր արժեքը, ինչպիսին է 220 նանոֆարադը (որը կոնդենսատորների առումով դեռ բավականին փոքր է), կապահովի դանդաղ անցում սկզբից մինչև վերջ լարման (5 վոլտից մինչև 0 վոլտ): Այնուամենայնիվ, 220 նանոֆարադի հզորությամբ անցումը դեռևս բավականին արագ է իրական իմաստով, և, հետևաբար, կարող է օգտագործվել վատ աշխատող կոճակների վրա:

Քայլ 4: Էլեկտրական միացում

Էլեկտրական միացում
Էլեկտրական միացում
Էլեկտրական միացում
Էլեկտրական միացում
Էլեկտրական միացում
Էլեկտրական միացում

Միացրեք բաղադրիչները սխեմատիկ սխեմայի համաձայն:

Խորհուրդ ենք տալիս: