Turinys:

AVR mikrovaldiklis. Perjunkite šviesos diodus naudodami mygtuko jungiklį. Paspaudimo mygtuko išjungimas .: 4 žingsniai
AVR mikrovaldiklis. Perjunkite šviesos diodus naudodami mygtuko jungiklį. Paspaudimo mygtuko išjungimas .: 4 žingsniai

Video: AVR mikrovaldiklis. Perjunkite šviesos diodus naudodami mygtuko jungiklį. Paspaudimo mygtuko išjungimas .: 4 žingsniai

Video: AVR mikrovaldiklis. Perjunkite šviesos diodus naudodami mygtuko jungiklį. Paspaudimo mygtuko išjungimas .: 4 žingsniai
Video: LDmicro 13: HC-05 Bluetooth Phone App Control (Microcontroller PLC Ladder Programming with LDmicro) 2024, Lapkritis
Anonim
Image
Image

Šiame skyriuje mes išmoksime, kaip padaryti programos A kodą ATMega328PU, kad būtų galima perjungti trijų šviesos diodų būseną pagal mygtuko jungiklio įvestį. Be to, mes ištyrėme problemos „Switch Bounce“sprendimo būdus. Kaip paprastai, mes surinksime elektros grandinę ant AVR ATmega328 pagrindo, kad patikrintume programos kodo veikimą.

1 žingsnis: AVR mikrovaldiklio programos rašymas ir kūrimas C kode naudojant integruotą kūrimo platformą „Atmel Studio 7“

AVR mikrovaldiklio programos rašymas ir kūrimas naudojant C kodą naudojant integruotą kūrimo platformą „Atmel Studio 7“
AVR mikrovaldiklio programos rašymas ir kūrimas naudojant C kodą naudojant integruotą kūrimo platformą „Atmel Studio 7“
AVR mikrovaldiklio programos rašymas ir kūrimas naudojant C kodą naudojant integruotą kūrimo platformą „Atmel Studio 7“
AVR mikrovaldiklio programos rašymas ir kūrimas naudojant C kodą naudojant integruotą kūrimo platformą „Atmel Studio 7“
AVR mikrovaldiklio programos rašymas ir kūrimas naudojant C kodą naudojant integruotą kūrimo platformą „Atmel Studio 7“
AVR mikrovaldiklio programos rašymas ir kūrimas naudojant C kodą naudojant integruotą kūrimo platformą „Atmel Studio 7“

Jei neturite „Atmel Studio“, turėtumėte ją atsisiųsti ir įdiegti.

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

Pirmosios eilutės, kurias apibrėžia kompiliatorius.

F_CPU nustato laikrodžio dažnį hercais ir yra įprastas programose, kuriose naudojama avr-libc biblioteka. Šiuo atveju jį naudoja vėlavimo tvarka, kad nustatytų, kaip apskaičiuoti vėlavimą.

#ifndef F_CPU

#define F_CPU 16000000UL // nurodo valdiklio kristalų dažnį (16 MHz AVR ATMega328P) #endif

#include // antraštė, kad būtų galima valdyti srautų duomenų srautus. Apibrėžia kaiščius, prievadus ir kt.

Pirmasis įtraukimo failas yra avr-libc dalis ir bus naudojamas beveik bet kuriame AVR projekte, prie kurio dirbate. „io.h“nustatys jūsų naudojamą procesorių (todėl kompiliavimo metu nurodote dalį) ir savo ruožtu įtraukia atitinkamą naudojamo lusto IO apibrėžimo antraštę. Tai tiesiog apibrėžia visų jūsų kaiščių, prievadų, specialių registrų ir kt.

#include // antraštė, kad įjungtumėte programos uždelsimo funkciją

Bibliotekoje util/delay.h yra keletas trumpų vėlavimų tvarkos. Funkcija, kurią naudosime, yra _delay_ms ().

Mes naudojame apibrėžimus, norėdami deklaruoti savo mygtukus ir šviesos diodų prievadus ir kaiščius. Naudojant tokius apibrėžiamus teiginius, mums tereikia modifikuoti 3 lengvai randamas eilutes, jei perkelsime šviesos diodą į kitą įvesties/išvesties kaištį arba naudosime kitą AVR.

#define BUTTON1 1 // mygtuko jungiklis, prijungtas prie B prievado 1 kaiščio

#define LED1 0 // Led1 prijungtas prie B prievado kaiščio 0 #define LED2 1 // Led2 prijungtas prie C prievado 1 kontaktas #define LED3 2 // Led3 prijungtas prie D prievado 2 kaiščio

Paskutiniai du apibrėžia teiginių sąrankos laiką milisekundėmis, kad būtų atjungtas jungiklis, ir laikas palaukti, kol bus galima dar kartą paspausti mygtuką. Atsijungimo laiką reikia pakoreguoti pagal laiką, per kurį reikia pereiti, kad po visų atšokimų perjungimas iš skaitmeninio aukšto į skaitmeninį žemą. Atšokimo elgesys skirtinguose jungikliuose skirsis, tačiau paprastai pakanka 20–30 milisekundžių.

