Turinys:
- 1 žingsnis: AVR mikrovaldiklio programos rašymas ir kūrimas C kode naudojant integruotą kūrimo platformą „Atmel Studio 7“
- 2 veiksmas: programos HEX failo perkėlimas į lusto „Flash“atmintį
- 3 veiksmas: aparatinės įrangos jungiklio išjungimas
- 4 žingsnis: elektros grandinė
Video: AVR mikrovaldiklis. Perjunkite šviesos diodus naudodami mygtuko jungiklį. Paspaudimo mygtuko išjungimas .: 4 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:47
Š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“
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į
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
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ė
Prijunkite komponentus pagal schemą.
Rekomenduojamas:
IoT Helovino moliūgas - Valdykite šviesos diodus naudodami „Arduino MKR1000“ir „Blynk“programą ???: 4 žingsniai (su paveikslėliais)
IoT Helovino moliūgas | Valdykite šviesos diodus naudodami „Arduino MKR1000“ir „Blynk“programą ???: Sveiki visi! Prieš kelias savaites buvo Helovinas ir, laikydamasi tradicijos, iškirpiau gražų moliūgą savo balkonui. Tačiau turėdama moliūgą lauke supratau, kad gana erzina, kad kiekvieną vakarą tenka išeiti uždegti žvakės. Ir aš
Įsižiebkite šviesos diodus naudodami televizoriaus nuotolinio valdymo pultą: 3 žingsniai
Įsižiebkite šviesos diodus naudodami televizoriaus nuotolinio valdymo pultą: Šiame projekte mes galime užsidegti šviesos diodus naudodami mūsų televizoriaus nuotolinio valdymo pultą arba bet kurį nuotolinio valdymo pultą. Tokiu būdu, kaip tai darome naudodami nuotolinio valdymo pultą, šis IR signalas turi unikalų kodą, šį unikalų kodą gauna IR imtuvas ir ką nors darykite šiuo atveju
Patraukite šviesos ir šviesos modulį naudodami „Neopixel“ir ištraukimo jungiklį: 6 žingsniai (su paveikslėliais)
Traukite šviesą - šviesos modulį naudodami „Neopixel“ir „Pull Up Switch“: „Arduino Uno“šviesos modulio savybės ir aparatūra & gaubtas pirktas iš interneto Neopixel & Maitinimo šaltinis pasiskolintas iš Informatikos mokyklos & Produkto dizainas Šviesos modulis, valdomas maitinimo šaltiniu Visos funkcijos valdomos per
Perjunkite RGB šviesos diodą per spalvų spektrą naudodami „Raspberry Pi 2“ir „Scratch“: 11 žingsnių
Perjunkite RGB šviesos diodą per spalvų spektrą naudodami „Raspberry Pi 2“ir „Scratch“: atnaujinimo pastabos, 2016 m. Vasario 25 d.: Patobulinau „Scratch“programą ir pertvarkiau savo nurodymus. Sveiki, vaikinai, su šiuo projektu norėjau naudoti „Scratch“, kad galėčiau perjungti RGB šviesos diodą per spalvų spektrą. Yra daugybė projektų, kurie tai daro su
Šviesos diodo išjungimas ir išjungimas: 3 žingsniai
Šviesos diodo išjungimas ir išjungimas: Šie veiksmai yra eksperimentai, parodantys, kaip veikia šviesos diodai. Jie iliustruoja, kaip apšviesti šviesos diodą tolygiu greičiu ir kaip jį užgesinti ir užgesinti. Jums reikės: „Arduino“(aš naudojau duetą) „Breadboard“5 mm raudonos spalvos LED 330 Ω Priešintis