#define DEBOUNCE_TIME 25 // laikas palaukti, kol bus atšauktas mygtukas

#define LOCK_INPUT_TIME 300 // laikas laukti paspaudus mygtuką

void init_ports_mcu ()

{

Ši funkcija yra vadinama tik vieną kartą mūsų programos pradžioje, kad būtų inicijuoti įvesties išvesties kaiščiai, kuriuos naudosime.

Mygtukui rašyti ir skaityti naudosime PORT ir PIN registrus. Naudodami AVR, mes skaitome PIN kodą naudodami jo PINx registrą ir rašome į PIN kodą naudodami PORTx registrą. Turime parašyti mygtukų registrą, kad įgalintume prisitraukimus.

Šviesos diodui rašyti reikia naudoti tik PORT registrą, tačiau mums taip pat reikia duomenų krypties registro (DDR), nes įvesties/išvesties kaiščiai pagal numatytuosius nustatymus yra nustatyti kaip įvestys.

Pirma, mes nustatome šviesos diodų įvesties/išvesties kaiščius kaip išvestį, naudodami duomenų krypčių registrą.

DDRB = 0xFFu; // Nustatykite visus PORTB kaiščius kaip išvestį.

Tada aiškiai nustatykite mygtuko kaištį kaip įvestį.

DDRB & = ~ (1 <

Tada PORTB kaiščiai nustatomi aukštai (+5 voltai), kad jį įjungtų. Išvesties kaiščiai iš pradžių yra aukšti, ir kadangi mūsų šviesos diodas yra aktyviai prijungtas, jis bus įjungtas, nebent aiškiai jį išjungsime.

Galiausiai įjungiame vidinį traukimo varžą įvesties kaištyje, kurį naudojame savo mygtukui. Tai daroma tiesiog išvedant vieną į uostą. Kai tai sukonfigūruota kaip įvestis, tai leidžia įjungti prisitraukimus, o kai sukonfigūruota kaip išvestis, tai tiesiog išvestų aukštą įtampą.

PORTB = 0xFF; // Nustatykite visus PORTB kaiščius kaip AUKŠTUS. Įjungtas LED, // taip pat įjungiamas pirmojo kaiščio PORTB vidinis ištraukimo rezistorius. DDRC = 0xFFu; // Nustatykite visus PORTC kaiščius kaip išvestį. PORTC = 0x00u; // Nustatykite žemus visus PORTC kaiščius, kurie jį išjungia. DDRD = 0xFFu; // Nustatykite visus PORTD kaiščius kaip išvestį. PORTD = 0x00u; // Nustatykite žemus visus PORTD kaiščius, kurie jį išjungia. }

unsigned char button_state ()

{

Ši funkcija grąžina loginę vertę, nurodančią, ar buvo paspaustas mygtukas. Tai yra kodo blokas, kuris nuolat vykdomas begalinėje kilpoje ir taip apklausia mygtuko būseną. Čia taip pat išjungiame jungiklį.

Dabar atminkite, kad kai paspaudžiame jungiklį, įvesties išvesties kaištis traukiamas į žemę. Taigi mes laukiame, kol smeigtukas nusileis.

/ * mygtukas paspaudžiamas, kai BUTTON1 bitas yra aiškus */

jei (! (PINB & (1 <

Mes tai darome patikrindami, ar bitas yra aiškus. Jei bitas yra aiškus, nurodant, kad mygtukas yra nuspaustas, pirmiausia atidėliojame DEBOUNCE_TIME apibrėžtą laiką, kuris yra 25 ms, ir tada dar kartą patikriname mygtuko būseną. Jei mygtukas paspaudžiamas po 25 ms, tada jungiklis laikomas neveikiančiu ir pasirengusiu suaktyvinti įvykį, todėl grįžtame prie savo skambučių. Jei mygtukas nėra nuspaustas, grįžtame prie savo skambinimo tvarkos 0.

_delay_ms (DEBOUNCE_TIME);

jei (! (PINB & (1 <

int main (niekinis)

{

Mūsų pagrindinė rutina. Pagrindinė funkcija yra unikali ir atskirta nuo visų kitų funkcijų. Kiekviena C programa turi turėti tiksliai vieną pagrindinę () funkciją. Pagrindinis yra tai, kur AVR pradeda vykdyti jūsų kodą, kai tik įjungiamas maitinimas, taigi tai yra programos įėjimo taškas.

nepasirašytas char n_led = 1; // iš pradžių LED numeris dabar įjungtas

Naudojamų įvesties/išvesties kontaktų inicijavimo funkcijos iškvietimas:

init_ports_mcu ();

begalinė kilpa, kurioje veikia mūsų programa:

kol (1)

{

Kai „button_state“grąžina vieną, rodančią, kad mygtukas buvo paspaustas ir atšauktas, tada savo ruožtu perjunkite esamą šviesos diodų būseną pagal parametrą n_led.

if (button_state ()) // Jei mygtukas yra paspaustas, perjunkite šviesos diodo būseną ir atidėkite 300 ms (#define LOCK_INPUT_TIME)

{jungiklis (n_led) {1 atvejis: PORTB ^= (1 << LED1); PORTC ^= (1 << LED2); pertrauka;

Šiuose teiginiuose naudojami C bitų operatoriai. Šį kartą jis naudoja išskirtinį OR operatorių. Kai XOR PORT su bitų, kuriuos norite perjungti, bitų reikšme, tas vienas bitas pakeičiamas, nedarant įtakos kitiems bitams.

2 atvejis:

PORTC ^= (1 << LED2); PORTD ^= (1 << LED3); pertrauka; 3 atvejis: PORTD ^= (1 << LED3); PORTB ^= (1 << LED1); n_led = 0; // iš naujo nustatyti LED numerio pertrauką; } n_led ++; // kitas šviesos diodas įjungiamas _delay_ms (LOCK_INPUT_TIME); }} return (0); }

Taigi dabar, kai paleisite šią programą, turėtumėte turėti galimybę paspausti mygtuką, kad šviesos diodai persijungtų. Dėl LOCK_INPUT_TIME nustatyto uždelsimo galite paspausti ir palaikyti mygtuką, dėl kurio šviesos diodai išsijungs ir įsijungs pastoviu greičiu (šiek tiek daugiau nei kas 275 ms).

Programavimas baigtas.

Kitas žingsnis yra projekto sukūrimas ir šešioliktainio failo programavimas į mikrovaldiklį naudojant avrdude programą.

Galite atsisiųsti failą main.c su programa c kodu:

2 veiksmas: programos HEX failo perkėlimas į lusto „Flash“atmintį

Programos HEX failo perkėlimas į lusto „Flash“atmintį
Programos HEX failo perkėlimas į lusto „Flash“atmintį
Programos HEX failo perkėlimas į lusto „Flash“atmintį
Programos HEX failo perkėlimas į lusto „Flash“atmintį

Atsisiųskite ir įdiekite AVRDUDE. Naujausia versija yra 6.3: atsisiųskite ZIP failą

Pirmiausia nukopijuokite programos šešiakampį failą į katalogą AVRDUDE. Mano atveju tai yra ButtonAVR.hex

Tada DOS raginimo lange įveskite komandą: avrdude –c [programuotojo pavadinimas] –p m328p –u –U flash: w: [jūsų šešiakampio failo pavadinimas].

Mano atveju tai yra: avrdude –c ISPProgv1 –p m328p –u –U flash: w: ButtonAVR.hex

Ši komanda įrašo hex failą į mikrovaldiklio atmintį.

Žiūrėkite vaizdo įrašą su išsamiu mikrovaldiklio „flash“atminties įrašymo aprašymu:

Įrašoma mikrovaldiklio „flash“atmintis…

Gerai! Dabar mikrovaldiklis veikia pagal mūsų programos instrukcijas. Patikrinkime!

3 veiksmas: aparatinės įrangos jungiklio išjungimas

Techninės įrangos jungiklio išjungimas
Techninės įrangos jungiklio išjungimas

Be programinės įrangos jungiklių išjungimo, galime naudoti aparatinės įrangos jungiklių išjungimo techniką. Pagrindinė tokios technikos idėja yra naudoti kondensatorių, kad būtų galima filtruoti greitus jungiklio signalo pokyčius.

Kokios vertės kondensatorių reikia pasirinkti? Galų gale tai priklausys nuo to, kaip blogai mygtukas veikia dėl šios konkrečios problemos. Kai kurie mygtukai gali rodyti nepaprastą šokinėjimo elgesį, o kiti - labai mažai. Maža kondensatoriaus vertė, tokia kaip 1,0 nanofaradas, reaguos labai greitai, nedaug arba visai neturės įtakos atšokimui. Priešingai, didesnė kondensatoriaus vertė, pvz., 220 nanofaradų (tai vis dar yra gana maža kondensatorių prasme), užtikrins lėtą perėjimą nuo pradžios iki pabaigos įtampos (nuo 5 voltų iki 0 voltų). Perėjimas, matomas naudojant 220 nanofaradų talpą, vis dar yra gana greitas realaus pasaulio prasme, todėl gali būti naudojamas su prastai veikiančiais mygtukais.

4 žingsnis: elektros grandinė

Elektros grandinė
Elektros grandinė
Elektros grandinė
Elektros grandinė
Elektros grandinė
Elektros grandinė

Prijunkite komponentus pagal schemą.

Rekomenduojamas: